使用supervisor管理laravel队列 - 配置文件supervisord.conf

使用supervisor管理laravel队列 - 配置文件supervisord.conf,第1张

相关文章

上一篇:使用supervisor管理laravel队列
,此篇重点性描述了我本地配置supervisor的全部过程;但是并未介绍为啥这么配置,这里,我就来记录一下配置supervisor的各个参数以及含义

一、先生成各个项目对应的suoervisor配置文件

上一篇中说到,supervisor的配置文件一般在路径etc/supervisor/supervisord.conf

在这里可以看到有个【include】配置,当我们要管理的进程很多的时候,写在这个文件里就会有点大,而且管理不方便;所以我们可以把配置信息写到多个文件中,然后include过来。这里已经配置为会包含conf.d目录下所有.conf的文件,所以我们可以直接在conf.d目录下,直接生成各个项目对应的supervisor文件即可;

cd /etc/supervisor/conf.d
sudo vim zfx-ezample.conf

就会生成一个zfx-ezample.conf文件,当然,记得将名字改成你自己可以标识的项目配置文件名

二、supervisor文件的配置

supervisor配置文档

在新建的zfx-example.conf文件中,增加以下代码:

[program:zfx-example]
process_name=%(program_name)s_%(process_num)02d
command=php /home/vagrant/code/edp/php/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=vagrant
numprocs=8
redirect_stderr=true
stdout_logfile=/home/vagrant/code/edp/php/storage/logs/supervisor.log
stopwaitsecs=3600

[unix_http_server]
file = /var/run/supervisor.sock
chmod = 0700
chown= nobody:nogroup
username = vagrant
password = vagrant

[inet_http_server]
port = 127.0.0.1:9001
username = vagrant
password = vagrant


