戏里戏外

Rocky Linux 上使用 Supervisord 管理进程

2024-11-14#Laravel#Nuxt#CentOS

Supervisor 是一个用于管理进程的工具,可以确保进程持续运行,并在崩溃时自动重启。

安装 Supervisord

使用 yum 安装 supervisor:

sudo yum install -y epel-release # 安装 EPEL 源
sudo yum install -y supervisor # 安装 supervisor

sudo systemctl start supervisord # 启动 supervisor
sudo systemctl enable supervisord # 设置开机自启
sudo systemctl status supervisord # 查看 supervisor 状态

配置 Supervisor

supervisor 的配置文件位于 /etc/supervisord.conf,配置如下:

[unix_http_server]
file=/var/run/supervisor/supervisor.sock   ; UNIX socket 文件,supervisorctl 会使用
chmod=0700                       ; socket 文件的 mode,默认是 0700

[include]
files = supervisord.d/*.ini

添加配置文件

TIP

假定 Web 服务器用户为 www-data,Nuxt 应用安装在 /var/www/codes/nuxt 目录,Laravel 应用安装在 /var/www/codes/laravel 目录。

# `/etc/supervisord.d/nuxt.ini`
[program:nuxt]
process_name=%(program_name)s_%(process_num)02d
directory=/var/www/codes/nuxt
environment=NODE_ENV=production,NITRO_PORT=3000,NUXT_PUBLIC_API_HOST=http://localhost:3000
command=/usr/local/bin/node .output/server/index.mjs
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stderr_logfile=/var/log/supervisor/nuxt.err.log
stdout_logfile=/var/log/supervisor/nuxt.log
stopwaitsecs=20
# `/etc/supervisord.d/laravel-worker.ini`
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
directory=/var/www/codes/laravel
command=/usr/local/bin/php artisan queue:work --quiet --sleep=3 --tries=3 --timeout=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stderr_logfile=/var/log/supervisor/laravel-worker.err.log
stdout_logfile=/var/log/supervisor/laravel-worker.log
stopwaitsecs=20

创建日志目录

# 创建日志目录
sudo mkdir -p /var/log/supervisor
# 设置目录权限
sudo chown -R www-data:www-data /var/log/supervisor

管理进程

使用 supervisorctl 管理进程。

重新加载配置

重新加载配置后,需要使用下面的命令更新进程。

sudo supervisorctl reread
sudo supervisorctl update

Nuxt 应用管理

sudo supervisorctl start nuxt # 启动 Nuxt

sudo supervisorctl stop nuxt # 停止 Nuxt

sudo supervisorctl restart nuxt # 重启 Nuxt

Laravel 队列管理

sudo supervisorctl start laravel-worker:* # 启动所有队列进程

sudo supervisorctl stop laravel-worker:* # 停止所有队列进程

sudo supervisorctl restart laravel-worker:* # 重启所有队列进程

进程监控

查看状态

使用 supervisorctl 查看进程状态。

sudo supervisorctl status # 查看所有进程状态

# 查看特定进程状态
sudo supervisorctl status nuxt:*
sudo supervisorctl status laravel-worker:*

查看日志

使用 tail -f 实时查看日志。

tail -f /var/log/supervisor/nuxt.log # Nuxt 日志
tail -f /var/log/supervisor/nuxt.err.log # Nuxt 错误日志

tail -f /var/log/supervisor/laravel-worker.log # Laravel 队列日志
tail -f /var/log/supervisor/laravel-worker.err.log # Laravel 队列错误日志

优化配置

优化配置可以提高进程的性能和稳定性。

内存管理

[supervisord]
minfds=65535
minprocs=200

进程优先级

[program:nuxt]
priority=1

[program:laravel-worker]
priority=2
TIP

设置优先级,优先级越小,优先级越高。

故障排查指南

  1. 进程启动失败

    • 检查日志文件
    • 验证目录权限
    • 确认用户权限
  2. 内存问题

[program:nuxt]
# 添加内存限制
environment=NODE_OPTIONS="--max-old-space-size=2048"
  1. 队列阻塞
[program:laravel-worker]
# 添加超时设置
command=php artisan queue:work --timeout=60

维护建议

  1. 定期检查日志

    • 设置日志轮转
    • 监控错误模式
  2. 性能监控

    • 观察内存使用
    • 跟踪进程重启次数
  3. 备份配置

    • 定期备份 supervisor 配置
    • 记录配置修改

总结

使用 Supervisord 管理 NuxtLaravel 队列进程可以:

  • 确保进程持续运行
  • 自动处理崩溃和重启
  • 提供统一的管理接口
  • 简化维护工作

通过合理配置和监控,可以显著提高应用的可靠性和可维护性。