You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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指令仅在镜像构建阶段执行,构建完成后容器运行时不会保留这个临时拉起的进程,这行可以直接删掉。

修复方案

按以下步骤调整即可解决问题:

  1. 先确认supervisord主配置开启前台运行模式,不然supervisord启动后会自行fork到后台,导致容器直接退出。打开你挂载到容器的/etc/supervisor/supervisord.conf文件,确保[supervisord]段落下存在nodaemon=true配置,参考配置如下:
    [supervisord]
    nodaemon=true
    logfile=/var/log/supervisor/supervisord.log
    pidfile=/var/run/supervisord.pid
    
  2. 把php-fpm加入supervisor托管列表。在你挂载的supervisor子配置目录(也就是/etc/supervisor/conf.d/)下新增fpm配置文件,比如叫php-fpm.conf,写入以下内容:
    [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
    
    注意command后面必须加-F参数,强制php-fpm以前台模式运行,否则supervisor无法正常托管该进程。
  3. 清理Dockerfile冗余无效配置:删除RUN service supervisor start这行构建阶段启动服务的无效命令,保留已经取消注释的ENTRYPOINT配置即可。
  4. 重新构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:33:18