asp.net core 托管与部署
一、使用IIS在Windows上进行托管
1,部署asp.net core
①检查安装最新的SDK和运行时
https://www.microsoft.com/net/download/windows#/runtime
IIS需要跑asp.net core必须要安装Runtime
②执行 dotnet publish 命令发布程序
③IIS添加网站
④设置程序池
2, Asp.net Core 模块的配置
①web.config的配置
以下 web.config 文件发布用于依赖框架的部署,并配置 ASP.NET Core 模块以处理站点请求:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\MyApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /> </system.webServer> </configuration>
以下 web.config 发布用于独立部署:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath=".\MyApp.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /> </system.webServer> </configuration>
①aspNetCore 元素的属性
特性 | 描述 | 默认 |
---|---|---|
arguments |
可选的字符串属性。 processPath 中指定的可执行文件的参数。 |
|
disableStartUpErrorPage |
“true”或“false”。
如果为 true,将禁止显示“502.5 - 进程失败”页面,而会优先显示 web.config 中配置的 502 状态代码页面。 |
false |
forwardWindowsAuthToken |
“true”或“false”。
如果为 true,会将令牌作为每个请求的标头“MS-ASPNETCORE-WINAUTHTOKEN”,转发到在 %ASPNETCORE_PORT% 上侦听的子进程。 该进程负责在每个请求的此令牌上调用 CloseHandle。 |
true |
processPath |
必需的字符串属性。 为 HTTP 请求启动进程侦听的可执行文件的路径。 支持相对路径。 如果路径以 |
|
rapidFailsPerMinute |
可选的整数属性。 指定允许 processPath 中指定的进程每分钟崩溃的次数。 如果超出了此限制,模块将在剩余分钟数内停止启动该进程。 |
10 |
requestTimeout |
可选的 timespan 属性。 指定 ASP.NET Core 模块等待来自 %ASPNETCORE_PORT% 上侦听的进程的响应的持续时间。 在 ASP.NET Core 2.1 或更高版本附带的 ASP.NET Core 模块版本中,使用小时数、分钟数和秒数指定 |
00:02:00 |
shutdownTimeLimit |
可选的整数属性。 检测到 app_offline.htm 文件时,模块等待可执行文件正常关闭的持续时间(以秒为单位)。 |
10 |
startupTimeLimit |
可选的整数属性。 模块等待可执行文件启动端口上侦听的进程的持续时间(以秒为单位)。 如果超出了此时间限制,模块将终止该进程。 模块在收到新请求时尝试重新启动该进程,并在收到后续传入请求时继续尝试重新启动该进程,除非应用在上一回滚分钟内无法启动 rapidFailsPerMinute 次。 |
120 |
stdoutLogEnabled |
可选布尔属性。 如果为 true,processPath 中指定的 进程的 stdout 和 stderr 将重定向到 stdoutLogFile 中指定的文件。 |
false |
stdoutLogFile |
可选的字符串属性。 指定在其中记录 processPath 中指定进程的 stdout 和 stderr 的相对路径或绝对路径。 相对路径与站点根目录相对。 以 |
aspnetcore-stdout |
②设置环境变量
<aspNetCore processPath="dotnet" arguments=".\MyApp.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout"> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" /> <environmentVariable name="CONFIG_DIR" value="f:\application_config" /> </environmentVariables> </aspNetCore>
ASPNETCORE_ENVIRONMENT:设置环境
CONFIG_DIR:用户定义的环境变量的一个示例,其中开发人员已写入可在启动时读取值的代码以便形成用于加载应用配置文件的路径
在不可访问不受信任的网络(如 Internet)的暂存服务器和测试服务器上,仅将 ASPNETCORE_ENVIRONMENT
环境变量设置为 Development
。
3,app_offline.htm文件
将此文件放到程序根目录(不是wwwroot下的目录),存在 app_offline.htm 文件时,ASP.NET Core 模块会通过发送回 app_offline.htm 文件的内容来响应请求。 删除 app_offline.htm 文件后,下一个请求将启动应用
二、CentOS7部署asp.net core
1,安装Nginx
①添加Nginx存储库
要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release
如果出现以下错误:
解决方法,输入一下两个命令:
yum clean all
yum makecache
②安装Nginx
现在Nginx存储库已经安装在您的服务器上,使用以下yum
命令安装Nginx : sudo yum install nginx
在对提示回答yes后,Nginx将在服务器上完成安装
③启动Nginx
Nginx不会自行启动。要运行Nginx,请输入: sudo systemctl start nginx
如果您正在运行防火墙,请运行以下命令以允许HTTP和HTTPS通信:
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
④如果想在系统启动时启用Nginx。请输入以下命令:
sudo systemctl enable nginx
其他命令:
systemctl disable nginx #禁止开机启动
systemctl status nginx #查看运行状态
systemctl restart nginx #重启服务
nginx -s reload 重启nginx
2,安装asp.net core运行时
https://www.microsoft.com/net/download/linux-package-manager/centos/runtime-current
3,配置nginx设置反向代理
①修改配置文件 /etc/nginx/nginx.conf
server { listen 8054; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
修改完成之后执行 nginx -s reload 重启nginx
②由于SELinux保护机制所导致,我们需要将Nginx添加至SELinux的白名单,需要执行命令
yum install policycoreutils-python sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx sudo semodule -i mynginx.pp
③启动
第一步 dotnet <项目程序集dll>
第二步访问http://ip:8054就可以访问到网站了
4,Supervisor配置守护进程
使用Supervisor首先我们的asp.net core项目进程,实时监控进程状态,异常退出时能自动重启
①安装Supervisor
yum install python-setuptools
easy_install supervisor 请更换root
用户,执行如下命令安装Supervisor:
②配置Supervisor
运行supervisord
服务的时候,需要指定Supervisor配置文件,如果没有显示指定,默认会从以下目录中加载:
$CWD/supervisord.conf #$CWD表示运行supervisord程序的目录 $CWD/etc/supervisord.conf /etc/supervisord.conf /etc/supervisor/supervisord.conf (since Supervisor 3.3.0) ../etc/supervisord.conf (Relative to the executable) ../supervisord.conf (Relative to the executable)
所以先要创建一个supervisor目录 mkdir /etc/supervisor
③加载目录有了,然后通过echo_supervisord_conf
程序(用来生成初始配置文件)来初始化一个配置文件: echo_supervisord_conf > /etc/supervisor/supervisord.conf
④打开supervisord.conf
文件,需要修改底部的配置,改为:
[include]
files = conf.d/*.conf
把注释去除、设置/etc/supervisor/conf.d
为Supervisor进程配置文件加载目录
⑥创建进程配置加载目录: mkdir /etc/supervisor/conf.d
⑦在 /etc/supervisor/conf.d 目录下创建一个 netcore.conf 文件
⑧配置netcore.conf 文件
[program:SignalRDemo] ;自定义进程名称 command=dotnet SignalRDemo.dll ;程序启动命令 directory=/usr/share/nginx/publish ;命令执行的目录 autostart=true ;在Supervisord启动时,程序是否启动 autorestart=true ;程序退出后自动重启 startretries=5 ;启动失败自动重试次数,默认是3 startsecs=1 ;自动重启间隔 user=root ;设置启动进程的用户,默认是root priority=999 ;进程启动优先级,默认999,值小的优先启动 stderr_logfile=/var/log/SignalRDemo.log ;标准错误日志 stdout_logfile=/var/log/SignalRDemo.log ;标准输出日志 environment=ASPNETCORE_ENVIRONMENT=Production ;进程环境变量 stopsignal=INT ;请求停止时用来杀死程序的信号
⑨启动Supervisor服务,命令如下: supervisord -c /etc/supervisor/supervisord.conf
这时,在会发现我们部署的网站程序不在shell中通过dotnet xxx.dll
启动,同样可以访问。
⑩设置Supervisor开机启动
第一步:在 /usr/lib/systemd/system/ 目录下创建 supervisor.service 文件
supervisor.service 文件内容如下:
# supervisord service for systemd (CentOS 7.0+) # by ET-CS (https://github.com/ET-CS) [Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown ExecReload=/usr/bin/supervisorctl $OPTIONS reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
第二步:设置开机启动: systemctl enable supervisor
第三部:验证是否成功: systemctl is-enabled supervisor
如果输出enabled
则表示设置成功,也可重启服务器验证。
5,Supervisorctl管理进程
进入supervisorctl
交互终端: supervisorctl
输入help
查询帮助:
问题:1,"unix:///tmp/supervisor.sock no such file" 错误处理
6,Supervisorctl错误
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
StackOverflow http://serverfault.com/questions/114477/supervisor-http-server-port-issue
sudo unlink /tmp/supervisor.sock
sudo unlink /var/run/supervisor.sock
This .sock file is defined in /etc/supervisord.conf's [unix_http_server]'s file config value (default is /tmp/supervisor.sock or /var/run/supervisor.sock).
Hope this helps someone in the future.
6,nginx代理signalR站点
编辑/etc/nginx/nginx.conf文件
map $http_upgrade $connection_upgrade{ default upgrade; ‘’ close; } server { listen 8054; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }