首页 > 技术文章 > .NetCore项目在Linux中使用Supervisor托管详解

mzflog 2021-02-28 15:31 原文

本文实例环境及版本 Centos7 、NetCore 3.1、Supervisor 4.2.1
前置条件需安装好.NetCore的SDK等,网上有相关实例也可以转到我整理的文档  https://www.cnblogs.com/mzflog/p/14456929.html
 
Supervisor简介
Supervisor官网地址:http://supervisord.org/
源码位置:https://github.com/Supervisor/supervisor
Supervisor 是一个用Python2开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台守护进程daemon,并监控进程状态,异常退出时能自动重启。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor同时启动所有应用程序而不是一个一个地敲命令启动。Supervisor是一款Linux下的进程管理软件,最主要的两个功能是:
1、将非daemon程序变成deamon方式运行,对于daemon程序则不能监控。
2、对程序进行监控,当程序退出时,可以自动拉起程序。
本质上是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
Supervisor不支持任何版本的 Window 系统,看相关资料现在已经支持Python3了。不过此处还是以Python2为例。
 
相关名词解释
supervisor:要安装的软件的名称。
supervisord:装好supervisor软件后,supervisord用于启动supervisor服务。
supervisorctl:用于管理supervisor配置文件中program和supervisor服务本身。
 
Supervisor的安装及相关配置
1、安装python依赖
yum install python-setuptools

2、安装Supervisor

easy_install supervisor

 supervisord -v   #查看安装的supervisor版本 默认安装最新版本

 3、新建相关配置

新建一个文件夹如:/etc/supervisor

然后初始化Supervisor的配置模版

echo_supervisord_conf > /etc/supervisor/supervisord.conf

打开supervisord.conf之后把最后两行

;[include]

;files = relative/directory/*.ini #

改为

[include]

files = conf/*.conf

;为注释把注释去掉

此处为读取项目配置文件的路径,该处设置为当前目录下/etc/supervisor/conf 下的.conf文件。

如果要开启Supervisor的web管理界面,配置如下

[inet_http_server]         ; inet (TCP) server disabled by default
port=192.168.17.121:9001        ; ip_address:port specifier, *:port for all iface
username=user              ; default is no username (open server)
password=123               ; default is no password (open server)

port=改为服务器的IP 默认端口号为9001 ,记得需要开启9001端口号。

firewall-cmd --zone=public --add-port=9001/tcp --permanent  #打开9001端口
firewall-cmd --reload   #重启防火墙
firewall-cmd --zone=public --list-ports   #查看所开放的端口号

username和password为登录web页面时的用户名和密码

然后重新加载刷新下配置

supervisorctl reload

可通过IP:9001访问superisor的web页面了,可通过改web针对管理的项目进程刷新、停止、查看日志等。

 

4、通过VS新建NetCore3.1项目如 Mzpro并配置端口号为 5011,生成发布后上传至服务器的指定文件夹中如:/data/Appcode/mzpro 下。

然后在 /etc/supervisor 目录下新建conf文件夹,然后创建一个项目的配置文件如:mzpro.conf 然后写入如下配置(注意更换成自己项目的执行文件和名称/目录,还有要运行的环境等)如果有多个项目,创建多个.conf配置文件并开放对应端口,把项目发布文件上传至指定目录下修改新建的.conf文件配置即可。

[program:Mzpro]  #守护程序进程(项目名称即可)的名称
command=dotnet Mzpro.dll  #要执行的命令
directory=/data/Appcode/mzpro/  #命令执行的目录
#程序运行的环境变量 程序根据此变量来判断运行在哪个环境里(如开发Development、正式Production) 然后读取不同的配置文件appsettings.json
environment=ASPNETCORE_ENVIRONMENT=Production
user=root   #进程执行的用户身份
stopsignal=INT   #进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号。默认为TERM
autostart=true   #是否自动启动。如果是true的话,子进程将在supervisord启动后被自动启动
autorestart=true   #是否自动重启。有三个选项,false、unexpected和true
startsecs=1   #自动重启间隔
stopasgroup=true   #用于supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的整个进程组都干掉
killasgroup=true   #这个和上面的stopasgroup类似,不过发送的是kill信号
stderr_logfile=/var/log/mzpro.err.log   #标准错误日志 指定的路径下文件夹一定要存在
stdout_logfile=/var/log/mzpro.out.log   #标准输出日志 指定的路径下文件夹一定要存在


#其他参数说明 一般上面的配置就足够了
umask=022   #进程掩码,默认none,非必须
priority=999   #子进程的启动和关闭优先级, 优先级低的最先启动,关闭的时候最后关闭。默认999非必须
startretries=3   #当进程启动失败后,最大尝试启动的次数。默认3 非必须
stdout_logfile_maxbytes=1MB   #日志文件最大大小,和[supervisord]中定义的一样。默认为50

注意正式使用时要去掉 # 后面的注释信息切记。

 刷新并启动Supervisor
#Supervisor相关操作 刷新配置信息等
supervisord -c /etc/supervisor/supervisord.conf
#单纯启动Supervisor
supervisord  或 systemctl start supervisord
#启动supervisor服务
service supervisord start

即可通过服务器IP+端口号5011 访问我们的项目了。

 

 

 Supervisor的相关命令

#Supervisor相关操作 刷新配置信息等
supervisord -c /etc/supervisor/supervisord.conf
#单纯启动Supervisor
supervisord  或 systemctl start supervisord
#启动supervisor服务
service supervisord start
#关闭Supervisor
supervisorctl shutdown
#关闭supervisor服务
service supervisord stop
#查看所有守护的任务状态
supervisorctl status
#重新加载supervisor 
supervisorctl reload
#启动所有守护进程(如果要操作某一个 后面加进程名即可)
supervisorctl start all
#重启所有
supervisorctl restart all
#停掉所有守护进程(如果要操作某一个 后面加进程名即可)
supervisorctl stop all
#卸载supervisor
yum -y remove supervisor


#如果只是修改和操作我们自己定义的conf文件那么只需要进入supervisor的控制台supervisorctl
#如果要重新读取配置  
reread #更新配置
update #开始所有配置
start all #查看所有守护进程的状态
status #Control
+c退出supervisor控制台

至此我们关于Supervisor的项目安装及配置既可以了。

设置Supervisor开机启动

进入/lib/systemd/system目录(或/etc/systemd/system  或/usr/lib/systemd/system/),并创建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=10s 
[Install] 
WantedBy=multi‐user.target

保存文件后

# 设定开机启动 
systemctl enable supervisord  #注意此处要和supervisord.service 文件名相同
# 验证是否为开机启动 
systemctl is‐enabled supervisord
#取消supervisor开机启动
#systemctl disable supervisord

重启服务器后验证Supervisor是否正常启动即可。至此关于NetCore使用Supervisor进行托管就可以了。

才疏学浅,相关文档等仅供自我总结,如有相关问题可留言交流谢谢。

 
 

推荐阅读