使用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容器直接访问后端服务端口,确认连接正常:
如果curl失败,说明服务未正常启动或端口配置错误。# 测试auth-service docker exec -it web curl http://auth-service:4000 # 测试mail-service docker exec -it web curl http://mail-service:3000
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
相关产品推荐
相关产品推荐

