.NET Core项目部署到Linux(Centos7)(八)为.NET Core项目创建Supervisor进程守护监控
目录
1.前言
2.环境和软件的准备
3.创建.NET Core API项目
4.VMware Workstation虚拟机及Centos 7安装
5.Centos 7安装.NET Core环境
6.发布.NET Core项目到Linux
7.启动和停止.NET Core项目
8.为.NET Core项目创建Supervisor进程守护监控
9.防火墙配置,允许外网或局域网访问.NET Core站点
10.总结
1.Supervisor介绍
在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。
此处的创建守护进程,是指发布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主进程创建一个守护进程。在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。
原因有两点:
①、它是微软官方文档推荐的,降低学习成本。
②、它并不一定是最好的,但一定是文档最全的。
2.在Linux上安装Supervisor
#执行epel-release sudo yum -y install epel-release #安装Supervisor sudo yum -y install supervisor #通过配置文件来启动supervisor sudo supervisord -c /etc/supervisord.conf #启动supervisorctl sudo supervisorctl -c /etc/supervisord.conf #查看supervisor 版本 version
这里直接执行安装Supervisor,可能会出现没有可用软件包 supervisor,这个时候需要安装一个叫”epel-release”的软件包,这个软件包会自动配置yum的软件仓库
注意:需要执行supervisorctl,如果出现error: <class 'socket.error'>, [Errno 13] Permission denied: file: /usr/lib64/python2.7/socket.py line: 224的错误,需要先执行下面语句:
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl -c /etc/supervisord.conf
然后在去执行需要的操作,如下图:
3.创建.NET Core项目的Supervisor配置文件
#进入supervisord.d目录 cd /etc/supervisord.d #新建NetCore进程配置文件 sudo touch DemoNetCore.ini #查看和编辑DemoNetCore.ini配置文件 sudo vim DemoNetCore.ini #进入文件后,按“i”或者“a”进入插入模式,插入下面的配置信息
#配置程序名称 [program:DemoNetCore] #运行程序的命令 command=dotnet Demo.Net.Core.dll --urls="http://*:8081;http://*:8082" #命令执行的目录 directory=/var/www #进程环境变量 environment=ASPNETCORE_ENVIRONMENT=Production #进程执行的用户身份 user=demo #进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号默认为TERM 。当用设定的信号去干掉进程,退出码会被认为是expected,非必须设置 stopsignal=INT #如果是true的话,子进程将在supervisord启动后被自动启动,默认就是true,非必须设置 autostart=true #这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启 autorestart=true #这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了,默认值为1 。非必须设置 startsecs=1 #错误日志文件 stderr_logfile=/var/log/DemoNetCore.err.log #输出日志文件 stdout_logfile=/var/log/DemoNetCore.out.log
#按ESC,输入命令保存配置文件 :wq (保存编辑操作退出) :wq! (保存编辑强制退出) :w ! sudo tee %
注意:如果之前进入编辑文件没有在root或者sudo下,使用wq,将会提示只读,使用强制执行,使用wq!,将会提示E212:无法打开或写入文件,这个时候需要用到w ! sudo tee %这个命令,然后在q退出编辑
重新加载Supervisor配置,查看Supervisor运行的进程
#通过配置文件来启动supervisor sudo supervisord -c /etc/supervisord.conf #启动supervisorctl sudo supervisorctl -c /etc/supervisord.conf #重新加载配置文件 reload #查看运行的状态 status
下面我们来测试下站点是否运行正常
#查看相关进行 ps -aux | grep "Demo.Net.Core.dll" #访问启动的站点 curl http://localhost:8081/weatherforecast
如下图,Supervisor已经开启了Dotnet的进程,访问接口地址,返回数据成功
注意:这里有个问题就是,当Linux系统关机后,Supervisor可能不会自己开启,导致需要手动执行sudo supervisord -c /etc/supervisord.conf 命令之后,Dotnet进程才会自动启动,这样与我们需要达到的效果相差甚远,解决方法看下面第三步。
4.配置Supervisor开机自启动
#进入system目录 cd /usr/lib/systemd/system #编辑supervisord.service文件 sudo vim supervisord.service
supervisord.service文件内容如下
[Unit] Description=Process Monitoring and Control Daemon After=rc-local.service nss-user-lookup.target [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42 [Install] WantedBy=multi-user.target
编辑好后保存退出,然后执行命令,查看是否启动成功
#启动服务 systemctl enable supervisord #验证一下是否为开机启动 systemctl is-enabled supervisord
5.验证进程守护监控效果
直接干掉Dotnet进程,看看会不会自动启动
#查看dotnet进程 ps -aux|grep dotnet #强制杀死dotnet进程 kill -9 %PID #再次查看dotnet进程 ps -aux|grep dotnet
重启Linux,然后直接访问站点
6.Supervisor常用命令
# 启动所有
supervisorctl start all
# 重启所有
supervisorctl restart all
# 停止所有
supervisorctl stop all
#PS:要操作某个服务,把all换成服务名即可
#查看服务状态
supervisorctl status