supervisor是一款特别好用的进程管理工具
安装supervisor
// 安装第三方源,CentOS本身的yum源中没有supervisor,需要更换第三方源:
yum install epel-release -y
// 安装supervisor:
yum install -y supervisor
// 启动supervisor 服务、查看supervisor 服务状态
systemctl start supervisord
// 上面那个命令失效的话
// supervisord -c /etc/supervisord.conf
systemctl status supervisord
设置supervisor开机启动
systemctl enable supervisord
supervisor配置
安装supervisor之后,在etc下有两个配置文件
supervisord.conf // supervisor的总配置文件
supervisord.d/ // supervisor进程的配置目录
我们所有的项目配置都放在supervisord.d
目录下,方便管理
例如我新建了 /etc/supervisord.d/test.ini
文件,*.ini
文件是默认导入的
[program: test]
command= /www/go_pro/run
directory= /www/go_pro
autorestart=true
autostart=true
stderr_logfile=/www/go_pro/err.log
stdout_logfile=/www/go_pro/out.log
user=root
stopsignal=INT
startsecs=1
stopasgroup=true
killasgroup=true
编写完成之后就需要重新加载配置文件
supervisorctl reload
配置解释
以上面的文件为例
; 咱们要管理的子进程
[program:test]
; 这个就是我们的要启动进程的命令路径了,可以带参数例子:/home/test.py
; a'hehe'有一点需要注意的是,我们的command只能是那种在终端运行的进
; ,不能是守护进程。这个想想也知道了,比如说command=servicehtt
; dstart。httpd这个进程被linux的service管理了,我们的su
; ervisor再去启动这个命令这已经不是严格意义的子进程了。这个是个必须设置的
command=/bin/cat
; 这个是进程名,如果我们下面的numprocs参数为1的话,就不用管这个参数了,它
; 认值%(program_name)s也就是上面的那个program冒号后面的名
; ,但是如果numprocs为多个的话,那就不能这么干了。想想也知道,不可能每个
; 程都用同一个进程名吧。
process_name=%(program_name)s
; 启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置
; 认为1。。非必须设置
numprocs=1
; 进程运行前,会前切换到这个目录默认不设置。。。非必须设置
directory=/tmp
; 进程掩码,默认none,非必须
umask=022
; 子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭默认值为999。。
; 必须设置
priority=999
; 如果是true的话,子进程将在supervisord启动后被自动启动默认就是tr
; e。。非必须设置
autostart=true
; 这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpecte
; 和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为u
; expected,只有当进程的退出码不在下面的exitcodes里面定义的退出
; 的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
autorestart=unexpected
; 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功
; 默认值为1。。非必须设置
startsecs=1
; 当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把此
; 程的状态置为FAIL默认值为3。。非必须设置
startretries=3
; 注意和上面的的autorestart=unexpected对应。。exitcod
; s里面的定义的退出码是expected的。
exitcodes=0,2
; 进程停止信号,可以为TERM,HUP,INT,QUIT,KILL,USR1,or
; SR2等信号默认为TERM。。当用设定的信号去干掉进程,退出码会被认为是exp
; cted非必须设置
stopsignal=QUIT
; 这个是当我们向子进程发送stopsignal信号后,到系统返回信息给superv
; sord,所等待的最大时间。超过这个时间,supervisord会向该子进程发
; 一个强制kill的信号。默认为10秒。。非必须设置
stopwaitsecs=10
; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。
; 么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变
; 孤儿进程。所以咱们可以设置可个选项,把整个该子进程的整个进程组都干掉。设置为t
; ue的话,一般killasgroup也会被设置为true。需要注意的是,该选项
; 送的是stop信号默认为false。。非必须设置。。
stopasgroup=false
; 这个和上面的stopasgroup类似,不过发送的是kill信号
killasgroup=false
; 如果supervisord是root启动,我们在这里设置这个非root用户,可以
; 来管理该program默认不设置。。。非必须设置项
user=chrism
; 如果为true,则stderr的日志会被写入stdout日志文件中默认为fals
; ,非必须设置
redirect_stderr=true
; 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。设置
; none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方生成日志文件
; 而且当supervisord重新启动的时候,以前的日志文件会被清空。当redi
; ect_stderr=true的时候,sterr也会写进这个日志文件
stdout_logfile=/a/path
; 日志文件最大大小,和[supervisord]中定义的一样。默认为50
stdout_logfile_maxbytes=1MB
; 和[supervisord]定义的一样。默认10
stdout_logfile_backups=10
; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdou
; 发送信息,而supervisor可以根据信息,发送相应的event。默认为0,
; 0的时候表达关闭管道。。。非必须项
stdout_capture_maxbytes=1MB
; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发
; upervisord发送PROCESS_LOG_STDOUT类型的event默
; 为false。。。非必须设置
stdout_events_enabled=false
; 这个东西是设置stderr写的日志路径,当redirect_stderr=tru
; 。这个就不用设置了,设置了也是白搭。因为它会被写入stdout_logfile
; 同一个文件中默认为AUTO,也就是随便找个地存,supervisord重启被清
; 。。非必须设置
stderr_logfile=/a/path
; 这个出现好几次了,就不重复了
stderr_logfile_maxbytes=1MB
; 这个也是
stderr_logfile_backups=10
; 这个一样,和stdout_capture一样。默认为0,关闭状态
stderr_capture_maxbytes=1MB
; 这个也是一样,默认为false
stderr_events_enabled=false
; 这个是该子进程的环境变量,和别的子进程是不共享的
environment=A="1",B="2"
serverurl=AUTO
supervisorctl命令
supervisorctl status
supervisorctl restart test
supervisorctl start test
supervisorctl stop test
管理go项目
[program: go]
directory = /www/go_pro
command= /www/go_pro/main ; 二进制文件的地址
autorestart=true
autostart=true
stderr_logfile=/www/go_pro/err.log
stdout_logfile=/www/go_pro/out.log
user=root
stopsignal=INT
startsecs=1
stopasgroup=true
killasgroup=true
管理nginx
新建一个文件vim /etc/nginx/conf/test.conf
server {
listen 8080;
server_name 192.168.100.185;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_pass http://127.0.0.1:8080/;
}
}
导入配置文件
nginx的主配置文件一般在 /usr/local/nginx/conf/nginx.conf
在http块中进行导入其他文件的server模块
include /etc/nginx/conf/*.conf
编写supervisor配置文件
[program: nginx]
command= /usr/local/nginx/sbin/nginx
autorestart=true
autostart=true
user=root
startsecs=1
stopasgroup=true
killasgroup=true
先把nginx停掉,nginx -s stop
再重新加载配置文件 supervisorctl reload