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

Docker Compose配置Nginx反向代理多容器出现502错误求助

问题原因及解决方法

核心原因

你遇到的502问题,最关键的错误是Nginx配置里的端口写错了:

  • Docker Compose中api2的容器内部服务端口是3000(ports: "3001:3000"只是把宿主机的3001端口映射到容器内的3000),但你在Nginx配置里给api2的proxy_pass写的是http://api2:3001——容器之间走内部网络通信,必须用容器内部的端口,不是宿主机的映射端口。

至于真实项目和示例项目的情况相反,大概率是两边的后端服务端口配置不一致(比如真实项目里api2的容器端口是3001,示例里是3000),导致一边的端口碰巧写对了,另一边错了,所以出现反向的502现象。

另外,depends_on只是保证容器启动顺序,不确保后端服务完全就绪,可能会导致启动初期的临时502,但不会一直持续,这是次要问题。

解决步骤

1. 修正Nginx的端口配置

修改nginx.conf中api2的proxy_pass端口为3000,同时建议添加必要的代理头(避免后端服务获取不到正确的请求信息):

server {
    listen              80;
    server_name         localhost;

    access_log          /var/log/nginx/nginx.vhost.access.log;
    error_log           /var/log/nginx/nginx.vhost.error.log;

    location / {
        proxy_pass         http://api1:3000;
        # 添加代理头,确保后端能拿到正确的请求源信息
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /api {
        rewrite ^/api(.*)$ $1  break;
        proxy_pass         http://api2:3000; # 把这里的3001改成3000
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

2. 可选:解决服务启动顺序导致的临时502

如果想让Nginx等后端服务完全就绪再启动,可以给后端服务加上健康检查,配合depends_on的健康状态判断:

services:
  api1:
    build: .
    ports:
      - "3000:3000"
    environment:
      - ID=1
      - GIN_MODE=release
    healthcheck:
      # 假设后端有/health健康检查接口,没有的话可以换成检查端口的命令,比如 nc -zv localhost 3000
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 5s
      timeout: 5s
      retries: 3

  api2:
    build: .
    ports:
      - "3001:3000"
    environment:
      - ID=2
      - GIN_MODE=release
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 5s
      timeout: 5s
      retries: 3

  reverseproxy:
    build: ./reverseproxy
    ports:
      - "3333:80"
    depends_on:
      api1:
        condition: service_healthy
      api2:
        condition: service_healthy

3. 重新部署服务

执行命令重启所有容器:

docker-compose down
docker-compose up --build

验证

重启后测试:

  • 访问localhost:3333,应该正常转发到api1
  • 访问localhost:3333/api/或localhost:3333/api/test,应该正常转发到api2的对应路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:44:56