laravel 队列 supervisor 配置

supervisor:要安装的软件的名称。
supervisord:装好supervisor软件后,supervisord用于启动supervisor服务。
supervisorctl:用于管理supervisor配置文件中program和supervisor服务本身。

首先在服务器安装

// 以 Ubuntu 为例
sudo apt-get install supervisor

// 以 centos 为例
sudo su -                        #切换为root用户
yum install epel-release
yum install -y supervisor
systemctl enable supervisord     # 开机自启动
systemctl start supervisord      # 启动supervisord服务
systemctl status supervisord     # 查看supervisord服务状态
ps -ef | grep supervisord        # 查看是否存在supervisord进程

创建配置文件

mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf

创建项目配置

cd /etc/supervisor/conf.d                    // 没有该目录则创建该目录 "mkdir conf.d"
vi supervisord.conf

#修改末尾配置信息
[include]
files = /etc/supervisor/conf.d/ *.conf

vi conf.d/laravel.conf

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php (项目绝对路径)/artisan queue:work redis --tries=1
autostart=true
autorestart=true
#注意运行的用户,可能会造成用户无权限写入日志,报错,退出进程
user=root
#运行几个进程
numprocs=8
redirect_stderr=true
#日志记入地址
stdout_logfile=/home/wwwlogs/laravel-work.log

给执行权限

chmod -R +x /etc/supervisor/supervisord.conf

启动

使用supervisor进程管理命令之前先启动supervisord

supervisord -c /etc/supervisor/supervisord.conf
supervisorctl status        //查看所有进程的状态
supervisorctl stop all      //停止
supervisorctl start all     //启动
supervisorctl restart       //重启
supervisorctl update        //配置文件修改后使用该命令加载新的配置
supervisorctl reload        //重新启动配置中的所有程序

sudo supervisorctl start laravel-worker:*

关闭

/usr/bin/supervisorctl stop all
// 先关闭supervisor启动脚本,之后再关闭supervisord服务
ps ax | grep supervisor
kill -9 pid

查看进程

ps ax | grep supervisor
ps ax | grep artisan

重点 - 重点 - 重点

job里有改动需要重启job

重启 queue

php artisan queue:restart

如果使用 redis 队列
一定要先安装 redis 扩展


安装 redis 扩展

composer require predis/predis

php 配置文件缓存

// 合并所有的配置信息为一个,提高加载速度
php artisan config:cache
// 移除配置缓存文件
php artisan config:clear
// 清空应用缓存
php artisan cache:clear 

supervisord配置文件说明

[unix_http_server]

; socket 文件的路径,supervisorctl 用 XML_RPC 和 supervsord
; 通信就是通过它进行的。如果不设置的话,supervisorctl也就不用了,默认为none
file=/tmp/supervisor.sock

; 修改上面的 socket 文件的权限为0700,默认为0700
chmod=0700

; 修改上面的 socket 文件的属组为 user.group
; 默认为 supervisord 进程的用户及属组。
chown=nobody:nogroup

; 使用 supervisorc tl连接的时候,认证的用户不设置的话,默认为不需要用户
username=user

; 和上面的用户名对应的密码,可以直接使用明码,也可以使用SHA加密
;  默认不设置
password=123

; 侦听在TCP上的socket,WebServer和远程的supervisorct
; 默认为不开启
[inet_http_server]

; 侦听的IP和端口
port=127.0.0.1:9001

; 这个和上面的uinx_http_server一个样。非必须设置
username=user

; 这个也一个样。非必须设置
password=123

; 这个主要是定义supervisord这个服务端进程的一些参数的这个必须设置
; 不设supervisor就不用干活了
[supervisord]

; 这个是supervisord这个主进程的日志路径,注意和子进程的日志不搭嘎
; 默认径$CWD/supervisord.log
logfile=/tmp/supervisord.log

; 这个是上面那个日志文件的最大的大小,当超过50M的时候,会生成一个新的日志文件
; 设置为0时,表示不限制文件大小默认值是50M,非必须设置。
logfile_maxbytes=50MB

