使用supervisor
已经很长时间了, 发现这个软件真的是个好东西, 特别好用, 这里总结一下常见的用法.
一般服务器特别多的时候推荐使用系统的包管理工具来安装, 方便统一管理部署.(我这里统一采用centos7来举例, ubuntu的可能不太一样)
yum install supervisor -y
这块分为supervisord的配置文件和子进程的配置文件.
- supervisord配置文件
安装好supervisor以后, 系统会自动创建配置文件/etc/supervisord.conf
, 这里我就不全部贴出来了, 你可以登录服务器上看到. 这里有2处配置需要修改:
[supervisord]
minfds=65535 ;子进程默认的最大可用文件描述符个数, 默认1024, 对于大型应用来说肯定不够.
minprocs=20000 ; supervisor最大子进程个数, 如果supervisor要管理好多进程, 这个参数需要调高
- 子进程配置文件
;[program:theprogramname]
;command=/bin/cat ; 程序启动的命令, 可以带参数, 建议使用绝对路径
;numprocs=1 ; 同时启动几个相同的程序, 多进程, 一般用不到, 都会在程序中处理, PHP可能会用到
;directory=/tmp ; 运行上面的命令的时候会先进入到这个目录
;autostart=true ; 当supervisord启动的时候是否启动该程序, 废话, 必须启动
;autorestart=true ; 程序意外退出的时候是否重启, 这也是为啥咱们要使用supervisor的一个重要原因了
;stopsignal=QUIT ; 停止程序时候发送的信号, 默认是TERM, 有一些程序支持HUP无需停止服务更新配置的话可以配置HUP, 比如prometheus
;stopwaitsecs=10 ; 给子进程发送停止信号后等待多长时间, 默认10s, 如果超过这段时间无响应, 就会发送KILL -9信号强制杀死, 一般用于等待子进程处理完已经建立的请求.
;redirect_stderr=true ; 如果为true,则stderr的日志会被写入stdout日志文件中
;stdout_logfile=/a/path ; 默认放到/tmp目录下, 设置为NONE后就不会打印日志,当supervisord重新启动的时候,以前的日志文件会被清空
;stdout_logfile_maxbytes=1MB ; 每个日志文件的大小, 默认50M
;stdout_logfile_backups=10 ; 保留历史文件个数, 默认10个
;stderr_logfile=/a/path ; 同上
;stderr_logfile_maxbytes=1MB ; 同上
;stderr_logfile_backups=10 ; 同上
;environment=A=1,B=2 ; 环境变量
- 更新配置文件, 当子进程的supervisor配置有变化的时候要执行
supervisorctl update
- 重启单个子进程(其他操作类似)
supervisorctl restart programname
一般情况下, supervisor本身不会占用很高的资源, 下面2中情况会让它的CPU占用很高.
- 子进程挂掉, 这种情况直接查看子进程的问题即可
- 子进程把日志打印到了标准输出, 而且打印日志的速率很快, 由于supervisor会默认接管所有子进程的标准输出并打印到
/tmp
目录下, 即使没有显性配置supervisor的日志相关的配置.这时候如果在乎supervisor占用CPU的话, 只能关闭程序的标准输出, 因为即使显性配置stdout_logfile=NONE
, supervisor也会接管日志, 只是打到了/dev/null
, CPU占用还是很高.