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
相关产品推荐
相关产品推荐

