Laravel Octane搭配Supervisor+Nginx部署后偶发请求失败问题排查
故障原因定位
- 核心原因是Laravel Octane默认请求数重启机制与Supervisor进程拉起逻辑冲突:Octane默认
--max-requests参数值为5000,即每处理完5000次请求就会主动停止服务触发重启,Supervisor检测到进程退出后会立刻尝试拉起新的Octane进程,但旧进程还未完全释放8089端口,导致新进程启动时报Address already in use错误,端口占用窗口期内的请求就会返回失败,和你观测到的每4000-5000次请求出现少量失败的现象完全匹配。 - 辅助诱因是Supervisor配置不合理:
stopwaitsecs设置为3600秒过长,且没有配置端口预释放逻辑,进一步放大了端口占用冲突的概率。
解决方案
1. 调整Octane启动与Supervisor配置
修改/etc/supervisor/conf.d/laravel-octane-worker.conf,增加端口预释放逻辑、调高请求数上限减少重启频率,调整后配置如下:
process_name=%(program_name)s_%(process_num)02d # 启动前先释放8089端口占用,调高max-requests减少重启频率 command=bash -c "fuser -k 8089/tcp || true && php /var/www/html/artisan octane:start --server=swoole --workers=8 --task-workers=4 --port=8089 --max-requests=100000" autostart=true autorestart=true user=www-data redirect_stderr=true stdout_logfile=/var/www/html/octane-worker.log # 调整停止等待时间为30秒,避免无效等待 stopwaitsecs=30 numprocs=1 # 配置适配Swoole的停止信号 stopsignal=TERM
2. 增加Nginx代理容错配置
在Nginx站点配置的location块中新增重试逻辑,覆盖Octane重启的短暂窗口期:
location / { proxy_pass http://127.0.0.1:8089; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; # 新增容错重试配置 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_connect_timeout 2s; proxy_send_timeout 10s; proxy_read_timeout 10s; }
3. 配置生效验证
执行以下命令重启服务生效:
# 重载Supervisor配置并重启Octane进程 supervisorctl reread && supervisorctl update && supervisorctl restart laravel-octane-worker:* # 重载Nginx配置 nginx -s reload
重启后观测Octane日志是否还有端口占用报错,压测超过5000次请求验证失败现象是否消失。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

