Docker Compose中Nginx代理配置问题:localhost/api连接被拒绝
问题分析与解决方案
从错误日志可以明确两个核心问题:
nginx | 2023/06/01 21:57:50 [error] 31#31: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.26.0.1, server: , request: "GET /api HTTP/1.1", upstream: "http://172.26.0.4:4000/api", host: "localhost"
- Nginx未按预期转发路径:配置中
proxy_pass http://backend-stream/应该将/api路径替换为后端服务的根路径,但日志显示请求仍被转发到http://xxx:4000/api - Backend服务连接失败:4000端口被拒绝,说明服务未正常启动或未在该端口监听
1. 修正Nginx代理配置
方案A:调整路径转发逻辑
修改default.conf中的/api location块,确保路径正确重写:
upstream jenkins-stream { server jenkins:8080; } upstream backend-stream { server backend:4000; } server { listen 80; listen [::]:80; location /jenkins { proxy_pass http://jenkins-stream/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /api { proxy_pass http://backend-stream; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 重写路径,将/api前缀移除后转发到后端 rewrite ^/api/(.*)$ /$1 break; } }
方案B:简化配置(无需upstream时)
如果不需要负载均衡,直接指定后端地址并确保路径转发:
server { listen 80; listen [::]:80; location /jenkins { proxy_pass http://jenkins:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /api { proxy_pass http://backend:4000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
2. 检查Backend服务状态
- 查看服务日志,确认启动是否正常:
docker logs backend - 检查端口监听,确认服务在4000端口运行:
docker exec -it backend netstat -tulpn | grep 4000 - 添加重启策略:由于
depends_on仅保证容器启动顺序,MongoDB初始化可能滞后,给Backend添加自动重启:
在docker-compose.yml的backend服务块中加入:restart: unless-stopped
3. 验证网络连通性
在Nginx容器内测试能否访问Backend服务:
# 测试域名解析 docker exec -it nginx ping backend # 测试端口连通性 docker exec -it nginx curl http://backend:4000
4. 重新部署服务
修改配置后重启所有服务:
docker-compose down docker-compose up -d
完成后访问localhost/api验证Backend代理,访问localhost/jenkins验证Jenkins代理是否正常。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

