五、配置Supervisor守护服务:
为什么要配置Supervisor:
使用Linux部署过ASP.NET Core应用程序的小伙伴都清楚,我们在部署项目都是通过Shell进行项目启动运行的。有时候我们会发现当我们关闭了Shell后,应用程序会立马宕机无法访问,需要我们重新进入服务器连接Shell输入dot命令重启应用程序。在生成环境中对于这种没有对应用程序进行任何的守护和监听的部署是非常的糟糕的,因此我们需要守护服务或者容器(推荐使用Docker)来对应用程序进行监听保护作用,当监听到应用进程停止,Supervisor会自动重启该应用程序。
Supervisor简单概述:
首先简单了解下Supervisor, Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
安装Supervisor:
yum install python-setuptools easy_install supervisor
配置Supervisor
//新建指定目录,为了避免默认配置会在某些更新覆盖掉 mkdir /etc/supervisor //这里是在新建好的目录新建conf文件,这里关键。默认文件会建立在/etc目录下 echo_supervisord_conf > /etc/supervisor/supervisord.conf
新建成功如下图所示:
打开supervisord.conf,要将文件的结尾部分替换掉以便后面能读取到我们的配置文件
打开supervisord.conf配置文件:
vim supervisord.conf
在文件的结尾找到以下配置代码:
;[include]<br>;files = relative/directory/*.ini
将代码替换为如下,注意前后不能带 ;和空格符号
[include]
files = conf.d/*.conf
配置对ASP.NET Core应用的守护:
进入目录 /etc/supervisor/ 新建 conf.d文件夹:
mkdir conf.d
在【/etc/supervisor/conf.d/】目录下新建一个AspNetCoreWebApi.conf配置文件:
vim AspNetCoreWebApi.conf
直接复制以下内容:
[program:AspNetCoreWebApi]
command=dotnet FirstCore.dll;
directory=/root/MyDotNetApplication/;
autorestart=true;
stderr_logfile=/var/log/AspNetCoreWebApi.err.log;
stdout_logfile=/var/log/AspNetCoreWebApi.out.log;
environment=ASPNETCORE_ENVIRONMENT=Production;
user=root;
stopsignal=INT;
配置说明:
[program:AspNetCoreWebApi] command=dotnet FirstCore.dll; 运行程序的命令 directory=/root/MyDotNetApplication/; 命令执行的目录 autorestart=true; 程序意外退出是否自动重启 stderr_logfile=/var/log/AspNetCoreWebApi.err.log;错误日志文件 stdout_logfile=/var/log/AspNetCoreWebApi.out.log;输出日志文件 environment=ASPNETCORE_ENVIRONMENT=Production;进程环境变量 user=root;进程执行的用户身份 stopsignal=INT
注意:如果服务已启动,修改配置文件可用“supervisorctl reload”命令来使其生效。
运行supervisord,查看是否生效,命令如下:
supervisord -c /etc/supervisor/supervisord.conf ps -ef | grep AspNetCoreWebApi //AspNetCoreWebApi是上面配置的program名称:[program:AspNetCoreWebApi]
配置Supervisor开机启动
新建一个“supervisord.service”文件
[Unit] Description=Supervisor daemon [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
将supervisord.service文件拷贝至:
/usr/lib/systemd/system/ #系统目录下
执行命令:systemctl enable supervisord #激活开机启动命令
执行命令:systemctl is-enabled supervisord #来验证是否为开机启动
下面是一些常用的 Supervisor 的命令 (参考https://segmentfault.com/a/1190000003955182):
命令 | 说明 |
supervisord | 初始启动Supervisord,启动、管理配置中设置的进程 |
supervisorctl stop myproject | 停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值,这个示例就是chatdemon |
supervisorctl start myproject | 启动某个进程 |
supervisorctl restart myproject | 重启某个进程 |
supervisorctl stop groupworker | 重启所有属于名为groupworker这个分组的进程(start,restart同理) |
supervisorctl stop all | 停止全部进程,注:start、restart、stop都不会载入最新的配置文件 |
supervisorctl reload | 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程 |
supervisorctl update | 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。注意:显示用stop停止掉的进程,用reload或者update都不会自动重启 |