; 日志文件保持的数量,supervisor在启动程序时,会自动创建10个buckup
; 文件,用于logrotate当设置为0时,表示不限制文件的数量。默认情况下为1
logfile_backups=10

; 日志级别,有critical,error,warn,info,debug,trae,orblather等默认为info
loglevel=info

; supervisord的pid文件路径。默认为$CWD/supervisord.id
pidfile=/tmp/supervisord.pid

; 如果是true,supervisord进程将在前台运行默认为false
; 也就是后以守护进程运行
nodaemon=false

; 这个是最少系统空闲的文件描述符,低于这个值supervisor将不会启动
; 系统的件描述符在这里设置cat/proc/sys/fs/file-max默认情况下为024
minfds=1024

; 最小可用的进程描述符,低于这个值supervisor也将不会正常启动
; ulimi -u这个命令,可以查看linux下面用户的最大进程数默认为200
minprocs=200

; 进程创建文件的掩码默认为022
umask=022

; 这个参数可以设置一个非root用户,当我们以root用户启动supervisor之后
; 这里面设置的这个用户,也可以对supervisord进行管理默认情况是设置
user=chrism

; 这个参数是supervisord的标识符,主要是给XML_RPC用的。当你有多个
; upervisor的时候,而且想调用XML_RPC统一管理,就需要为每个sup
; rvisor设置不同的标识符了默认是supervisord
identifier=supervisor

; 这个参数是当supervisord作为守护进程运行的时候,设置这个参数的话,启动
; upervisord进程之前,会先切换到这个目录默认不设置。。。非必须设置
directory=/tmp

; 这个参数当为false的时候,会在supervisord进程启动的时候,把以前子
; 程产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当
; 不想日志被清除了。所以可以设置为true默认是false,有调试需求的同学可以
; 置为true。。。非必须设置
nocleanup=true

; 当子进程日志路径为AUTO的时候,子进程日志文件的存放路径。默认路径是这个东西,
; 行下面的这个命令看看就OK了,处理的东西就默认路径非必须设置
childlogdir=/tmp

; 这个是用来设置环境变量的,supervisord在linux中启动默认继承了li
; ux的环境变量,在这里可以设置supervisord进程特有的其他环境变量。s
; pervisord启动子进程时,子进程会拷贝父进程的内存空间内容。所以设置的这
; 环境变量也会被子进程继承。小例子:environment=name="haha",age="hehe"
; 默认为不设置。。。非必须设置
environment=KEY="value"

; 这个选项如果设置为true,会清除子进程日志中的所有ANSI序列。什么是ANSI
; 列呢?就是我们的,    这些东西。默认为false。。。非必须设置
strip_ansi=false

; 这个选项是给XML_RPC用的,当然你如果想使用supervisord或者web
; erver这个选项必须要开启的
[rpcinterface:supervisor]

; 这个主要是针对supervisorctl的一些配置
[supervisorctl]

; 这个是supervisorctl本地连接supervisord的时候,本地UNI
; socket路径,注意这个是和前面的[unix_http_server]对应的
; 认值就是unix:;/tmp/supervisor.sock。。非必须设置
serverurl=unix:;/tmp/supervisor.sock

; 这个是supervisorctl远程连接supervisord的时候,用到的TC
; socket路径注意这个和前面的[inet_http_server]对应默认就
; http:;127.0.0.1:9001。。。非必须项
serverurl=http:;127.0.0.1:9001

; 用户名默认空。。非必须设置
username=chris

; 密码默认空。。非必须设置
password=123

; 输入用户名密码时候的提示符默认supervisor。。非必须设置
prompt=mysupervisor

; 这个参数和shell中的history类似,我们可以用上下键来查找前面执行过的命
; 默认是nofile的。。所以我们想要有这种功能,必须指定一个文件。。。非必须设
history_file=~/.sc_history

; 咱们要管理的子进程
[program:theprogramname]

