Supervisor
# Supervisor基本概述
# 什么是supervisor
supervisor
是一个进程管理服务,主要用来将运行在前台的进程转为后台运行,并实时监控进程的状态,当出现异常时会自动将该进程拉起。
# 为什么要使用supervisor
其实在我们维护的Linux服务中,有不少程序没有启停脚本,并且还是前台运行,比如Python程序。当然熟悉Linux的朋友会考虑使用&
符号、或screen
,将其转为后台进程。但这些方式仅仅只是将进程放置后台,当我们想要重启服务时,需要先kill
进程、然后在挂后台,比较复杂。而Supervisor
则不同,它能实现:
- 将前台运行进程转为后台进程;
- 监控进程运行情况,如果进程异常退出,会自动重新启动进程;
- 能对服务进行启动、重启、关闭等便捷的操作;
- 提供web界面,便于开发人员使用;
# Supervisor基础组件
supervisord
- 主进程,负责管理进程的服务,对crash的进程重启,对进程变化发送事件通知等。
supervisorctl
- 命令行管理工具,可以利用它来查看被管理的进程状态,启动停止/重启进程,获取running子进程的列表等;
supervisorctl
不仅可以连接到本机上的supervisord
,还可以连接到远程的supervisord
,当然在本机上面是通过UNIX socket
连接的,远程是通过TCP socket
连接的;supervisorctl
和supervisord
之间的通信,是通过xml_rpc
完成的;
Web Server
supervisor
提供了web server
功能,可通过web
控制进程(需要设置[inet_http_server]
配置项)。
XML-RPC Interface
- 远程调用服务,通过HTTP协议提供的Web服务,用来控制supervisor以及supervisor运行的进程。
# Supervisor安装配置
# Supervisor安装
[root@web ~]# yum install supervisor -y
[root@web ~]# systemctl enable supervisord
[root@web ~]# systemctl start supervisord
1
2
3
2
3
# Supervisor配置
Supervisor配置文件
[unix_http_server]
[unix_http_server] file=/var/run/supervisor/supervisor.sock ;# supervisorctll与supervisor通讯方式 ;chmod=0780 ; # socket文件的权限,默认0700 ;chown=nobody:nogroup ; # socket文件的属主与属组 ;username=user ; # 使用supervisorctl连接时,认证的用户(非必选) ;password=123 ; # 使用supervisorctl连接时,认证的密码(非必选)
1
2
3
4
5
6Supervisor配置文件
[inet_http_server]
;[inet_http_server] ; # 监听在TCP协议,webServer需要使用,远程连接也需要使用 ;port=127.0.0.1:9001 ; # 访问webServer时使用的地址、端口 ;username=user ; # 访问webServer的用户名称 ;password=123 ; # 访问webServer的用户名称
1
2
3
4Supervisor配置文件
[supervisord]
[supervisord] ; # 这个主要是定义supervisord这个服务端进程的一些参数的 logfile=/var/log/supervisor/supervisord.log ; # supervisord进程日志 logfile_maxbytes=50MB ; # 默认日志存储50m,会进行自动切割 logfile_backups=10 ; # 日志文件数量,程序启动会创建10个backup文件,用于log rotate loglevel=info ; # 日志级别,默认info,(debug,warn,trace) pidfile=/var/run/supervisord.pid ; # supervisord pid文件 nodaemon=false ; # 默认守护进程运行,true则supervisord前台运行 minfds=1024 ; # 系统最少空闲的文件描述符,低于这个值supervisor将不会启动 minprocs=200 ; # 进程最小可用文件描述符,低于这个值supervisor将不会正常启动 ;umask=022 ; # 进程创建文件的掩码,默认umask 022 ;user=chrism ; # 设置一个普通用户,后期可以通过该普通用户对supervisord进行管理 ;identifier=supervisor ; # supervisord的标识,如果有多个则需要设置不同的标识 ;directory=/tmp ; # 启动supervisord进程之前,会切换到该目录(可不配置) ;nocleanup=true ; # false会在进程启动时,将以前子进程产生的日志文件(路径为AUTO)清除掉。 ;childlogdir=/tmp ; # 当子进程日志路径为AUTO时,子进程日志文件存储至/tmp ;environment=KEY=value ; # 设定环境变量,子配置文件会继承主进程定义的环境变量 ;strip_ansi=false ; # true会清除子进程日志中的所有ANSI序列。也就是日志中的\n,\t默认为false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Supervisor配置文件
[supervisorctl]
[supervisorctl] ; # 这个主要是supervisorctl的一些配置 serverurl-unix:///var/run/supervisor/supervisor.sock; # 本地UNIX socket路径,注意和前面对应 ;serverurl=http://127.0.0.1:9001 ; # supervisorctl的WebServer连接地址 ;username=chris ; # WebServer设定的用户名称 ;password=123 ; # WebServer设定的密码 ;prompt=mysupervisor ; # 输入用户名密码时候的提示符,默认supervisor ;history_file=~/.sc_history ; # 历史记录,通过该文件查找历史记录
1
2
3
4
5
6
7Supervisor配置文件
[program]
;[program:theprogramname] ; # program是要被管理的进程,填写相应进程名称即可 ;command=/bin/cat ; # 启动进程的命令路径,可以携带参数 ;process_name=%(program_name)s ; # 进程名称,默认获取program设定的名称 ;numprocs=1 ; # 启动进程的数量 ;directory=/tmp ; # 运行进程会切换到该目录 ;umask=022 ; # 进程掩码,默认None ;priority=999 ; # 子进程启动和关闭的优先级,优先级低先启动,关闭时最后关闭 ;autostart=true ; # 启动supervisord后启动被管理的子进程 ;autorestart=true ; # 当子进程挂掉后会自动重启 ;startsecs=10 ; # 子进程启动后多少秒,则认为成功启动 ;startretries=3 ; # 子进程启动失败,最大尝试启动的次数 ;exitcodes=0,2 ; # 定义退出的状态码、0或2 ;stopsignal=QUIT ; # 进程停止信号、默认TERM ;stopwaitsecs=10 ; # 向子进程发送stopsignal信号,如果超过等待时间,则强制kill子进程。 ;user=chrism ; # 设置非root用户管理该program ;redirect_stderr=true ; # 如果为true,则stderr的日志会被写入stdout日志文件中默认为false ;stdout_logfile=/a/path ; # 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。 ;stdout_logfile_maxbytes=1MB ; # 日志文件最大大小,默认为50M ;stdout_logfile_backups=10 ; # ;stdout_capture_maxbytes=1MB ; # ;stdout_events_enabled=false ; # ;stderr_logfile=/a/path ; # 这个东西是设置stderr写的日志路径 ;stderr_logfile_maxbytes=1MB ; # 错误日志文件最大大小,默认为50M ;stderr_logfile_backups=10 ; # 错误日志文件数量 ;stderr_capture_maxbytes=1MB ; # ;environment=A=1,B=2 ; # 该子进程的环境变量,和别的子进程不进行共享 ;serverurl=AUTO ; # override serverurl computation(childutils) ;stopasgroup=true ; # 默认为false,配合killasgroup使用 ;killasgroup=true ; # 父进程在接收到stop信号后,会把该信号传递给子进程,以免产生孤儿进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29Supervisor配置文件
[group]
,[include]
;[group:thegroupname] ; # 为programs分组,方便进行统一操作 ;programs=progname1,progname2 ; # 组的成员进程,用逗号分开 ;priority=999 ; # 优先级 [include] files = supervisord.d/*.ini ; # 包含supervisord.d目录下的所有.ini文件
1
2
3
4
5
6
# Supervisor管理后台程序
# Supervisor管理fastapi项目
安装
python
并准备fastapi
项目[root@web data]# yum install python3 -y [root@web data]# git clone https://gitee.com/birenchong/fastapi_api.git 正克隆到 'fastapi_api'...
1
2
3创建虚拟环境
[root@web data]# cd fastapi_api/ [root@web fastapi_api]# python3 -m venv fastapi_env
1
2激活虚拟环境,安装
pip
包,手动运行测试服务是否正常# 激活虚拟环境 [root@web fastapi_api]# . fastapi_env/bin/activate # 更新pip (fastapi_env) [root@web fastapi_api]# pip3 install --upgrade pip # 安装pip包 (fastapi_env) [root@web fastapi_api]# pip3 install -r requirements.txt # 手动运行 (fastapi_env) [root@web fastapi_api]# uvicorn app.main:app --host '0.0.0.0'
1
2
3
4
5
6
7
8编写
Supervisor
管理fastapi
的配置文件[root@web ~]# cat /etc/supervisord.d/fastapi.ini [fcgi-program:fastapi] socket=unix:///data/fastapi_api/fastapi_api.sock directory=/data/fastapi_api command=/data/fastapi_api/fastapi_env/bin/uvicorn --fd 0 app.main:app numprocs=4 process_name=fastapi-%(process_num)d autostart=true autorestart=true stdout_logfile=/var/log/fastapi_stdout.log stderr_logfile=/var/log/fastapi_stderr.log user=root stopsignal=TERM startsecs=5 startretries=3 stopasgroup=true killasgroup=true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17启动
[root@web ~]# supervisorctl update # 一定要先更新 [root@web ~]# supervisorctl start fastapi:* [root@web ~]# supervisorctl stop fastapi:* [root@web ~]# supervisorctl restart fastapi:* [root@web ~]# supervisorctl status fastapi:*
1
2
3
4
5配置nginx反向代理
server{ listen 8000; location / { proxy_pass http://unix:/data/fastapi_api/fastapi_api.sock; } }
1
2
3
4
5
6
# Supervisor管理Java
安装ava环境
[root@web ~]# yum install java -y
1手动启动java项目测试
[root@web ~]# java -jar dingding-sonar-1.0-SNAPSHOT.jar --server.port=8082
1编写Supervisor管理Java的ini配置文件,进行自动化管理
[root@web ~]# cat /etc/supervisord.d/sonar_dingding.ini [program:sonar-dingding] directory=/opt command=/bin/bash -c "java -jar dingding-sonar-1.0-SNAPSHOT.jar --server.port=8082" autostart=true autorestart=true stderr_logfile=/var/log/sonar_dingding_stderr.log stdout_logfile=/var/log/sonar_dingding_stdout.log user=root stopsignal=QUIT startsecs=10 startretries=5 stopasgroup=true killasgroup=true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Supervisor Web页面
编辑supervisor主配置文件
[inet_http_server] port=0.0.0.0:9001 username=bi password=123
1
2
3
4通过浏览器访问9001端口
Last Updated: 2021/11/25, 10:57:04