Contents
9. Supervisor在DevOps中的应用¶
9.1. Supervisor的作用¶
Supervisor是Python编写的一个多进程管理工具。在shell下有个nohu命令能将程序放在后台执行,但是如果有很多重要的进程需要管理的话就不方便了。
而且当进程出现重启或者崩溃的时候,Supervisor能自动拉起程序。
我们可以使用Supervisor同时启动所有的程序而不是逐个地输入命令启动。
9.2. Supervisor安装¶
命令如下:
pip install supervisor
或者
yum -y install supervisor
初始化配置文件:
echo_supervisord_conf > supervisor.conf
9.3. Supervisor的配置文件说明¶
修改配置文件,在配置文件最底部添加相应配置,gunicorn程序启动的示例:
[include] 自己的项目配置
[program:project]
directory = /home/jerry/Code/project ; 程序的启动目录
command = /home/jerry/.virtualenvs/parsing/bin/gunicorn -w 4 -worker-class gevent -bind 0.0.0.0:9600 app:app ; 启动命令
numprocs=1 ; number of processes copies to start (def 1)
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 1 ; 启动 1 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 10 ; stdout 日志文件备份数
stdout_logfile=/home/jerry/Code/project/log/gunicorn.log ; log 日志
stderr_logfile=/home/jerry/Code/project/log/gunicorn.error ; 错误日志
编辑完之后保存,启动 supervisor。这里的启动命令和在命令行用 gunicorn 启动的命令是一致的,其中 -w 是指服务的进程数。
9.4. Supervisor的启动¶
supervisord -c /etc/supervisord.conf
#查看 supervisor 的状态
supervisorctl -c supervisor.conf status
#重新载入配置文件,每次修改之后记得重新载入
supervisorctl -c supervisor.conf reload
#启动指定/所有 supervisor 管理的程序进程
supervisorctl -c supervisor.conf start [all]|[appname]
#关闭指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname]
9.5. Supervisor管理4个redis实例¶
[program:redis_6376]
command=/usr/local/bin/redis-server /etc/redis_6376.conf
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
process_name=%(program_name)s
numprocs=l
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=true
[program:redis_6377]
command=/usr/local/bin/redis-server /etc/redis_6377.conf
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
process_name=%(program_name)s
numprocs=l
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=true
[program:redis_6378]
command=/usr/local/bin/redis-server /etc/redis_6378.conf
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
process_name=%(program_name)s
numprocs=l
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=true
[program:redis_6379]
command=/usr/local/bin/redis-server /etc/redis_6379.conf
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
process_name=%(program_name)s
numprocs=l
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=true
9.6. 使用Supervisord软件管理go服务进程¶
参考文献如下: 使用Supervisord软件管理go服务进程
9.7. Supervisor在Docker中的应用¶
9.7.1. 在Docker中使用Supervisor监控lamp进程。¶
·监控 apache2和mysql
$ cat /etc/supervisor/supervisord.conf
; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisor/conf.d/*.conf
$ ls /etc/supervisor/conf.d/
supervisord-apache2.conf supervisord-mysqld.conf
root@98643c960e69:/etc/supervisor/conf.d# cat supervisord-apache2.conf
[program:apache2]
command=/start-apache2.sh
numprocs=1
autostart=true
root@98643c960e69:/etc/supervisor/conf.d# cat supervisord-mysqld.conf
[program:mysqld]
command=/start-mysqld.sh
numprocs=1
autostart=true
autorestart=trueroot@98643c960e69:/etc/supervisor/conf.d# cat /start-apache2.sh
#!/bin/bash
source /etc/apache2/envvars
exec apache2 -D FOREGROUND
root@98643c960e69:/etc/supervisor/conf.d# cat /start-mysqld.sh
#!/bin/bash
exec mysqld_safe