supervisor安装、配置及分析

目标环境为 :centos7

1. 安装

pip install supervisor

 

supervisor安装、配置及分析

ln -sv /usr/local/python3.7/bin/supervisorctl /usr/bin/supervisorctl

ln -sv /usr/local/python3.7/bin/supervisord /usr/bin/supervisord

supervisor安装、配置及分析

 

2. 使用

配置文件

supervisord.conf

; Sample supervisor config file.
;
; For more information on the config file, please see:
; http://supervisord.org/configuration.html
;
; Notes:
;  - Shell expansion ("~" or "$HOME") is not supported.  Environment
;    variables can be expanded using this syntax: "%(ENV_HOME)s".
;  - Comments must have a leading space: "a=b ;comment" not "a=b;comment".


[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)

[inet_http_server]
port = 127.0.0.1:9001
;username = user
;password = 123


[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=5MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=2            ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)



[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


[include]
files = httpd.conf

httpd.conf

[program:httpd]
command=nginx -g "daemon off;" ; the program (relative uses PATH, can take args)
numprocs=1                     ; number of processes copies to start (def 1)
autostart=true                 ; start at supervisord start (default: true)
startsecs=1                    ; # of secs prog must stay up to be running (def. 1)
autorestart=true               ; when to restart if exited after running (def: unexpected)
stdout_logfile=/var/log/supervisor/httpd.log      ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=5MB    ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=2       ; # of stdout logfile backups (default 10)
stderr_logfile=/var/log/supervisor/httpd_err.log   ; stderr log path, NONE for none; default AUTO
stderr_logfile_maxbytes=5MB    ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=2       ; # of stderr logfile backups (default 10)

将上面两个脚本放到同一个目录,然后执行下面的命令

mkdir /var/log/supervisor

supervisord -c supervisord.conf

结果如下 :

supervisor安装、配置及分析

通过supervisorctl status能看到httpd进程已经被supervisor接管并正常启动了。

supervisor安装、配置及分析

supervisor安装、配置及分析

 

3. 配置解释

Supervisor的使用主要在于配置

http://supervisord.org/configuration.html 这是官网多配置的解释了示例。

 

3.1 unix_http_server

侦听HTTP / XML-RPC请求的UNIX域套接字的路径。Supervisorctl使用XML-RPC通过该端口与Supervisor通信。此选项可以包含值%(here)s,该值将扩展到找到监管配置文件的目录。

[unix_http_server]

file = /tmp/supervisor.sock ;UNIX域套接字的路径,一般要改下路径

chmod = 0777 ;UNIX权限模式, 可注释

chown= nobody:nogroup ;将套接字文件的用户和组更改为此值, 可注释

username = user ;对此HTTP服务器进行认证的用户名, 可注释

password = 123 ;对此HTTP服务器进行认证的密码, 可注释

 

3.2 inet_http_server

侦听HTTP / XML-RPC请求的TCP host:port值或(例如127.0.0.1:9001)。 supervisorctl将使用XML-RPC通过此端口与supervisor通信。

[inet_http_server]

port = 127.0.0.1:9001 ;监听端口

username = user ;认证用户名 可注释

password = 123 ;认证密码 可注释

 

3.3 supervisorctl

该配置文件可能包含 supervisorctl交互式shell程序的设置。

[supervisorctl]

serverurl = unix:///tmp/supervisor.sock ;于访问受管服务器的UR

username = chris ;认证用户名 可注释

password = 123 ;认证密码 可注释

prompt = mysupervisor ;用户提示的字符串 可注释

 

​​​​​​​3.4 supervisord

supervisord全局设置。

[supervisord]

logfile = /tmp/supervisord.log ;日志文件保存路径

logfile_maxbytes = 50MB ;日志文件的最大大小

logfile_backups=10 ;最多多少个日志文件supervisord.log1 2 3 ...

loglevel = info ;日志级别critical/error/warn/info/debug/trace/blather

pidfile = /tmp/supervisord.pid ;进程pid文件

nodaemon = false ;false为后台运行

minfds = 1024 ;可用的最小文件描述符数目

minprocs = 200 ;可用的最小数量的过程描述符

umask = 022 ;supervisord进程的umask

user = chrism ;在执行任何有意义的处理之前,将用户切换到这个UNIX用户帐户

identifier = supervisor ;此管理程序进程的标识符字符串,由RPC接口使用。

directory = /tmp ;当supervisord守护进程时,切换到该目录

nocleanup = true ;防止 在启动时清除任何现有的AUTO子日志文

childlogdir = /tmp ;用于AUTO子日志文件的目录

strip_ansi = false ;从子日志文件中删除所有ANSI转义序列

environment = KEY1="value1",KEY2="value2" ;键/值对的列表环境变量,子进程全部继承。

 

​​​​​​​3.5 program:x

Supervisor监控的子进程

[program:httpd] ;httpd为supervisor显示进程名名字

command=nginx -g "daemon off;" ;进程运行命令,只能前台运行的

process_name=%(program_name) ;一个Python字符串表达式,默认注释

numprocs=1 ;启动的进程数

directory=/tmp ;进程运行后切换的目录

umask=022 ;进程的umask

priority=999 ;优先级

autostart=true ;在supervisor启动时候自动启动

autorestart=unexpected ;如果异常退出,则重启

startsecs=10 ;进程必须running 10秒才算成功

startretries=3 ;进程启动失败的重试次数

exitcodes=0 ;进程退出时候的预期code码

stopsignal=TERM ;终止信号

stopwaitsecs=10 ;向程序发送停止信号后,等待操作系统返回SIGCHLD给主进程的秒

stopasgroup=false ;如果为true,将导致管理器向整个进程组发送停止信号

killasgroup=false ;如果为true,把它发送给它的整个进程组

user=chrism ;用该用户帐户作为运行程序的帐户

redirect_stderr=false

stdout_logfile=/a/path ;日志文件

stdout_logfile_maxbytes=1MB ;日志文件的大小

stdout_logfile_backups=10 ;最多10个日志文件滚动

stdout_capture_maxbytes=1MB

stdout_events_enabled=false

stderr_logfile=/a/path ;错误日志文件

stderr_logfile_maxbytes=1MB ;日志文件的大小

stderr_logfile_backups=10;最多10个日志文件滚动

stderr_capture_maxbytes=1MB

stderr_events_enabled=false

environment=A="1",B="2" ;进程的环境变量

serverurl=AUTO

 

​​​​​​​3.6 nclude

用于包含其他的conf文件,一般一个进程对应一个conf文件,然后用include来包含

[include]

files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf

 

​​​​​​​3.7 rpcinterface:x

[rpcinterface:supervisor]部分必须保留在配置中,以便标准设置的supervisor能够正常工作。如果你不想让主管做任何它没有开箱即用的事情。

[rpcinterface:supervisor]

supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

 

​​​​​​​3.8 ventlistener:x

管理器允许在配置文件中定义专用的同构流程组(“事件侦听器池”)。这些池包含用于接收和响应来自管理器事件系统的事件通知的进程

[eventlistener:theeventlistenername]

command=/bin/eventlistener

process_name=%(program_name)s_%(process_num)02d

numprocs=5

events=PROCESS_STATE

buffer_size=10 ;事件队列缓冲区大小

directory=/tmp ;

umask=022 ;

priority=-1 ;优先级

autostart=true  ;自动运行

autorestart=unexpected ;异常退出重启

startsecs=1 ;运行超过1秒才算成功

startretries=3 ;启动失败重试次数

exitcodes=0 ;正常退出的code码

stopsignal=QUIT ;退出信号

stopwaitsecs=10 ;退出时间

stopasgroup=false

killasgroup=false

user=chrism

redirect_stderr=false

stdout_logfile=/a/path

stdout_logfile_maxbytes=1MB

stdout_logfile_backups=10

stdout_events_enabled=false

stderr_logfile=/a/path

stderr_logfile_maxbytes=1MB

stderr_logfile_backups=10

stderr_events_enabled=false

environment=A="1",B="2"

serverurl=AUTO

 

​​​​​​​3.9 fcgi-program:x


[fcgi-program:fcgiprogramname]

command=/usr/bin/example.fcgi

socket=unix:///var/run/supervisor/%(program_name)s.sock

socket_owner=chrism

socket_mode=0700

process_name=%(program_name)s_%(process_num)02d

numprocs=5

directory=/tmp

umask=022

priority=999

autostart=true

autorestart=unexpected

startsecs=1

startretries=3

exitcodes=0

stopsignal=QUIT

stopasgroup=false

killasgroup=false

stopwaitsecs=10

user=chrism

redirect_stderr=true

stdout_logfile=/a/path

stdout_logfile_maxbytes=1MB

stdout_logfile_backups=10

stdout_events_enabled=false

stderr_logfile=/a/path

stderr_logfile_maxbytes=1MB

stderr_logfile_backups=10

stderr_events_enabled=false

environment=A="1",B="2"

serverurl=AUTO

 

​​​​​​​3.10 group:x

将多个子进程归并到同一个组,从而可以进行统一控制。

[group:foo]

programs=bar,baz

priority=999

 

4. 避坑

  • Supervisor 不能接管后台运行的进程,只能接管前台运行的进程

例如

nginx -g "daemon off;" 是一条前台运行的命令,能够正常接管

supervisor安装、配置及分析

如果command=nginx, 实际上nginx已经运行了,但是会supervisor会提示报错,一直再重启。

supervisor安装、配置及分析

supervisor安装、配置及分析

 

上一篇:Python paramiko模块(实现ssh)


下一篇:c – 是否会加载DLL动态协调其stderr到主应用程序?如果是这样,那怎么……?