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

同一服务器部署两个PHP Docker项目遇502错误及连接拒绝求助

同一服务器部署两个PHP Docker项目时502 Bad Gateway错误排查与解决

问题描述

在同一服务器部署两个PHP+Nginx Docker项目时:

  • 第一个项目PHP端口配置为9000:9000,运行正常
  • 第二个项目因端口冲突改用9002:9000,启动后访问出现502 Bad Gateway,错误日志显示连接被拒绝

错误日志

connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://172.19.0.3:9002", host: "127.0.0.1:4443"

项目配置信息

第一个Docker项目配置

docker-compose.yaml

version: '3.9'

services:
  php:
    container_name: php
    build:
      context: ./docker/php
    ports:
      - '9000:9000'
    volumes:
      - .:/var/www/
      - ~/.ssh:/root/.ssh:ro
  nginx:
    container_name: nginx
    image: nginx:stable-alpine
    ports:
      - '5080:80'
      - '5443:443'
    volumes:
      - .:/var/www/
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - /etc/letsencrypt:/etc/letsencrypt
    depends_on:
      - php

Nginx default.conf

upstream php-upstream {
    server php:9000;
}

server {
    listen 80;
    server_name localhost;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    index index.php index.html index.htm;
    server_name localhost;
    root /var/www;
    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;

    ssl_certificate /etc/letsencrypt/live/domain1/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain1/privkey.pem;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass php-upstream;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;

        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;

        include fastcgi_params;

        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;

        internal;
    }

    location ~ \.php$ {
        return 404;
    }
}

第二个Docker项目配置

docker-compose.yaml

version: '3.9'
services:
  php:
    container_name: hostmagic_php
    build:
      context: ./docker/php
    ports:
      - '9002:9000'
    volumes:
      - .:/var/www/symfony
      - ~/.ssh:/root/.ssh:ro
  nginx:
    container_name: hostmagic_nginx
    image: nginx:stable-alpine
    ports:
      - '8080:80'
      - '4443:443'
    volumes:
      - .:/var/www/symfony
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - /etc/letsencrypt:/etc/letsencrypt
    depends_on:
      - php
  rabbitmq:
    image: rabbitmq:3-management-alpine
    container_name: hostmagic_rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: password
      RABBITMQ_DEFAULT_VHOST: "/"
    ports:
      - 15672:15672
      - 5672:5672

Nginx default.conf

upstream php-upstream {
    server php:9002;
}

server {
    listen 80;
    server_name localhost;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    index index.php index.html index.htm;
    server_name localhost;
    root /var/www/symfony/public;
    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;

    ssl_certificate /etc/letsencrypt/live/domain2/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain2/privkey.pem;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass php-upstream;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;

        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param HTTP_HOST $host;

        include fastcgi_params;

        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;

        internal;
    }

    location ~ \.php$ {
        return 404;
    }
}

解决方案

问题根源

第二个项目的Nginx配置错误地将upstream指向了宿主机映射的端口9002,但Docker容器内部的PHP服务依然监听容器内部的9000端口。容器间通信应使用服务名+内部端口,而非宿主机的映射端口。

调整步骤

  1. 修改第二个项目的Nginx upstream配置
    将第二个项目的default.conf中upstream部分:

    upstream php-upstream {
        server php:9002;
    }
    

    修改为:

    upstream php-upstream {
        server php:9000;
    }
    
  2. (可选)优化端口映射
    若不需要从宿主机直接访问PHP-FPM(通常由Nginx转发即可),可删除第二个项目docker-compose.yaml中PHP服务的ports配置,避免宿主机端口占用:

    # 删掉这一行
    # ports:
    #   - '9002:9000'
    
  3. 重启第二个项目服务
    执行命令重启服务使配置生效:

    docker-compose down && docker-compose up -d
    

完成以上操作后,访问第二个项目地址https://127.0.0.1:4443即可正常加载,不再出现502错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:20:21