Docker-Compose部署Symfony+Nginx遇502 Bad Gateway问题求助
Symfony + Nginx 502 Bad Gateway 问题排查
我通过Docker-Compose部署多项目,所有镜像基于Debian:11构建。React和Express服务正常,但Symfony与Nginx无法连接,出现502 Bad Gateway nginx/1.23.2错误,Docker Compose构建无报错。相关配置如下:
Dockerfile(app/symfony/Dockerfile)
FROM debian:11 RUN apt update && \ apt upgrade -y && \ apt install dirmngr ca-certificates software-properties-common gnupg gnupg2 apt-transport-https curl librabbitmq-dev -y && \ curl -sSL https://packages.sury.org/php/README.txt | bash -x && \ apt update && \ apt upgrade -y && \ apt install php8.1 \ php8.1-fpm \ php8.1-mysql \ php8.1-pdo \ php8.1-gd \ php8.1-cli \ php8.1-dom \ php8.1-mbstring \ php8.1-simplexml \ php8.1-phar \ php8.1-dev \ php8.1-amqp \ php8.1-redis \ unzip \ wget \ git -y && \ mkdir /run/php WORKDIR /var/www/symfony RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \ php composer-setup.php && \ php -r "unlink('composer-setup.php');" && \ mv composer.phar /usr/local/bin/composer RUN curl -1sLf 'https://dl.cloudsmith.io/public/symfony/stable/setup.deb.sh' | bash &&\ apt install symfony-cli COPY composer.json composer.lock symfony.lock ./ COPY . . RUN composer install CMD ["php-fpm8.1", "-F"] EXPOSE 9000
Docker-Compose 配置
version: "3.8" services: nginx: restart: unless-stopped image: nginx:latest ports: - 1999:80 volumes: - ./app/symfony:/var/www/symfony - ./conf/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php-fpm - db php-fpm: restart: always build: context: ./app/symfony ports: - 9000:9000 volumes: - ./app/symfony:/var/www/symfony depends_on: - db healthcheck: test: [ "CMD", "php", "-v" ] timeout: 30s interval: 2s retries: 30 db: image: mysql:8 ports: - 3306:3306 restart: always volumes: - ./database:/var/lib/mysql environment: MYSQL_ROOT_USER: root MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: docker MYSQL_USER: user MYSQL_PASSWORD: user_password phpmyadmin: image: phpmyadmin restart: always ports: - 8888:80 depends_on: - db node_express: image: tlugat/debian_express build: context: ./app/express restart: unless-stopped ports: - 8081:8081 react: image: tlugat/debian_react build: context: ./app/react restart: unless-stopped ports: - 3000:3000 maildev: image: maildev/maildev ports: - 1080:1080
Nginx 配置(conf/nginx/default.conf)
server { listen 80; index index.php; server_name localhost; root /var/www/symfony/public; error_log /var/log/nginx/project_error.log; access_log /var/log/nginx/project_access.log; location / { try_files $uri /index.php$is_args$args; } location ~ ^/index\.php(/|$) { fastcgi_pass php-fpm:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; internal; } location ~ \.php$ { return 404; } }
排查步骤
1. 检查PHP-FPM监听地址
默认PHP-FPM可能仅监听127.0.0.1:9000,Docker环境下需要改为监听0.0.0.0:9000才能让Nginx容器访问。进入php-fpm容器查看配置:
docker exec -it <php-fpm-container-name> cat /etc/php/8.1/fpm/pool.d/www.conf | grep listen
如果是127.0.0.1:9000,修改Dockerfile添加配置修改步骤:
RUN sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/' /etc/php/8.1/fpm/pool.d/www.conf
2. 修正Healthcheck逻辑
当前healthcheck仅验证PHP版本,无法确认PHP-FPM服务是否就绪。修改docker-compose中php-fpm的healthcheck:
healthcheck: test: ["CMD-SHELL", "ss -tulpn | grep php-fpm || exit 1"] timeout: 30s interval: 5s retries: 10
3. 修复文件权限问题
Symfony的public目录和缓存目录需要Nginx、PHP-FPM进程有读写权限,在Dockerfile中添加:
RUN chown -R www-data:www-data /var/www/symfony RUN chmod -R 755 /var/www/symfony/public
4. 查看日志定位具体错误
查看Nginx错误日志:
docker exec -it <nginx-container-name> cat /var/log/nginx/project_error.log
查看PHP-FPM日志:
docker exec -it <php-fpm-container-name> cat /var/log/php8.1-fpm.log
日志会提供连接失败的具体原因,比如连接拒绝、文件不存在、权限不足等。
5. 验证容器间网络连通性
在Nginx容器中测试能否连接到php-fpm服务:
docker exec -it <nginx-container-name> nc -zv php-fpm 9000
如果连接失败,检查Docker网络配置,确保两个服务在同一默认网络中。
内容的提问来源于stack exchange,提问作者Zoodiac
相关产品推荐
相关产品推荐

