CentOS7 安装和使用 Supervisor 工具

CentOS 安装 Supervisor

Supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。它是通过 fork/exec 的方式把这些被管理的进程当作 supervisor 的子进程来启动。这样只要在 supervisor 的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息。可以选择是否自己启动和报警。Supervisor 还提供了一个功能:可以为 supervisord 或 每个子进程设置一个非 root 的 user,这个 user 就可以管理它对应的进程。

背景:

在项目中,遇到有一些需要长驻后台运行的程序。比如:短信异步发送、邮件异步发送、红包/卡券发送等需求。通过 Linux 的 crontab 定时来执行,会造成处理不实时而体验下降。采用 nohup 、&、screen 来实现,又没办法很好监控进程的情况。管理起来很是不方便。恰好,Supervisor 解决了这些头疼的问题。

一、安装 Supervisor

1)安装 Python

我们知道 Supervisor 是基于 Python 的工具。所以,在安装 Supervisor 之前,一定要先安装 Python 。通常在大多数 Linux 发行版之中已经内置了 Python。

可以通过如下命令查看当前 Python 版本:

$ python -V

如果提示"-bash: python: command not found" 字样,说明你的系统没有安装 Python。我用的是 CentOS 6,所以安装 Python 比较简单。如下命令:

$ yum -y install python

2)安装 Supervisor

已经安装 Python,那么我们可以通过 easy_install 来安装 Supervsior。

$ easy_install supervisor

如果没有任何意外,直接回车就等自动下载 Supervisor 包并自动安装了。

二、创建配置文件

默认安装的 Supervisor 是没有任何配置文件的。因为,它给我们提供了一个自己的工具来创建配置文件。

$ echo_supervisord_conf > /etc/supervisord.conf

我们通过 echo_supervisord_conf 把配置文件创建到了 /etc/supervisord.conf 文件。

接下来,我们对配置文件做权限控制。

$ chown www:www /etc/supervisord.conf
$ chmod 744 /etc/supervisord.conf

三、创建进程管理目录

所谓进程管理目录,是指该目录下的每一个配置文件对应一个被管理进程的具体配置。就是告诉 Supervisor,我们当前有哪些进程需要被管理。

$ mkdir /etc/supervisor
$ chown www:www -R /etc/supervisor/

四、修改 supervisor 配置文件

1)加载进程管理目录配置

$ vim /etc/supervisord.conf

在文件末尾找到如下类似代码:

[include]
files = /etc/supervisor/*.ini

如果前面有 ; 冒号,请把冒号去掉。并且把 files 设置为我们的进程管理目录。

2)logfile 设置

在 [supervisord] 一节中的 logfile 设置为:logfile=/var/log/supervisord.log

[supervisord]
logfile=/var/log/supervisord.log

因为,我们使用了 /var/log/supervisord.log 文件。所以,要对文件权限进行设置。

$ touch /var/log/supervisord.log
$ chmod 777 /var/log/supervisord.log

3)serverurl 设置

在 [supervisorctl] 一节中的 serverurl 设置为:unix:///tmp/supervisor.sock

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock

五、创建被管理进程配置

我们通过一个具体的示例来进行说明:

[program:event_dispatcher]
directory = /data/wwwroot/api.hunshijian.com/public/ ; 程序的启动目录
command = /usr/local/php56/bin/php cli.php Event/Dispatcher ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了,默认10秒
autorestart = true   ; 程序异常退出后自动重启
startretries = 1000     ; 启动失败自动重试次数,默认是 3
user = root           ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/supervisord_logs/Event-Dispatcher.log

关于每行作用已经通过注释说明。如果还有不明白的地方可以通过搜索相关资料来了解。

六、管理 Supervisor

当一切准备就绪。就差启动起来运行一把了。

1)启动 Supervisor

$ supervisord -c /etc/supervisord.conf

我们在启动的时候手动指定了配置文件。当然,也可以不指定配置文件。 Supervsior 会自动去寻找。当然,这并不是可取的启动方式。

如果已经启动了 Supervisor。重复执行会得到如下错误提示:

Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.
For help, use /usr/bin/supervisord -h

2)重载 Supervisor 配置

当我们的配置文件发生了修改。这个时候,我们就必须重新启动 Supervisor 才能重新转入配置文件。

$ supervisorctl update

3)重启所有进程

有时候我们想把所有的程序一次性重启。

$ supervisorctl reload

通常全部重启可能性很小。在开发中我们都是按需重启。像有的被管理的进程业务中断可能产生错误数据。

4)查看当前正在运行的守护进程

有时候我们想查看当前被管理的进程是否已经启动。可以通过如下命令查看:

$ supervisorctl status
event_dispatcher                 RUNNING   pid 30777, uptime 1:54:48
thread_demo                      RUNNING   pid 30778, uptime 1:54:48

第一列代表自己自定义的进程名称。第二列代表当前进程的状态。RUNNING 代表运行中。后面的就一看明白了。不解释。

5)停止所有守护进程

有时候,我们在开发过程中想停掉所有的守护进程。可以通过如下命令完成:

$ supervisorctl stop all

6)停止指定的守护进程

单纯想停掉指定的进程。用如下命令完成:

$ supervisorctl stop thread_demo

thread_demo 是我们指定的自定义进程的名称。

7)启动所有守护进程

$ supervisorctl start all

8)启动指定守护进程

$ supervisorctl start thread_demo

9)重启所有守护进程

$ supervisorctl restart all

10)重启指定守护进程

$ supervisorctl restart thread_demo

七、高级示例

1 ) Kill 掉守护进程的子进程

Supervisor 在重启或停止守护进程的时候,默认情况只会给父进程发送 KILL 信号。如果,守护进程还存在子进程。那么,子进程此时全部会变成孤儿进程。当我们想对子进程也终止的时候。就会用到如下两个参数:

stopasgroup=true
killasgroup=true

完整示例如下:

[program:thread_demo]
directory = /data/wwwroot/api.hunshijian.com/public/ ; 程序的启动目录
command = /usr/local/php56/bin/php cli.php Thread/demo ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了,默认10秒
autorestart = true   ; 程序异常退出后自动重启
startretries = 1000     ; 启动失败自动重试次数,默认是 3
user = root           ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/supervisord_logs/Thread-demo.log
stopasgroup=true
killasgroup=true

2)Web 方式管理守护进程

以登录服务器用命令行管理守护进程方式相比,Web 模式相对更方便一些。但是,也有缺点:密码验证过于单一,容易被破解的风险。而且,有且仅有一个账户。权限细分不够细致。

修改配置文件,改成如下:

[inet_http_server]
port=0.0.0.0:9999
username=admin
password=123456

假如,你 supervisor 所在的服务器 IP 为 122.122.122.122。那么此时,可以通过http://122.122.122.122:999 登录管理你的 Supervisor 守护进程。

如果想限制指定 IP 才能登录管理。那么,可以如下配置:

[inet_http_server]
port=212.212.212.212:9999
username=admin
password=123456

此时,212.212.212.212 即是我们允许访问的 IP 。

博主 2011 年创建了一个《PHP 初学者官方群》,目前群成员 500 人左右。群号:168159147。为了防止广告,设置为付费入群。欢迎大家加入讨论技术!

标签: 无

发表评论: