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

Docker容器中Nginx+PHP-FPM出现502错误,请求排查配置问题

问题分析与解决:PHP-FPM + Nginx Docker容器502错误

问题场景

尝试在php:8.2-fpm Docker容器中安装Nginx,配置完成后通过浏览器访问出现502错误,Nginx日志提示连接127.0.0.1:9000被拒绝,但控制台可正常执行PHP文件。


用户提供的配置文件

Dockerfile

FROM php:8.2-fpm

# Instala Nginx y herramientas necesarias
RUN apt-get update && apt-get install -y nginx wget

# Instala Xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

# Configura Nginx
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf

# Inicia PHP-FPM y Nginx
CMD ["nginx", "-g", "daemon off;"]

docker-compose.yml

version: '3'
services:
  php-fpm:
    build: .
    volumes:
      - ./src:/var/www/html
    ports:
      - 9000:9000
      - 80:80

default.conf

server {
    listen 80;
    server_name localhost;

    location / {
        root /var/www/html;
        index index.php;
    }

    location ~ \.php$ {
        fastcgi_pass localhost:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Nginx错误日志

2024/02/27 17:50:18 [error] 11#11: *19 connect() failed (111: Connection refused) while connecting to upstream, client: 172.22.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"

核心问题原因

容器启动命令仅运行了Nginx,未启动PHP-FPM进程:

  • php:8.2-fpm镜像默认启动命令是启动PHP-FPM,但Dockerfile中用CMD ["nginx", "-g", "daemon off;"]覆盖了默认命令,导致容器内只有Nginx在运行,PHP-FPM未启动,Nginx无法连接到9000端口处理PHP请求。

解决步骤

方法一:用Supervisord管理多进程

通过Supervisord同时启动PHP-FPM和Nginx,这是容器内运行多进程的标准方案。

  1. 修改Dockerfile
FROM php:8.2-fpm

# 安装依赖与Supervisord
RUN apt-get update && apt-get install -y nginx wget supervisor

# 安装Xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

# 复制Nginx配置
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf

# 配置Supervisord
RUN echo "[supervisord]" > /etc/supervisor/conf.d/supervisord.conf && \
    echo "nodaemon=true" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "[program:php-fpm]" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "command=php-fpm" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "autostart=true" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "autorestart=true" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "[program:nginx]" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "command=nginx -g 'daemon off;'" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "autostart=true" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "autorestart=true" >> /etc/supervisor/conf.d/supervisord.conf

# 启动Supervisord
CMD ["supervisord"]
  1. 重建并启动容器
docker-compose down && docker-compose build && docker-compose up -d

方法二:用Shell脚本启动多进程

如果不想依赖Supervisord,可通过自定义脚本启动两个进程。

  1. 创建启动脚本start.sh(项目根目录)
#!/bin/bash
# 后台启动PHP-FPM
php-fpm &
# 前台运行Nginx(保持容器存活)
nginx -g "daemon off;"

添加执行权限:

chmod +x start.sh
  1. 修改Dockerfile
FROM php:8.2-fpm

# 安装依赖
RUN apt-get update && apt-get install -y nginx wget

# 安装Xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

# 复制Nginx配置
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf

# 复制启动脚本
COPY start.sh /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh

# 执行启动脚本
CMD ["start.sh"]
  1. 重建并启动容器
docker-compose down && docker-compose build && docker-compose up -d

额外验证步骤

  1. 确认./src目录下存在index.php测试文件,例如:
<?php phpinfo(); ?>
  1. 进入容器检查PHP-FPM状态:
docker exec -it [容器ID/名称] netstat -tulpn | grep 9000

应能看到php-fpm进程监听127.0.0.1:9000。

内容的提问来源于stack exchange,提问作者user3447780

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:02:53