[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid


[supervisorctl]
serverurl = unix:///var/run/supervisor.sock
username = vagrant
password = vagrant
prompt = mysupervisor

下面来分别描述以下各个配置的含义:

[program:zfx-example]
# [program:程序名]

# command=/bin/bash -c "需要执行的命令,多句命令用分号隔开"
# command=python /root/ihasy/application.py --port=9001 --mysql_database=ihasy --mysql_host=localhost --mysql_password=764895 --mysql_user=root
command=/usr/bin/python /www/wwwroot/domain_check/Main.py
directory=/www/wwwroot/domain_check

numprocs=2                                    # 启动进程的数目,默认为1。; 若 numprocs 不为1时,就是进程池的概念。process_name 的表达式中一定要包含 process_num 来区分不同的进程
process_name=%(program_name)s_%(process_num)02d

autostart=true                                # 该程序是否跟随supervisor一起启动,默认是true。如果是true的话,子进程将在supervisord启动后被自动启动。
autorestart=true                              # 如果该程序挂了,是否重新启动(异常退出时,自动启动,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启)
startsecs=6                                   # 启动后持续6秒后未发生异常,才表示启动成功。启动6秒后没有异常退出,就表示进程正常启动了,默认为1秒
startretries=3                                # 异常后,自动重启次数。启动失败自动重试次数,默认是3。当超过3次后,supervisor将把此进程的状态置为FATAL 

user=root                                     # 设置启动该程序的用户,默认是root
priority=999                                  # 进程启动优先级(值越小越优先启动)。权重值,值越低,越早启动,越晚关闭。默认999                  

stdout_logfile=/var/www/ProjectName.out.log   # 终端标准输出重定向文件
stdout_logfile_maxbytes=2MB                   # 文件最大大小
stdout_logfile_backups=30                     # 文件备份最大数量
stdout_capture_maxbytes=2MB
stderr_logfile=/var/www/ProjectName.err.log   # 终端错误输出重定向文件
stderr_logfile_maxbytes=2MB                   # 文件最大大小
stderr_logfile_backups=30                     # 文件备份最大数量
stderr_capture_maxbytes=2MB
redirect_stderr=true                          # 如果为true,则stderr的日志会被写入stdout日志文件中

stopasgroup=false                             # 默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false                             # 默认为false,向进程组发送kill信号,包括子进程
environment=PATH="/home/app_env/bin"          # 可以通过 environment 来添加需要的环境变量,一种常见的用法是使用指定的 virtualenv 环境 

# startsecs=6:即6秒内程序即没有出现异常,也没有执行完,执行完也是异常退出,会自动重启。
# process_name=%(program_name)s_%(process_num)02d:这个是进程名,如果我们下面的numprocs参数为1的话,就不用管这个参数了,它默认值%(program_name)s也就是上面的那个program冒号后面的名字,但是如果numprocs为多个的话,那就不能这么干了。想想也知道,不可能每个进程都用同一个进程名吧。
[unix_http_server]     
# socket文件的路径,supervisorctl用XML_RPC和supervisord通信就是通过它进行的。如果不设置的话,supervisorctl也就不能用了。不设置的话,默认为none。非必须设置       
file=/tmp/supervisor.sock 
# 这个就是修改上面的那个socket文件的权限为0700。不设置的话,默认为0700。 非必须设置                                    
chmod=0700    
# 这个就是修改上面的那个socket文件的属组为user.group。不设置的话,默认为启动supervisord进程的用户及属组。非必须设置             
chown=nobody:nogroup       
# 使用supervisorctl连接的时候,认证的用户。不设置的话,默认为不需要用户。 非必须设置   
username=user              
# 和上面的用户名对应的密码,可以直接使用明码,也可以使用SHA加密。如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d。默认不设置。非必须设置                               
password=123

# 侦听在TCP上的socket,Web Server和远程的supervisorctl都要用到它。不设置的话,默认为不开启。非必须设置
[inet_http_server]         
# 这个是侦听的IP和端口,侦听所有IP用 :9001或*:9001。只要上面的[inet_http_server]开启了,就必须设置它。 
port=127.0.0.1:9001         
# 这个和上面的uinx_http_server一个样。非必须设置
username=user               
# 这个也一个样。非必须设置
password=123    

# 这个主要是定义supervisord这个服务端进程的一些参数的。这个必须设置,不设置,supervisor就不用干活了
[supervisord]                
# 这个是supervisord这个主进程的日志路径,注意和子进程的日志不搭嘎。默认路径$CWD/supervisord.log,$CWD是当前目录。非必须设置
logfile=/tmp/supervisord.log 
# 这个是上面那个日志文件的最大的大小,当超过50M的时候,会生成一个新的日志文件。当设置为0时,表示不限制文件大小。默认值是50M,非必须设置。              
logfile_maxbytes=50MB        
# 日志文件保持的数量,上面的日志文件大于50M时,就会生成一个新文件。文件数量大于10时,最初的老文件被新文件覆盖,文件数量将保持为10。当设置为0时,表示不限制文件的数量。默认情况下为10。非必须设置
logfile_backups=10
# 日志级别,有critical, error, warn, info, debug, trace, or blather等。默认为info。非必须设置项           
loglevel=info                
# supervisord的pid文件路径。默认为$CWD/supervisord.pid。非必须设置  
pidfile=/tmp/supervisord.pid 

[supervisorctl]
# 这个是supervisorctl本地连接supervisord的时候,本地的UNIX socket路径,注意这个和前面的[unix_http_server]对应。默认值就是unix:///tmp/supervisor.sock。非必须设置
serverurl=unix:///tmp/supervisor.sock
# 这个是supervisorctl远程连接supervisord的时候,用到的TCP 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类似,我们可以用上下键来查找前面执行过的命令。默认是no file的。所以我们想要有这种功能,必须指定一个文件。非必须设置
history_file=~/.sc_history              

三、supervisor开机启动

上一篇也提到过,配置完文件后,需要中心加载配置文件启动才能将新配置的配置项生效,命令如下:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
或者使用:
sudo supervisorctl -c /etc/supervisor/supervisord.conf

但是你会发现,上次的配置并未配置

user=root # 设置启动该程序的用户,默认是root

这一项,所以直接可以使用以上命令启动,而这次我配置了user=vagrant,如果直接上述命令,会提示以下错误:

Error: Server requires authentication
For help, use /usr/bin/supervisorctl -h


这是因为设置了访问的账号密码,所以只能先supervisorctl进去,然后在supervisorctl中进行 *** 作,其他的命令也是如此:

四、基本常用命令
  1. supervisor命令

sudo service supervisor start # 启动supervisor服务
sudo service supervisor stop # 停止supervisor服务

  1. supervisorctl命令
program_name 为 [program:x] 里的 x
# 停止某个进程
supervisorctl stop program_name
# 启动某个进程
supervisorctl start program_name
# 重启某个进程
supervisorctl restart program_name
# 停止|启动|重启 全部进程,注:start、restart、stop 都不会载入最新的配置文件
supervisorctl stop|start|restart all

# 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
supervisorctl stop groupworker:
# 结束 groupworker:name1 这个进程 (start,restart 同理)
supervisorctl stop groupworker:name1

# 查看所有任务状态
supervisorctl status 
# 查看单个任务状态
supervisorctl status program_name(服务名)
# 关闭所有任务
supervisorctl shutdown 
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl update

# 查看运行状态并进入控制台,在控制台中执行命令可以省去supervisorctl命令。
# 即先输入: supervisorctl,后面再输入命令的时候就不用加上supervisorctl了。例如:stop httpserver
五、 下次再说

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/722449.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存