Supervisor是什么
Supervisor 是基于 Python 的进程管理工具,可以帮助我们更简单的启动、重启和停止服务器上的后台进程,是 Linux 服务器管理的效率工具。
什么情况下我们需要进程管理呢?就是执行一些需要以守护进程方式启动的程序,比如一个后台任务、一组 Web 服务的进程(说是一组,是因为经常用 Nginx 来做负载均衡),这些很可能是一些网站、REST API 的服务、消息推送的后台服务、日志数据的处理分析服务等等。
需要注意的是 Supervisor 是通用的进程管理工具,可以用来启动任意进程,不仅仅是用来管理 Python 进程。
除此之外,Supervisor 还能很友好的管理程序在命令行上输出的日志,可以将日志重定向到自定义的日志文件中,还能按文件大小对日志进行分割。
目前 Supervisor 只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上。Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上。
Supervisor 有两个主要的组成部分:
- supervisord,运行 Supervisor 时会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。
- supervisorctl,是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。
安装
pip install supervisor
创建配置文件命令
echo_supervisord_conf > /etc/supervisord.conf
修改默认配置
默认配置文件中的 supervisord.sock、supervisord.log 以及 supervisord.pid 是放在 /tmp 目录下,这个目录存放的是 Linux 中的临时文件,一旦被系统删除,就会提示 unix:///tmp/supervisor.sock no such file,所以我们要把这三个文件放到其他目录中保存。
[unix_http_server]
;此处修改为/var/run目录,避免被系统删除
file=/var/run/supervisor.sock ; the path to the socket file
[supervisord]
;此处修改为/var/log/supervisor目录
logfile=/var/log/supervisor/supervisord.log
...
;此处修改为/var/run目录
pidfile=/var/run/supervisord.pid
[supervisorctl]
;此处是关键,否则执行supervisorctl status会报出unix:// not found错误
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
;在最后加上include,新增的配置将在/etc/supervisord.d/conf.d目录下并以.conf结尾
[include]
files = /etc/supervisord.d/conf.d/*.conf
启动服务
supervisord -c /etc/supervisord.conf
查看进程
pgrep supervisord | xargs ps -u --pid
进程的配置
我们在上面默认配置文件中加入了 [include],所以我们在 /etc/supervisord.d/conf.d 下新建一个配置文件 queue-worker.conf
[program:queue-worker] ;项目名称
process_name=%(program_name)s_%(process_num)02d
command=php (填入你的artisan路径)/artisan queue:work redis --sleep=3 --tries=3 ;需要启动的命令
autostart=true
autorestart=true
user=root ;此处填入你运行WEB应用的用户
numprocs=8 ;进程数
redirect_stderr=true ;把 stderr 重定向到 stdout,默认 false
stdout_logfile=/var/log/supervisor/larashop-queue.log ;注意分配好日志文件夹权限
配置完成后我们执行
supervisorctl reread # 读取有更新(增加)的配置文件,不会启动新添加的程序
supervisorctl update # 重启配置文件修改过的程序
supervisorctl start queue-worker:* # 启动 larashop-worker 程序
如果报如下错误,需要在命令行工具增加配置文件指向
http://localhost:9001 refused connection
解决方法
supervisorctl -c /etc/supervisord/supervisord.conf reread
supervisorctl -c /etc/supervisord/supervisord.conf update
supervisorctl -c /etc/supervisord/supervisord.conf start msp-queue:*
查看状态
[root@localhost vick]# supervisorctl -c /etc/supervisord/supervisord.conf status
msp-queue:msp-queue_00 RUNNING pid 19965, uptime 0:00:29
msp-queue:msp-queue_01 RUNNING pid 19964, uptime 0:00:29
msp-queue:msp-queue_02 RUNNING pid 19967, uptime 0:00:29
msp-queue:msp-queue_03 RUNNING pid 19966, uptime 0:00:29
msp-queue:msp-queue_04 RUNNING pid 19969, uptime 0:00:29
msp-queue:msp-queue_05 RUNNING pid 19968, uptime 0:00:29
msp-queue:msp-queue_06 RUNNING pid 19971, uptime 0:00:29
msp-queue:msp-queue_07 RUNNING pid 19970, uptime 0:00:29
说明 Laravel 队列已经开始正常运行了
如果在 Laravel 中修改了队列代码,需要重启 Supervisor 才能生效