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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:30:58