Supervisor 是一个客户端 / 服务器系统,允许其用户监视和控制类 UNIX 操作系统上的许多进程。

官网上的介绍,那么什么是 客户端 / 服务端系统呢?相信大部分小伙伴都用过 ssh 工具来登陆服务器吧?其实 ssh 就是一个很典型的 客户端 / 服务端系统,它由两个部分组成:sshd (ssh Server) 服务端部分,ssh (ssh Client) 客户端部分。简单来说呢就是先需要开启一个服务端,然后再用一个客户端来使用或管理它。

这个就是一个简单的软件方式,这方面我就不扯多了,那么让我们一起看看 Supervisor 到底是啥呢,用这个东西有什么好处,以及如何来用它守护我们的 Laravel 列队?

首先 Supervisor 是 Python 写的进程管理工具,我们能够用它来管理一个需要在后台运行的进程,并且出现异常挂掉之后能够自动重启。

之前我想要讲进程持续运行在服务器后台一直使用的是 screen 或者 nohup 来后台守护进程,其实这样会有一个问题那就是如果进程挂掉了那么我需要登陆服务器重新启动它,而且如果没有啥特殊的监听的话我还不知道它是啥时候挂掉的…所以就比较麻烦。用 Supervisor 就能够帮助我们自动重启该进程了,那不是爽很多。

我在他们 Github 仓库看到这么一句声明:

"Supervisor will not run at all under any version of Windows."

霸气,嘿嘿。

官网:http://supervisord.org/index.html

GitHub:https://github.com/Supervisor/supervisor

接下来就是上手使用 Supervisor 来管理我们的 Laravel 队列进程。

第一步就是安装了,这里我直接使用 Ubuntu 的 apt-get,当然也可以用 Python 的 pip,以及官网上讲到的其他方式安装

sudo apt-get install supervisor

接下来我们生成一个 supervisord (supervisor server 端)的默认配置文件输出到 /etc/supervisord.conf

echo_supervisord_conf > /etc/supervisord.conf

生成成功之后编辑这个文件,把最后的 include 块的注释删除,让它能够读取 /etc/supervisor/ 目录下的全部配置文件之后我们的配置文件就可以统一放到这个目录下了,修改如下:

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

弄完之后我们使用给它指定新的配置文件启动,如果提示已经有进程在运行,就找到之前那个进程结束掉,不会的话可以搜索一下 Linux 查找指定软件进程(软件:supervisord)和结束 Linux 软件进程。执行以下命令:

sudo supervisord -c /etc/supervisord.conf

启动 supervisord 成功之后我们在 /etc/supervisor/ 目录下新建一个配置文件,比如我创建了一个 xxx_zmide_com.conf 代表我这是 xxx.zmide.com 的一个配置文件,然后输入下面的配置:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /data/test/xxx.zmide.com/artisan queue:work --quiet --tries=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/supervisor/laravel-queue.log

program:laravel-worker 标识是一个 laravel-worker 任务组的样子,之后可以用这个标识来控制相同标识的进程开启,关闭,重启等操作

process_name 这是一个进程的名字,这里使用了 program_name(program 标识的名称)拼接了 process_num(这是进程数)

command 需要执行的命令,我们这里就是执行 php artisan queue:work --quiet --tries=3 其实就是 Laravel 队列的启动命令,参数的话加上 --quiet 好像能降低一些服务器负载…

autostart 是否自启

autorestart 是否自动重新启动

user 使用的用户组

numprocs 启动进程数量

stdout_logfile 日志文件输出路径

更多参数的话可以看看官网的文档,我这里就不一一讲了。

配置完成之后我们使用 supervisorctl(supervisor client 端)来启动这个进程守护

sudo supervisorctl reread
# 加载配置文件

sudo supervisorctl update
# 更新配置文件

sudo supervisorctl start laravel-worker:*
# 启动 laravel-worker 标识的全部任务

如果有修改我们项目中队列的代码的话是需要重新启动 Laravel 队列进程才能生效的,下面就是重启操作了:

sudo supervisorctl restart all
# 重启全部进程,这里也可以和上面一样指定只启动 laravel-worker 标识的全部任务

sudo supervisorctl stop all
# 结束全部任务

sudo supervisorctl help
# 查看帮助,记不住命令可以看看帮助哦

好了,到这里就该告一段落了…