说明
Supervisor 是一个进程监护工具,在 Laravel 中,我们用来监护消息队列、Horizon 进程,以便在其意外退出时自动重启。这里以教程 L02 第 5.9 节中的 Horizon 监护为例。
安装和配置
Ubuntu 环境下,运行:apt-get install -y supervisor。安装完毕后,配置文件位于:/etc/supervior,在该文件夹下,有:
conf.d # 自定义配置文件存放目录 supervisord.conf # 主配置文件,自定义文件会在这里include进来
打开 supervisord.conf ,内容如下:
; supervisor config file [unix_http_server] file=/var/run/supervisor.sock ; (the path to the socket file) chmod=0700 ; sockef file mode (default 0700) [supervisord] logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket ; The [include] section can just contain the "files" setting. This ; setting can list multiple files (separated by whitespace or ; newlines). It can also contain wildcards. The filenames are ; interpreted as relative to this file. Included files *cannot* ; include files themselves. [include] files = /etc/supervisor/conf.d/*.conf ;自定义的配置在这里包含进来
为了监护 Horizon 进程,我们在 conf.d 文件夹下创建一份配置,文件名随意,各项作用见注释:
[program:laravel_horizon] ;监护程序名称,随意起,但不能跟其他的重复 process_name=%(program_name)s_%(process_num)02d ;进程名称 directory=/var/www/html/larabbs ;命令运行的目录 command=php artisan horizon ;要执行的命令 autostart=true ;当supervisor启动时,程序自动启动 autorestart=true ;自动重启 numprocs=1 ; 进程数 user=root ;执行命令的账号 stopasgroup=true ;这个和下面一个配置可以防止监护的进程意外重启后子进程残留 killasgroup=true redirect_stderr=true ;这里设为true,就可以配置下面的目录 stdout_logfile=/var/www/html/larabbs/storage/laravel_horizon.log ;日志目录
使用
运行 supervisord -c /etc/supervisor/supervisord.conf 启动,启动后就可以使用 supervisorctl 命令来进行一些进程管理操作,比如:
# 查看状态,比如,在本例子中,将会输出:laravel_horizon:laravel_horizon_00 RUNNING pid 62, uptime 1 day, 7:11:04 supervisorctl status # 以下针对laravel_horizon:laravel_horizon_00进程操作: supervisorctl stop laravel_horizon:laravel_horizon_00 supervisorctl start laravel_horizon:laravel_horizon_00 supervisorctl restart laravel_horizon:laravel_horizon_00 supervisorctl reread supervisorctl update
如果 supervisor 成功启动,在日志文件中可以看到:Horizon started successfully.,当有队列被执行了,日志中可以看到信息,比如:
[2019-11-19 14:27:30][8] Processing: App\Jobs\TranslateSlug [2019-11-19 14:27:30][8] Processed: App\Jobs\TranslateSlug
遇到的问题
启动时报错,找不到 unix:///var/run/supervisor.sock
解决:Linux 命令中断依次运行以下命令:
touch /var/run/supervisor.sock chmod 777 /var/run/supervisor.sock
启动时报错:Unlinking stale socket /var/run/supervisor.sock
解决:运行:unlink /var/run/supervisor.sock
supervisor: couldn't chdir to /var/html/www/larabbs: ENOENT
supervisor: child process was not spawned解决:directory 目录路径写错了,调整会正确路径
© 著作权归作者所有
发表评论