Docker部署Symfony项目时Nginx返回502 Bad Gateway故障求助
Docker环境Nginx返回502 Bad Gateway问题排查与解决
问题根因定位
根据你提供的Nginx错误日志connect() failed (111: Connection refused) while connecting to upstream,可知问题是Nginx无法与PHP容器的9000端口建立连接,常见原因有三个:
- PHP容器内php-fpm进程未正常启动:你的PHP容器启动命令会先执行
composer install拉取Symfony依赖,若依赖拉取慢、执行失败,会导致php-fpm迟迟不启动 - php-fpm监听地址配置错误:部分默认php-fpm配置会监听127.0.0.1:9000,仅允许容器内部访问,Docker内部网络的Nginx请求会被拒绝
- 服务启动顺序问题:
depends_on仅保证容器启动顺序,不保证PHP服务完全就绪,Nginx启动后PHP还没完成初始化
解决方案
1. 验证PHP服务状态
先执行以下命令查看PHP容器日志,确认php-fpm是否正常启动:
docker logs php
若日志显示composer执行报错,可先在本地Symfony项目目录执行composer install提前装好依赖,再启动容器避免启动阻塞。
2. 修复php-fpm监听配置
修改php/Dockerfile,添加配置强制php-fpm监听0.0.0.0:9000,允许Docker内部网络访问:
# 在现有Dockerfile末尾EXPOSE 9000前添加以下行 RUN echo "listen = 0.0.0.0:9000" >> /usr/local/etc/php-fpm.d/www.conf
3. 优化容器启动顺序
修改docker-compose.yml,给PHP服务添加健康检查,确保php-fpm就绪后再启动Nginx:
services: php: build: context: ./php ports: - "9000:9000" volumes: - ../symfony:/var/www # 新增健康检查配置 healthcheck: test: ["CMD-SHELL", "apt-get update && apt-get install -y netcat && nc -z 127.0.0.1 9000 || exit 1"] interval: 5s timeout: 3s retries: 10 nginx: container_name: "nginx" build: context: ./nginx volumes: - ../symfony:/var/www - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./logs:/var/log # 修改依赖配置,等待PHP健康检查通过 depends_on: php: condition: service_healthy ports: - "8081:80"
注:PHP容器的9000端口映射到宿主机不是必须项,仅需内部网络访问的话可删除ports配置。
4. 重启服务验证
执行以下命令重建容器并启动:
docker-compose down -v && docker-compose up --build
等待所有服务启动完成后,访问http://localhost:8081即可正常访问。
内容的提问来源于stack exchange,提问作者romain DS
相关产品推荐
相关产品推荐

