Docker配置supervisor启动时Nginx访问返回502错误问题
问题根因
Nginx返回502的核心原因是PHP-FPM进程未启动,Nginx转发PHP请求到webapp容器的9000端口时,没有进程监听该端口,连接直接被拒绝,触发网关错误。
触发逻辑非常明确:
- 官方
php:8.1-fpm镜像默认的启动命令是拉起php-fpm主进程,当你注释掉自定义ENTRYPOINT配置时,容器走默认启动逻辑,php-fpm正常运行,服务访问正常。 - 一旦取消
ENTRYPOINT ["supervisord", "-c", "/etc/supervisor/supervisord.conf"]的注释,该配置会完全覆盖原镜像的默认启动入口,容器内1号进程变为supervisord。但你当前的supervisor配置仅托管了自定义的队列、爬虫类任务进程,没有将php-fpm纳入supervisor的托管范围,php-fpm根本没有被启动,9000端口无监听,直接返回502。
额外说明:你Dockerfile里写的RUN service supervisor start是完全无效的,RUN指令仅在镜像构建阶段执行,构建完成后容器运行时不会保留这个临时拉起的进程,这行可以直接删掉。
修复方案
按以下步骤调整即可解决问题:
- 先确认supervisord主配置开启前台运行模式,不然supervisord启动后会自行fork到后台,导致容器直接退出。打开你挂载到容器的
/etc/supervisor/supervisord.conf文件,确保[supervisord]段落下存在nodaemon=true配置,参考配置如下:[supervisord] nodaemon=true logfile=/var/log/supervisor/supervisord.log pidfile=/var/run/supervisord.pid - 把php-fpm加入supervisor托管列表。在你挂载的supervisor子配置目录(也就是
/etc/supervisor/conf.d/)下新增fpm配置文件,比如叫php-fpm.conf,写入以下内容:
注意command后面必须加[program:php-fpm] command=/usr/local/sbin/php-fpm -F autostart=true autorestart=true stdout_logfile=/var/log/supervisor/php-fpm.log stderr_logfile=/var/log/supervisor/php-fpm.error.log user=root-F参数,强制php-fpm以前台模式运行,否则supervisor无法正常托管该进程。 - 清理Dockerfile冗余无效配置:删除
RUN service supervisor start这行构建阶段启动服务的无效命令,保留已经取消注释的ENTRYPOINT配置即可。 - 重新构建PHP镜像、重启所有关联容器,进入webapp容器执行
ss -tulnp | grep 9000,确认有进程监听9000端口后,再访问站点就不会出现502错误。
快速排查命令
如果调整后仍有异常,可以进webapp容器执行以下命令定位问题:
- 执行
supervisorctl status查看所有托管进程的状态,确认php-fpm进程处于RUNNING状态 - 查看
/var/log/supervisor/目录下对应进程的日志,确认进程启动时是否有配置报错、权限报错 - 执行
curl 127.0.0.1:9000,如果返回Empty reply from server,说明php-fpm已经正常监听端口,问题就出在Nginx配置层面,否则就是php-fpm没正常启动。
内容的提问来源于stack exchange,提问作者Tural Rzaxanov
相关产品推荐
相关产品推荐

