supervisor
是什么:
- Supervisor 是一个用 Python 编写的进程监控工具,它可以帮助用户管理、监控和控制各种进程。通过 Supervisor,用户可以轻松地启动、停止、重启和管理多个进程,并在这些进程意外终止时进行自动恢复。Supervisor 提供了一个便捷的方式来管理系统中运行的各种任务和服务,确保它们始终处于可靠的状态。
作用:
- 进程监控:监控各个进程的状态,并在需要时进行重启。
- 进程控制:启动、停止、重启单个或多个进程。
- 日志管理:记录各个进程的输出日志,方便用户查看和分析。
- 配置管理:通过配置文件定义需要监控的进程及相关参数。
- Web 界面:提供 Web 界面来方便用户查看和管理进程状态。
场景:
- 在 Web 服务器(如 Nginx、Apache)或应用服务器(如 Gunicorn、Unicorn)崩溃时,Supervisor 可以自动重启它们,在高并发请求时,可以使用它进行管理多个进程实例,提高性能
- 管理一些比如,队列进程,redis queue工作进程,使后台更为稳定,定期执行的批量任务可以使用它进行管理,实现任务失败,重新执行。
- 确保 Redis 或 Memcached 等缓存服务始终运行,并在意外停止时自动重启,管理数据库代理服务,如 PgBouncer 或 HAProxy,确保数据库连接的稳定性。
- 对jenkins和gitlab 进行管理保证构建与部署管道正常,监控工具,zabbix或者prometheus或者是日志收集工具(如 Fluentd、Logstash)确保监控工具与日志收集工具正常运行。
- 可以管理单个容器的多个进程,在某个条件下,一个容器可以用多个进程,那使用它就可以管理这个进程,在复杂的 Docker Compose 配置中,Supervisor 可以帮助管理多个容器内进程,简化运维操作。
- 服务发现和注册 确保微服务注册工具(如 Consul、Eureka)始终运行,保障服务发现功能的稳定性,管理 API 网关(如 Kong、Traefik),确保请求路由和负载均衡的可靠性。
- 本地开发过程中,使用 Supervisor 管理开发服务器和相关服务,简化启动和管理。在自动化测试环境中,确保各个测试服务始终处于运行状态。
1.安装
# 官方文档:
https://supervisord.org/configuration.html
yum install supervisor # centos
apt install supervisor # ubuntu
# 命令行工具
/usr/bin/supervisorctl
# 启动程序。如果使用yum或者apt等方式安装均可以使用systemctl管理工具管理
/usr/bin/supervisord
/etc/supervisord.conf # 它的配置文件,可以进行,/etc/supervisord/supervisord.conf
/etc/supervisord.d/ # 自配置文件所在的位置,将管理进程的文件在这里
systemctl enable supervisor # 设置开机自启
systemctl start supervisor # 启动
supervisord -c /etc/supervisor/supervisord.conf -n # 调试模式
2.配置说明
# 套接字的配置区域
[unix_http_server]
file=/tmp/supervisor.sock # socker文件所在位置
chmod=0700 # socker文件默认权限
chown=nobody:nogroup # socker使用的用户组与用户
# 仅适用于通过 Unix 套接字 进行通信的客户端,与inet_http_server字段参数不是同一个
username=user
password=123
# 网络服务器web端
[inet_http_server]
port=127.0.0.1:9001 # 端口地址
# 适用于通过 网络(TCP/IP) 连接的客户端
username=user
password=123
# supervisor服务端配置
[supervisord]
# 日志相关配置
logfile=/var/log/supervisor/supervisord.log # 日志所在位置
logfile_maxbytes=50MB # 日志最大50MB,到达后进行产生新的日志文件
logfile_backups=10 # 保存的备份数量
loglevel=info # 日志的级别 critical 、 error 、 warn 、 info 、 debug 、 trace
silent=false # 控制日志的输出方式,true不将输出到控制台或者日志文件,false日志信息输出到控制台或日志文件中
strip_ansi=false # 控制是否从子进程的日志输出中去除 ANSI 转义码。
# 进程相关配置
pidfile=/var/run/supervisord.pid # pid所在的文件
umask=022 # 进程文件创建的遮罩码
nodaemon=false # 进程的运行方式,是前台还是后台(docker需要前台)
identifier=supervisor # 该管理进程的标识符字符串,由 RPC 接口使用,通过标识符号进行区分操作的实例。
directory=/tmp # 指定 Supervisor 或程序运行时的工作目录。
childlogdir=/tmp # 指定子进程的日志文件存放目录。
nocleanup=true # 指示 Supervisor 是否在启动时清理其子进程的日志文件。
# 文件相关
minfds=1024 # 使用最小的文件描述符数量
minprocs=200 # 进程描述符的最小数量
# 环境变量
environment=KEY1="value1",KEY2="value2" # 为程序设置环境变量,启动进程时传递特定环境变量
# 用户相关
user=chrism # 以哪个用户来管理supervisor的子进程
# 注意:
修改为普通用户的情况下,需要修改日志的访问权限,socket访问权限,配置文件的访问权限,不然无法启动。
一般报错:权限不足或者是无法打开HTTP服务器:socket.Error报告错误都是权限的问题。
# supervisorctl命令行工具配置
[supervisorctl]
# 链接方式
serverurl=unix:///var/run/supervisor/supervisor.sock # 链接socket文件
serverurl=http://127.0.0.1:9001 # 或者连接的web端地址
# 链接的账户密码
username=chris # 使用它们的账户
password=123 # 使用它们设置及密码
prompt=mysupervisor # 用作supervisorctl提示符的字符串。
history_file=~/.sc_history # 记录你输入的supervisorctl命令记录保存路径
[include]
files = supervisord.d/*.conf # 读取设置应用管程序配置文件,可以添加多个用空格分开
3.应用程序配置
# 需要再指定的 include 设置的目录下创建应用程序目录 *.ini
# 每个需要由 Supervisor 管理的程序在配置文件中都有一个 [program:x] 段,其中 x 是该程序的名称
[program:myprogram] # 管理程序的关键字[program:管理程序的名称]
command=/path/to/my/program --arg=value ; 启动命令
process_name=%(program_name)s ; 进程名称
numprocs=1 ; 启动进程数量
directory=/path/to/working/dir ; 工作目录
autostart=true ; 自动启动
autorestart=true ; 自动重启
startsecs=10 ; 启动后等待时间(秒)
startretries=3 ; 启动失败重试次数
exitcodes=0,2 ; 正常退出返回码
stopsignal=TERM ; 停止信号
stopwaitsecs=10 ; 停止等待时间
user=myuser ; 运行用户
redirect_stderr=true ; 重定向 stderr 到 stdout
stdout_logfile=/var/log/myprogram.log ; stdout 日志文件
stdout_logfile_maxbytes=20MB ; stdout 日志文件最大尺寸
stdout_logfile_backups=10 ; stdout 日志文件保留数量
stderr_logfile=/var/log/myprogram_err.log ; stderr 日志文件
stderr_logfile_maxbytes=20MB ; stderr 日志文件最大尺寸
stderr_logfile_backups=10 ; stderr 日志文件保留数量
environment=A="1",B="2" ; 环境变量
priority=999 ; 启动优先级
3-1.管理一个flask配置
[program:flask]
command=/usr/bin/python2 /opt/app.py # 启动命令
autostart=true # 自动启动
autorestart=true # 自动重启
startsecs=5 # 启动后等待几秒
redirect_stderr=true # 重定向 stderr 到 stdout
stdout_logfile_maxbytes=20MB # 日志大小
stdout_logfile_backups=20 # 日志保存最大数量
stdout_logfile=/var/log/supervisor/flask.log # 日志存储的位置
3-2.管理一个nginx配置
[program:nginx]
command=/bin/nginx -g 'daemon off;' # 启动命令
autostart=true # 自动启动
autorestart=true # 自动重启
startsecs=5 # 启动后等待几秒
redirect_stderr=true # 重定向 stderr 到 stdout
stdout_logfile_maxbytes=20MB # 日志大小
stdout_logfile_backups=20 # 日志保存最大数量
stdout_logfile=/var/log/supervisor/nginx.log # 日志存储的位置
4.supervisorctl名称
# 注意:
如果使用supervisorctl管理命令需要配置对应的配置才能使用。
supervisorctl # 进入命令行交互界面,可直接输入子命令进行管理。
# 常用的命令
supervisorctl reload # 重新加载配置文件,并重启supervisord及所有自动启动的程序。
supervisorctl restart {PROGRAM< ...>}|all # 重启指定程序,all表示重启所有程序。
supervisorctl start {PROGRAM< ...>}|all # 启动指定程序,all表示启动所有程序。
supervisorctl status <{PROGRAM< ...>}|all # 看指定程序状态,如为all或不指定则查看所有程序状态。
supervisorctl stop {PROGRAM< ...>}|all # 停止指定程序,all表示停止所有程序。
supervisorctl update # 重新加载配置文件,并启动新配置指定的程序。
# 使用supervisor 管理进程,只能有supervisor来关闭,如果直接关闭管理的进程,时会被重启的
5.测试使用
5-1.编写脚本程序
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
return "测试测试...."
if __name__=="__main__":
app.run(host='0.0.0.0',port=8000)
5-2.supervisor修改配置
/etc/supervisor/supervisor.conf
# 添加配置
[inet_http_server]
port=:9001
username=user
password=123
[supervisorctl]
serverurl=http://127.0.0.1:9001
username=user
password=123
prompt=xxxxx
history_file=~/.sc_history
5-3.编写进程管理脚本配置
/etc/supervisor//conf.d/flask.conf
[program:flask]
command=/usr/bin/python3.12 /opt/app.py
autostart=true
autorestart=true
startsecs=5
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile=/var/log/supervisor/flask.log
5-4.启动程序查看
1.启动程序
sudo systemctl start supervisor # 启动
systemctl restart supervisor # 重启服务
supervisorctl reload # 重新读取配置文件
2.查看配置ui页面信息
192.168.85.135:9001
3.使用命令行进行查看
supervisorctl status
supervisorctl status flask
5-5.关停测试
1.关闭当前执行进程
supervisorctl status flask # 获取进程号
kill 1311
2.在进行查看
supervisorctl status flask