使用Supervisor来管理Laravel队列


January 6, 2019 · 后端 · 189次阅读

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 才能生效

参考链接

标签:Supervisor,Laravel

最后编辑于:2019/11/26 06:05

添加新评论

控制面板