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,这是容器内运行多进程的标准方案。
- 修改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"]
- 重建并启动容器
docker-compose down && docker-compose build && docker-compose up -d
方法二:用Shell脚本启动多进程
如果不想依赖Supervisord,可通过自定义脚本启动两个进程。
- 创建启动脚本
start.sh(项目根目录)
#!/bin/bash # 后台启动PHP-FPM php-fpm & # 前台运行Nginx(保持容器存活) nginx -g "daemon off;"
添加执行权限:
chmod +x start.sh
- 修改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"]
- 重建并启动容器
docker-compose down && docker-compose build && docker-compose up -d
额外验证步骤
- 确认
./src目录下存在index.php测试文件,例如:
<?php phpinfo(); ?>
- 进入容器检查PHP-FPM状态:
docker exec -it [容器ID/名称] netstat -tulpn | grep 9000
应能看到php-fpm进程监听127.0.0.1:9000。
内容的提问来源于stack exchange,提问作者user3447780
相关产品推荐
相关产品推荐