; 这个就是我们的要启动进程的命令路径了,可以带参数例子:/home/test.py
; a'hehe'有一点需要注意的是,我们的command只能是那种在终端运行的进
; ,不能是守护进程。这个想想也知道了,比如说command=servicehtt
; dstart。httpd这个进程被linux的service管理了,我们的su
; ervisor再去启动这个命令这已经不是严格意义的子进程了。这个是个必须设置的
command=/bin/cat

; 这个是进程名,如果我们下面的numprocs参数为1的话,就不用管这个参数了,它
; 认值%(program_name)s也就是上面的那个program冒号后面的名
; ,但是如果numprocs为多个的话,那就不能这么干了。想想也知道,不可能每个
; 程都用同一个进程名吧。
process_name=%(program_name)s

; 启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置
; 认为1。。非必须设置
numprocs=1

; 进程运行前,会前切换到这个目录默认不设置。。。非必须设置
directory=/tmp

; 进程掩码,默认none,非必须
umask=022

; 子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭默认值为999。。
; 必须设置
priority=999

; 如果是true的话,子进程将在supervisord启动后被自动启动默认就是tr
; e。。非必须设置
autostart=true

; 这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpecte
;true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为u
; expected,只有当进程的退出码不在下面的exitcodes里面定义的退出
; 的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
autorestart=unexpected

; 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功
; 默认值为1。。非必须设置
startsecs=1

; 当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把此
; 程的状态置为FAIL默认值为3。。非必须设置
startretries=3

; 注意和上面的的autorestart=unexpected对应。。exitcod
; s里面的定义的退出码是expected的。
exitcodes=0,2

; 进程停止信号,可以为TERM,HUP,INT,QUIT,KILL,USR1,or
; SR2等信号默认为TERM。。当用设定的信号去干掉进程,退出码会被认为是exp
; cted非必须设置
stopsignal=QUIT

; 这个是当我们向子进程发送stopsignal信号后,到系统返回信息给superv
; sord,所等待的最大时间。超过这个时间,supervisord会向该子进程发
; 一个强制kill的信号。默认为10秒。。非必须设置
stopwaitsecs=10

; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。
; 么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变
; 孤儿进程。所以咱们可以设置可个选项,把整个该子进程的整个进程组都干掉。设置为t
; ue的话,一般killasgroup也会被设置为true。需要注意的是,该选项
; 送的是stop信号默认为false。。非必须设置。。
stopasgroup=false

; 这个和上面的stopasgroup类似,不过发送的是kill信号
killasgroup=false

; 如果supervisord是root启动,我们在这里设置这个非root用户,可以
; 来管理该program默认不设置。。。非必须设置项
user=chrism

; 如果为true,则stderr的日志会被写入stdout日志文件中默认为fals
; ,非必须设置
redirect_stderr=true

; 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。设置
; none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方生成日志文件
; 而且当supervisord重新启动的时候,以前的日志文件会被清空。当redi
; ect_stderr=true的时候,sterr也会写进这个日志文件
stdout_logfile=/a/path

; 日志文件最大大小,和[supervisord]中定义的一样。默认为50
stdout_logfile_maxbytes=1MB

;[supervisord]定义的一样。默认10
stdout_logfile_backups=10

; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdou
; 发送信息,而supervisor可以根据信息,发送相应的event。默认为0; 0的时候表达关闭管道。。。非必须项
stdout_capture_maxbytes=1MB

; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发
; upervisord发送PROCESS_LOG_STDOUT类型的event默
;false。。。非必须设置
stdout_events_enabled=false

; 这个东西是设置stderr写的日志路径,当redirect_stderr=tru
; 。这个就不用设置了,设置了也是白搭。因为它会被写入stdout_logfile
; 同一个文件中默认为AUTO,也就是随便找个地存,supervisord重启被清
; 。。非必须设置
stderr_logfile=/a/path

; 这个出现好几次了,就不重复了
stderr_logfile_maxbytes=1MB

; 这个也是
stderr_logfile_backups=10

