AWS Elastic Beanstalk上Laravel Queue Worker异常停止求助
问题排查:AWS Elastic Beanstalk上Laravel Queue Worker服务反复重启失败
问题背景
使用AWS Elastic Beanstalk部署Laravel应用,通过systemd管理队列worker服务,配置文件如下:
08_queue_service_restart: command: "systemctl restart laravel_worker" files: /opt/elasticbeanstalk/tasks/taillogs.d/laravel-logs.conf: content: /var/app/current/storage/logs/laravel.log group: root mode: "000755" owner: root /etc/systemd/system/laravel_worker.service: mode: "000755" owner: root group: root content: | # Laravel queue worker using systemd # ---------------------------------- # # /lib/systemd/system/queue.service # # run this command to enable service: # systemctl enable queue.service [Unit] Description=Laravel queue worker [Service] User=nginx Group=nginx Restart=always ExecStart=/usr/bin/nohup /usr/bin/php /var/app/current/artisan queue:work --tries=3 [Install] WantedBy=multi-user.target
今日凌晨开始,worker服务反复重启失败,错误日志如下:
Aug 17 04:21:34 ip-blabla systemd: laravel_worker.service: main process exited, code=exited, status=1/FAILURE Aug 17 04:21:34 ip-blabla systemd: Unit laravel_worker.service entered failed state. Aug 17 04:21:34 ip-blabla systemd: laravel_worker.service failed. Aug 17 04:21:34 ip-blabla systemd: laravel_worker.service holdoff time over, scheduling restart. Aug 17 04:21:34 ip-blabla systemd: Stopped Laravel queue worker. Aug 17 04:21:34 ip-blabla systemd: Started Laravel queue worker.
重建Beanstalk环境后问题仍存在,以下是具体排查和修复步骤:
排查与修复步骤
1. 查看Laravel日志获取具体错误
systemd错误日志仅显示进程退出状态,无法定位根本问题,直接查看Laravel日志:
tail -f /var/app/current/storage/logs/laravel.log
重点关注worker启动时间点附近的报错,比如数据库连接失败、依赖缺失、缓存权限问题等。
2. 手动验证worker命令有效性
切换到nginx用户,模拟systemd执行环境直接启动worker:
su - nginx -c "/usr/bin/php /var/app/current/artisan queue:work --tries=3"
终端会直接输出命令执行的错误信息,是最快定位问题的方式。
另外,systemd本身会管理进程生命周期,无需nohup,建议去掉该命令,避免进程管理冲突。
3. 检查文件与目录权限
Laravel的storage目录需要nginx用户具备读写权限,否则worker无法生成日志、缓存文件:
chown -R nginx:nginx /var/app/current/storage chmod -R 755 /var/app/current/storage
同时确认artisan文件有执行权限:
chmod +x /var/app/current/artisan
4. 确保systemd加载Laravel环境变量
systemd启动的进程默认不加载用户环境变量,而Laravel依赖.env中的配置(如数据库连接)。可在service配置中添加环境变量加载:
在[Service]段加入:
EnvironmentFile=/var/app/current/.env
或者通过bash命令加载环境变量后启动worker:
ExecStart=/bin/bash -c 'source /var/app/current/.env && /usr/bin/php /var/app/current/artisan queue:work --tries=3'
5. 优化systemd服务配置
修改后的完整service配置示例,添加日志输出便于排查:
# Laravel queue worker using systemd [Unit] Description=Laravel queue worker [Service] User=nginx Group=nginx Restart=always # 加载Laravel环境变量 EnvironmentFile=/var/app/current/.env # 去掉nohup,由systemd管理进程 ExecStart=/usr/bin/php /var/app/current/artisan queue:work --tries=3 # 将输出重定向到journalctl,方便查看详细日志 StandardOutput=journal+console StandardError=journal+console [Install] WantedBy=multi-user.target
6. 更新Beanstalk部署配置
修改部署配置文件,确保systemd重新加载配置并启用服务:
08_queue_service_restart: command: | systemctl daemon-reload systemctl enable laravel_worker.service systemctl restart laravel_worker.service files: /opt/elasticbeanstalk/tasks/taillogs.d/laravel-logs.conf: content: /var/app/current/storage/logs/laravel.log group: root mode: "000755" owner: root /etc/systemd/system/laravel_worker.service: mode: "000755" owner: root group: root content: | # Laravel queue worker using systemd [Unit] Description=Laravel queue worker [Service] User=nginx Group=nginx Restart=always EnvironmentFile=/var/app/current/.env ExecStart=/usr/bin/php /var/app/current/artisan queue:work --tries=3 StandardOutput=journal+console StandardError=journal+console [Install] WantedBy=multi-user.target
验证修复结果
部署更新后的配置文件,查看systemd服务状态:
systemctl status laravel_worker.service
或实时查看journal日志:
journalctl -u laravel_worker.service -f
若服务稳定运行,则问题已解决。
内容的提问来源于stack exchange,提问作者Tufan Çağkan Sökmenn
相关产品推荐
相关产品推荐

