在上一节课程《ASP.NET Core托管和部署Linux实操演练手册》中我们学过net core的部署方式多样性和灵活性。我们通过远程工具输入dotnet 程序集名称.dll的方式运行应用,但是一旦关闭远程shell会话,或者服务器重启,应用进程就结束了。因此我们需要一个守护进程来管理我们的dotnet 后台进程,当服务器启动的时候可以自动运行我们的net core web应用程序。
今天就跟大家分享一下如何将ASP.NET Core应用程序以生产环境的标准方式部署在CentOS7上。
如果您对本次分享课程《Linux+Nginx+Supervisor部署ASP.NET Core实操手册》感兴趣的话,那么请跟着阿笨一起学习吧。
废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运 !
微软高调示爱Linux
二、asp.net core为什么在Linux不用自宿主的方式进行部署?
自宿主的发布方式进行部署会简单很多,为什么生产环境要使用便携的方式进行发布呢?
原因1:性能比便携式的低(主)。
原因2:微软给出的建议(次)。
口说无凭,有图有真相。
三、CentOS7+Nginx+Supervisor部署ASP.NET Core实操手册参考地址:https://docs.microsoft.com/zh-cn/dotnet/articles/core/app-types
原因3:Kestrel 是 ASP.NET Core 项目模板中默认 Web 服务器.可以结合反向代理服务器一起使用,以便可以获取更多的安全性,负载均衡等能力。
因此,既然是用于生产环境的,当然我们要追求更高的性能。
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.rpm2、安装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.serviceCentos7 中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/*.confwhereis 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.targetservice 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开发的学习道路上一直跟着阿笨坚持下去吧!