; 这个一样,和stdout_capture一样。默认为0,关闭状态
stderr_capture_maxbytes=1MB

; 这个也是一样,默认为false
stderr_events_enabled=false

; 这个是该子进程的环境变量,和别的子进程是不共享的
environment=A="1",B="2"

; 
serverurl=AUTO

; 这个东西其实和program的地位是一样的,也是suopervisor启动的子进
; ,不过它干的活是订阅supervisord发送的event。他的名字就叫lis
; ener了。我们可以在listener里面做一系列处理,比如报警等等楼主这两天
; 的活,就是弄的这玩意
[eventlistener:theeventlistenername]

; 这个和上面的program一样,表示listener的可执行文件的路径
command=/bin/eventlistener

; 这个也一样,进程名,当下面的numprocs为多个的时候,才需要。否则默认就OK
; 
process_name=%(program_name)s

; 相同的listener启动的个数
numprocs=1

; event事件的类型,也就是说,只有写在这个地方的事件类型。才会被发送
events=EVENT

; 这个是event队列缓存大小,单位不太清楚,楼主猜测应该是个吧。当buffer超
; 10的时候,最旧的event将会被清除,并把新的event放进去。默认值为10
; 。非必须选项
buffer_size=10

; 进程执行前,会切换到这个目录下执行默认为不切换。。。非必须
directory=/tmp

; 淹没,默认为none,不说了
umask=022

; 启动优先级,默认-1,也不扯了
priority=-1

; 是否随supervisord启动一起启动,默认true
autostart=true

; 是否自动重启,和program一个样,分true,false,unexpecte
; 等,注意unexpected和exitcodes的关系
autorestart=unexpected

; 也是一样,进程启动后跑了几秒钟,才被认定为成功启动,默认1
startsecs=1

; 失败最大尝试次数,默认3
startretries=3

; 期望或者说预料中的进程退出码,
exitcodes=0,2

; 干掉进程的信号,默认为TERM,比如设置为QUIT,那么如果QUIT来干这个进程
; 么会被认为是正常维护,退出码也被认为是expected中的
stopsignal=QUIT

; maxnumsecstowaitb4SIGKILL(default10)
stopwaitsecs=10

; sendstopsignaltotheUNIXprocessgroup(defa
; ltfalse)
stopasgroup=false

; SIGKILLtheUNIXprocessgroup(deffalse)
killasgroup=false

; 设置普通用户,可以用来管理该listener进程。默认为空。。非必须设置
user=chrism

;true的话,stderr的log会并入stdout的log里面默认为fals
; 。。。非必须设置
redirect_stderr=true

; 这个不说了,好几遍了
stdout_logfile=/a/path

; 这个也是
stdout_logfile_maxbytes=1MB

; 这个也是
stdout_logfile_backups=10

; 这个其实是错的,listener是不能发送event
stdout_events_enabled=false

; 这个也是
stderr_logfile=/a/path

; 这个也是
stderr_logfile_maxbytes=1MB

; 这个不说了
stderr_logfile_backups

; 这个也是错的,listener不能发送event
stderr_events_enabled=false

; 这个是该子进程的环境变量默认为空。。。非必须设置
environment=A="1",B="2"

; overrideserverurlcomputation(childutils)
serverurl=AUTO

; 这个东西就是给programs分组,划分到组里面的program。我们就不用一个
; 个去操作了我们可以对组名进行统一的操作。注意:program被划分到组里面之后
; 就相当于原来的配置从supervisor的配置文件里消失了。。。supervi
; or只会对组进行管理,而不再会对组里面的单个program进行管理了
[group:thegroupname]

; 组成员,用逗号分开这个是个必须的设置项
programs=progname1,progname2

; 优先级,相对于组和组之间说的默认999。。非必须选项
priority=999

; 这个东西挺有用的,当我们要管理的进程很多的时候,写在一个文件里面就有点大了。我们
; 以把配置信息写到多个文件中,然后include过来
[include]
files=relative/directory/*.conf

转载:cdn.learnku.com/uploads/images/202...

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!