Nginx无法连接Django/Gunicorn容器,访问返回502错误求助
解决DigitalOcean部署后端服务的502错误问题
一、错误日志分析
Nginx返回502错误,对应日志如下:
2023/12/01 10:05:43 [error] 31#31: *507 upstream timed out (110: Connection timed out) while connecting to upstream, client: 141.101.98.150, server: mydomaine.com, request: "GET / HTTP/1.1", upstream: "http://172.27.0.7:5001/", host: "mydomaine.com"
核心问题:Nginx无法与上游服务(dev容器)建立连接,超时导致502错误。
二、关键配置修正与排查步骤
1. 修正Nginx代理地址错误
你的Nginx配置中,proxy_pass指向了http://dev:5001,但Docker容器间通信需使用容器内部端口,而非宿主机映射端口。
查看dev容器的Docker Compose配置:
dev: ... ports: - 5001:6000 ...
其中5001是宿主机对外端口,6000是容器内gunicorn服务绑定的端口。因此需修改Nginx配置:
location / { proxy_pass http://dev:6000; # 改为容器内部端口6000 proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
2. 检查dev容器运行状态
执行命令确认dev容器是否正常启动:
docker-compose ps dev
若容器未运行或频繁重启,查看容器日志定位问题:
docker-compose logs dev
需重点排查:
- 数据库连接:确认db_dev容器正常运行,
POSTGRES_HOST环境变量已设为db_dev - 启动脚本故障:
start.sh中makemigrations或migrate命令是否报错,导致gunicorn未启动 - 依赖缺失:检查Dockerfile中编译依赖(如postgresql-dev)是否正确安装
3. 验证容器间通信
进入webserver容器,直接访问dev容器的6000端口,确认服务可达:
docker-compose exec webserver curl http://dev:6000
若访问失败,说明dev容器内部的gunicorn服务未正常启动,需进一步排查容器日志和启动脚本。
4. 补充优化(可选)
若服务启动较慢,可在Nginx的location块中添加超时配置,避免过早触发超时:
proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s;
三、修复流程
- 修改Nginx配置中的
proxy_pass地址为http://dev:6000 - 重启Nginx容器:
docker-compose restart webserver - 确认dev容器正常运行,gunicorn服务已启动
- 重新访问服务验证是否恢复正常
内容的提问来源于stack exchange,提问作者B. Mohammad
相关产品推荐
相关产品推荐

