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=".logsstdout" />
  </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=".logsstdout" />
  </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 模块版本中,使用小时数、分钟数和秒数指定 requestTimeout

00:02:00
shutdownTimeLimit

可选的整数属性。

检测到 app_offline.htm 文件时,模块等待可执行文件正常关闭的持续时间(以秒为单位)。

10
startupTimeLimit

可选的整数属性。

模块等待可执行文件启动端口上侦听的进程的持续时间(以秒为单位)。 如果超出了此时间限制,模块将终止该进程。 模块在收到新请求时尝试重新启动该进程,并在收到后续传入请求时继续尝试重新启动该进程,除非应用在上一回滚分钟内无法启动 rapidFailsPerMinute 次。

120
stdoutLogEnabled

可选布尔属性。

如果为 true,processPath 中指定的 进程的 stdout 和 stderr 将重定向到 stdoutLogFile 中指定的文件。

false
stdoutLogFile

可选的字符串属性。

指定在其中记录 processPath 中指定进程的 stdout 和 stderr 的相对路径或绝对路径。 相对路径与站点根目录相对。 以 . 开头的任何路径均与站点根目录相对,所有其他路径被视为绝对路径。 路径中提供的任何文件夹都必须存在,以便模块创建日志文件。 使用下划线分隔符,将时间戳、进程 ID 和文件扩展名 (.log) 添加到 stdoutLogFile 路径的最后一段。 如果 .logsstdout 作为值提供,则在示例 stdout 日志使用进程 ID 1934 于 2018 年 2 月 5 日 19:41:32 保存时,将在 logs 文件夹中保存为 stdout_20180205194132_1934.log。

aspnetcore-stdout

 ②设置环境变量

<aspNetCore processPath="dotnet"
      arguments=".MyApp.dll"
      stdoutLogEnabled="false"
      stdoutLogFile="\?\%home%LogFilesstdout">
  <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;
    }
原文地址:https://www.cnblogs.com/zd1994/p/9140084.html