一、课程介绍

在上一节课程《ASP.NET Core托管和部署Linux实操演练手册》中我们学过net core的部署方式多样性和灵活性。我们通过远程工具输入dotnet 程序集名称.dll的方式运行应用,但是一旦关闭远程shell会话,或者服务器重启,应用进程就结束了。因此我们需要一个守护进程来管理我们的dotnet 后台进程,当服务器启动的时候可以自动运行我们的net core web应用程序。

今天就跟大家分享一下如何将ASP.NET Core应用程序以生产环境的标准方式部署在CentOS7上。

如果您对本次分享课程《Linux+Nginx+Supervisor部署ASP.NET Core实操手册》感兴趣的话,那么请跟着阿笨一起学习吧。

废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运 !

Linux+Nginx+Supervisor部署ASP.NET Core实操手册_.net

微软高调示爱Linux


二、asp.net core为什么在Linux不用自宿主的方式进行部署?

自宿主的发布方式进行部署会简单很多,为什么生产环境要使用便携的方式进行发布呢?

原因1:性能比便携式的低(主)。

原因2:微软给出的建议(次)。

口说无凭,有图有真相。

Linux+Nginx+Supervisor部署ASP.NET Core实操手册_.net_02

Linux+Nginx+Supervisor部署ASP.NET Core实操手册_.net_03

参考地址:https://docs.microsoft.com/zh-cn/dotnet/articles/core/app-types

原因3:Kestrel 是 ASP.NET Core 项目模板中默认 Web 服务器.可以结合反向代理服务器一起使用,以便可以获取更多的安全性,负载均衡等能力。

因此,既然是用于生产环境的,当然我们要追求更高的性能。

三、CentOS7+Nginx+Supervisor部署ASP.NET Core实操手册

3.1、环境准备

服务器系统:CentOS 7

相关SSH工具:Xshel、Xftp或者SecureCRT、SecureFX

服务器软件软件:.netcore、nginx、supervisor

3.2、 Linux CentOS上安装Nginx以及配置开机启动服务

Nginx官网:

http://nginx.org/en/download.html

源码安装、yum安装和rpm安装的区别

1、yum安装可以看成是从网络在线安装的一种方式,只需要yum install 软件名,系统就自动根据yum源配置文件中的镜像位置去下载安装包了,并可以自动分析所需的软件依赖关系,自动安装所需的依赖软件包。此方式适合初学者,简单方便,不用考虑依赖关系。但有些软件并不能通过yum来安装。

2、而源码安装方式是需要自己到网上下载源码包,然后解压安装。此方式可以指定配置参数,更加灵活方便,兼容性更强。比较适合对Linux系统有较多了解的进阶用户使用。

3.2.1、通过rpm包方式安装nginx

Nginx官方提供了Yum源。
1、添加源默认情况Centos7中无Nginx的源,Nginx官网提供了Centos的源地址。
因此可以如下执行命令添加源:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 

2、安装Nginx通过yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。

sudo yum install -y nginx 

3、启动Nginx并设置开机自动运行(linux宕机、重启会自动运行nginx不需要连上去输入nginx启动命令)。

特别注意:

如果在centos7中是用yum 安装nginx,,默认是作为服务器开机自动启动的。可以查询服务是否开机启动 Nginx 查看 。

systemctl is-enabled nginx.service

将nginx设置为开机启动

sudo systemctl enable nginx.service 

sudo systemctl start nginx.service

# 查看状态
systemctl status nginx.service

 # 重新启动服务
systemctl restart nginx.service

Centos7 中Nginx的安装与配置

https://www.cnblogs.com/qmhuang/p/8194624.html

3.2.2、通过源码tar.gz安装包编译方式安装nginx

如果是通过源码编译的安装Nginx的话,则需要建立服务启动文件。

/lib/systemd/system/nginx.service 创建服务文件内容如下

#服务的说明

[Unit]

#描述服务

Description=nginx

#描述服务类别

After=network.target

#服务运行参数的设置 

[Service]

#Type=forking是后台运行的形式

Type=forking

#服务的具体运行命令

ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

#重启命令

ExecReload=/usr/local/nginx/sbin/nginx -s reload

#停止命令

ExecStop=/usr/local/nginx/sbin/nginx -s stop

#PrivateTmp=True表示给服务分配独立的临时空间

PrivateTmp=true

#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3 

[Install]

WantedBy=multi-user.target

