同一服务器部署两个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端口。容器间通信应使用服务名+内部端口,而非宿主机的映射端口。
调整步骤
修改第二个项目的Nginx upstream配置
将第二个项目的default.conf中upstream部分:upstream php-upstream { server php:9002; }修改为:
upstream php-upstream { server php:9000; }(可选)优化端口映射
若不需要从宿主机直接访问PHP-FPM(通常由Nginx转发即可),可删除第二个项目docker-compose.yaml中PHP服务的ports配置,避免宿主机端口占用:# 删掉这一行 # ports: # - '9002:9000'重启第二个项目服务
执行命令重启服务使配置生效:docker-compose down && docker-compose up -d
完成以上操作后,访问第二个项目地址https://127.0.0.1:4443即可正常加载,不再出现502错误。
内容的提问来源于stack exchange,提问作者Ducho
相关产品推荐
相关产品推荐

