.NetCore项目在Linux中使用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进行托管就可以了。
才疏学浅,相关文档等仅供自我总结,如有相关问题可留言交流谢谢。