supervisor是一个进程控制系统,旨在使UNIX/Linux系统上的进程管理变得更加简单和高效。它可以监控和控制多个应用程序进程,并提供自动重启、日志记录等功能。通过supervisor,用户可以轻松地启动、停止、重启和监控进程。
supervisor的组成
supervisord:核心守护进程,负责启动和管理子进程,它能响应客户端发来的命令,自动重启崩溃或退出的进程,并记录子进程的标准输出(stdout)和标准错误(stderr)。
supervisorctl:命令行客户端,通过supervisorctl,用户可以查看当前管理的进程列表,并对这些子进程进行控制,例如启动、停止和查看状态。
Web Server:web操作页面,功能与supervisorctl相似,允许用户通过浏览器查看和管理进程状态。默认情况下,该Web界面监听在9091端口,便于远程访问和管理。
XML-RPC:XML-RPC 接口,使得用户能够通过该接口控制进程。这种接口支持多种编程语言,方便开发者集成supervisor的功能到其他应用中。
RockyLinux、AlmaLinux安装supervisor,理论适用于其它红帽兼容版系统
1 |
yum install supervisor |
supervisor配置文件讲解
通常默认配置文件在/etc/supervisord.conf,我们可以为每个要管理的进程创建一个单独的配置文件。这里的;符号表示注释作用。
unix_http_server段
1 2 3 4 5 |
file=/run/supervisor/supervisor.sock ;指定socket文件的路径,使用该文件进行进程间通信。 ;chmod=0700 ;指定socket文件的权限模式,默认为0700。 ;chown=nobody:nogroup ;指定socket文件的用户和组的权限。 ;username=user ;socket身份验证的账号 ;password=123 ;socket身份验证的密码 |
inet_http_server段
1 2 3 4 |
;[inet_http_server] ;web页面配置项,默认禁用,可以通过web管理服务。 ;port=127.0.0.1:9001 ;指定IP地址和端口,远程访问web页面。 ;username=user ;web页面登录用到的账号。 ;password=123 ;web页面登录用到的密码。 |
supervisord段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[supervisord] logfile=/var/log/supervisor/supervisord.log ;指定supervisord进程日志路径 logfile_maxbytes=50MB ;日志文件大小达到50MB后自动转储。 logfile_backups=10 ;转储的日志备份数量10. loglevel=info ;设置日志记录的详细级别(info, debug, warn, trace)。 pidfile=/run/supervisord.pid ;指定supervisord的PID路径。 nodaemon=false ;在后台运行supervisord,如果为true则在前台运行。 minfds=1024 ;启动时可用的最小文件描述符数量,默认为1024。 minprocs=200 ;启动时可用的最小进程描述符数量,默认为200。 ;umask=022 ;进程umask值022。 ;user=chrism ;使用指定的用户。 ;identifier=supervisor ;默认的标识符 ;directory=/tmp ;运行时切换到/tmp路径下。 ;nocleanup=true ;启动时不清理临时文件。 ;childlogdir=/tmp ;'AUTO' 子日志路径。 ;environment=KEY=value ;添加到环境变量中的值。 ;strip_ansi=false ;删除ANSI日志中的转义。 |
[rpcinterface:supervisor]段
1 2 |
[rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface ;RPC接口 |
[supervisorctl]段
1 2 3 4 5 6 |
;serverurl=http://127.0.0.1:9001 ;supervisord的通信地址,supervisorctl通过该地址与supervisord通信。 ;username=chris ;应与inet_http_server字段配置的用户相同。 ;password=123 ;应与inet_http_server字段配置的密码相同。 ;prompt=mysupervisor ;supervisorctl命令行提示符。 ;history_file=~/.sc_history ;supervisorctl命令将保存在该文件中。 [eventlistener:theeventlistenername]、[group:thegroupname]段分别用于定义实践监听、进程组等。 |
[include]段
1 |
files = supervisord.d/*.ini ;指定的目录下包含其它配置文件,通常将多个程序配置在多个文件中。 |
[program:theprogramname]程序段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[program:theprogramname]每个程序都可以通过创建一个 [program:xxx] 段来定义,该配置可以单独写在supervisord.d/目录下。 ;command=/bin/cat ;定义要执行的命令。 ;process_name=%(program_name)s ;设置进程名,如果未指定则使用程序名。 ;numprocs=1 ;启动的进程数量,默认为1。 ;directory=/tmp ;运行时切换到/tmp路径下。 ;umask=022 ;进程umask值022。 ;priority=999 ;启动优先级。 ;autostart=true ;启动supervisord时,自动启动该进程。 ;autorestart=true ;进程意外退出时,是否自动重启。 ;startsecs=10 ;进程运行多少秒后,被认为启动成功。 ;startretries=3 ;当进程启动失败后,最大尝试重新启动的次数。 ;exitcodes=0,2 ;进程退出码。 ;stopsignal=QUIT ;进程停止信号 ;stopwaitsecs=10 ;停止进程时,等待的最大秒数,超过这个时间,supervisord会向该子进程发送一个强制kill的信号。 ;user=chrism ;运行该进程的用户。 ;redirect_stderr=true ;是否将stderr的日志写到stdout日志中。 ;stdout_logfile=/a/path ;stdout日志路径。 ;stdout_logfile_maxbytes=1MB ;日志文件最大大小,超过后将被转储。 ;stdout_logfile_backups=10 ;转储的日志备份数量10。 ;stdout_capture_maxbytes=1MB ;'capturemode'模式下的字节数。 ;stdout_events_enabled=false ;在写入stdout日志时触发。 ;stderr_logfile=/a/path ;错误日志路径 ;stderr_logfile_maxbytes=1MB ;日志文件最大大小,超过后将被转储。 ;stderr_logfile_backups=10 ;转储的日志备份数量10。 ;stderr_capture_maxbytes=1MB ;'capturemode'模式下的字节数。 ;stderr_events_enabled=false ;在写入stderr日志时触发。 ;environment=A=1,B=2 ;进程环境变量时添加。 ;serverurl=AUTO ;传递给子进程的URL。 |
启动服务
supervisor有两个命令行,supervisorctl和supervisord,supervisord是守护进程,supervisorctl是管理进程。
启动守护进程,执行运行以下命令即可
supervisord或systemctl start supervisord
停止守护进程
supervisorctl shutdown或systemctl stop supervisord
启动某个进程,例如字段内容program:php-fpm74],那么这里的php-fpm74就是进程名称
supervisorctl start php-fpm74
停止某个进程
supervisorctl stop php-fpm74
启动全部进程
supervisorctl start all
停止全部进程
supervisorctl stop all
载入新的配置
supervisorctl reload
更新最新的配置文件
supervisorctl update
示例:
如没有特殊需求supervisord.conf配置文件保持默认即可。
php-fpm配置
首先在/usr/local/php/etc/php-fpm.conf配置文件中添加daemonize = no,然后在/etc/supervisord.d/目录下添加php-fpm配置。
1 |
vi /etc/supervisord.d/php74.ini |
1 2 3 4 5 6 7 8 9 10 11 |
[program:php-fpm74] command=/usr/local/php/sbin/php-fpm --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm74.pid process_name=%(program_name)s user=root autostart=true autorestart=true startsecs=3 stopsignal=QUIT stopwaitsecs=2 stderr_logfile=/var/log/php-fpm-supervisor.err.log stdout_logfile=/var/log/php-fpm-supervisor.out.log |
nginx配置
在nginx.conf中添加daemon off;关闭守护进程或直接在supervisord配置中添加-g 'daemon off;',然后在/etc/supervisord.d/目录下添加nginx配置。
1 2 3 4 5 6 7 8 9 10 11 |
[program:nginx] command=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -g 'daemon off;' process_name=%(program_name)s user=root autostart=true autorestart=true startsecs=3 stopsignal=QUIT stopwaitsecs=2 stderr_logfile=/var/log/nginx-supervisor.err.log stdout_logfile=/var/log/nginx-supervisor.out.log |
当php-fpm、nginx意外退出时,可以自动被拉起,对于进程异常退出很有用。
supervisor是一个强大的进程管理工具,适用于需要长期运行的服务和应用程序。通过简单的配置和管理,您可以轻松地监控和维护您的应用程序进程。无论是Web服务器、后台任务,还是任何其他需要管理的进程,supervisor都是一个值得考虑的解决方案。
原文链接:supervisor安装与使用,转载请注明来源!