# 启动nginx服务
systemctl enable nginx.service 
systemctl start nginx.service
systemctl status nginx.service# 查看状态
systemctl restart nginx.service# 重新启动服务
systemctl is-enabled supervisor.service #来验证是否为开机启动

firewall-cmd --add-port=5000/tcp //开启 5000端口
firewall-cmd --add-port=5001/tcp //开启 5001端口
 firewall-cmd --reload //重新加载配  

参考文章:

https://www.cnblogs.com/yanziwen/p/9206491.html

https://www.linuxidc.com/Linux/2017-10/147240.htm

https://www.cnblogs.com/zhangfeistudio/p/CentOS-xia-an-zhuangNginx-bing-an-zhuang-fu-wu-shi.html

3.3、通过supervisor守护进程设置dotnet core应用自动启动运行

supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

采用dotnet core自宿主方式运行目前存在三个问题

问题1:ASP.NET Core应用程序运行在shell之中,如果关闭shell则会发现ASP.NET Core应用被关闭,从而导致应用无法访问,这种情况当然是我们不想遇到的,而且生产环境对这种情况是零容忍的。

问题2:如果ASP.NET Core进程意外终止那么需要人为连进shell进行再次启动,往往这种操作都不够及时。

问题3:如果服务器宕机或需要重启我们则还是需要连入shell进行启动。

为了解决这个问题,我们需要有一个程序来监听ASP.NET Core 应用程序的状况。在应用程序停止运行的时候立即重新启动。这边我们用到了Supervisor这个工具,Supervisor使用Python开发的。

安装Supervisor
yum install python-setuptools
easy_install supervisor

配置Supervisor
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

[include]
files=/etc/supervisor/conf.d/*.conf

whereis supervisord查看安装文件路径

/usr/bin/supervisord

whereis supervisor 查看的配置文件目录

/etc/supervisor

相关命令:
supervisorctl restart <application name> #重启指定应用
supervisorctl stop <application name> #停止指定应用
supervisorctl start <application name> #启动指定应用
supervisorctl restart all #重启所有应用
supervisorctl stop all #停止所有应用
supervisorctl start all #启动所有应用 
supervisorctl status #查看所有任务状态
 supervisorctl shutdown #关闭所有任务

Supervisor创建自启动服务

/lib/systemd/system/supervisor.service 文件内容如下

[Unit]
Description=supervisor
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target

service supervisor stop 开启supervisor服务(或者:systemctl enable supervisor.service)

 service supervisor start 启动supervisor服务(或者: systemctl start supervisor.service )

service supervisor stop 停止supervisor服务(或者:systemctl stop supervisor.service)

 systemctl is-enabled supervisor.service #来验证是否为开机启动#

systemctl status supervisor.service # 查看supervisord服务状态

 ps -ef|grep supervisor.service # 查看是否存在supervisord进程

Supervisord-Monitor的web统一管理安装、配置、使用

supervisorctl使用通过supervisorctl对进程进行管理:supervisorctl help
Web管理:地址见配置文件http://localip:9001,可以进行进程的重启,日志查看等操作

web界面操作需要在supervisor的配置文件里添加[inet_http_server]选项组:
之后可以通过http://0.0.0.0:9001来访问控制子线程的管理。

firewall-cmd --add-port=9001/tcp //开启9001端口

firewall-cmd --reload //重新加载配 

参考文章:
https://www.cnblogs.com/ants/p/5732337.html
https://www.cnblogs.com/viter/p/10441409.html 
centos7下部署nginx+supervisor+netcore2.1服务器环境
 https://www.cnblogs.com/dfsk64/p/9204975.html 

解决unix:///tmp/supervisor.sock no such file的问题
https://www.cjango.com/d/46.html
http://www.cnblogs.com/gjack/p/8098758.html

四、总结

1、利用.net core runtime及.net core sdk,将编译好的项目,发布至服务器上,然后运行dotnet application.dll命令。

这样程序就运行起来,但是要想让.net core程序进程一直存在,就需要做其它方面的工作了,比如网上介绍的比较多的supervisor守护进程服务,这样可以保证.net core程序,在终端关闭后,仍然可以运行。解决方案有:

1、采用python开发的supervisor服务,来守护.net core进程。我们再安装一个web服务器,如nginx作为.net core程序的代理服务器。

2、利用跨平台服务器Jexus。

3、利用docker容器技术,让.net core程序运行在docker容器中。

最后送大家一句话:希望大家在.NET开发的学习道路上一直跟着阿笨坚持下去吧!