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

使用Docker Compose+Nginx反向代理时出现502 Bad Gateway错误求助

问题描述

使用Docker Compose搭建环境,以Nginx作为反向代理访问服务时出现502 Bad Gateway错误,两条路由均提示「连接上游被拒绝」。

Docker Compose 配置

version: '3'

services:
  web:
    build:
      context: .
      dockerfile: ./apps/nginx-reverse-proxy/Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - ./apps/nginx-reverse-proxy/nginx.conf:/etc/nginx/nginx.conf
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - backend-network

  auth-service:
    container_name: "auth-service"
    build:
      dockerfile: ./apps/auth/Dockerfile
      context: .
    environment:
      - CLIENT_URL=${CLIENT_URL}
      # ... other environment variables
    networks:
      - backend-network

  mail-service:
    container_name: "mail-service"
    build:
      context: .
      dockerfile: ./apps/mail-service/Dockerfile
    environment:
      - CLIENT_URL=${CLIENT_URL}
      # ... other environment variables
      - TEMP=/app/apps/mail-service/src/temp/
    networks:
      - backend-network

networks:
  backend-network:

Nginx 配置

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    gzip on;
    gzip_types text/plain text/css application/json application/javascript application/xml application/x-www-form-urlencoded multipart/form-data;
    gzip_proxied no-cache no-store private expired auth;

    upstream backend {
        server mail-service:3000;
        server auth-service:4000;
    }

    server {
        listen 8080;
        server_name backend;

        location /api/v1/mail/ {
            proxy_buffers 16 4k;
            proxy_buffer_size 2k;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://mail-service:3000;
        }

        location /api/v1/user/ {
            proxy_buffers 16 4k;
            proxy_buffer_size 2k;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://auth-service:4000;
        }
    }
}

排查与解决方法

1. 确认后端服务的端口监听配置

  • 检查auth-service和mail-service的应用代码,必须确保服务监听在0.0.0.0:4000和0.0.0.0:3000(不能仅监听127.0.0.1,否则容器外部无法访问)。
  • 进入服务容器内部,用命令验证端口监听状态:
    # 进入auth-service容器
    docker exec -it auth-service bash
    # 检查端口4000是否监听
    netstat -tulpn | grep 4000
    

2. 验证容器间网络连通性

  • 从Nginx容器web中ping后端服务容器名,确认DNS解析和网络可达:
    docker exec -it web ping auth-service
    docker exec -it web ping mail-service
    
  • 尝试从Nginx容器直接访问后端服务端口,确认连接正常:
    # 测试auth-service
    docker exec -it web curl http://auth-service:4000
    # 测试mail-service
    docker exec -it web curl http://mail-service:3000
    
    如果curl失败,说明服务未正常启动或端口配置错误。

3. 检查服务容器的启动状态

  • 查看服务容器日志,确认应用是否正常启动:
    docker logs auth-service
    docker logs mail-service
    
    日志中如果有启动报错(如依赖缺失、端口占用),优先修复服务本身的问题。

4. 修正Nginx配置的潜在问题

  • 调整proxy_pass路径匹配:如果后端服务的路由不包含/api/v1/mail/前缀,需要在proxy_pass末尾添加/,将前缀后的路径转发到后端根路径:
    location /api/v1/mail/ {
        proxy_pass http://mail-service:3000/;
        # 其他配置保持不变
    }
    
  • 移除未使用的upstream backend配置(当前Nginx规则并未用到这个上游组,避免混淆)。

5. 重置Docker网络

  • 若网络存在异常,可重新创建网络:
    docker-compose down
    docker network rm backend-network
    docker-compose up -d
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:37:38