部署Django-Docker-Nginx项目遇Nginx 502错误求助
排查Nginx 502 Bad Gateway(uWSGI连接拒绝)问题
核心问题定位
Nginx容器无法连接到上游uWSGI服务(uwsgi://my_ip:9000),SSL证书验证通过仅说明HTTPS层面配置正常,问题出在容器间的上游服务连接环节。
分步排查方案
1. 验证uWSGI服务状态
- 查看Django容器日志,确认uWSGI是否成功启动:
重点排查是否有端口绑定失败、Django项目加载报错等信息。docker logs <你的Django容器名称> - 进入Django容器,检查9000端口是否被监听:
确保输出显示docker exec <你的Django容器名称> netstat -tulpn | grep 90000.0.0.0:9000(监听容器所有网络地址),而非127.0.0.1:9000(仅容器本地可访问)。
2. 修正Docker网络与上游地址配置
- 替换宿主机IP为服务名:Docker容器间优先用服务名做DNS解析,而非宿主机IP。修改
default-ssl-conf.tpl中的上游配置块:upstream django { server <你的Django服务名>:9000; # 对应docker-compose中Django服务的name字段 } - 确认Django与Nginx服务在同一自定义网络:检查
docker-compose-prod.yml,确保两者加入同一网络,示例配置:services: django: # ...其他配置项 networks: - app-network nginx: # ...其他配置项 networks: - app-network networks: app-network: driver: bridge - 测试Nginx容器能否解析Django服务名:
能正常ping通则网络连通性无问题。docker exec <你的Nginx容器名称> ping <你的Django服务名>
3. 检查uWSGI配置细节
- 确认uWSGI配置文件(如
uwsgi.ini)中socket参数设置为:
若设置为socket = 0.0.0.0:9000127.0.0.1:9000,Nginx容器无法跨网络访问;若使用Unix Socket,需确保Nginx容器挂载了相同的卷,且Socket文件权限正确(如chmod 666 /path/to/socket.sock)。
4. 排除防火墙干扰
- 若你坚持用宿主机IP访问uWSGI,需确认DigitalOcean防火墙及宿主机UFW是否放行9000端口:
但更推荐用容器间网络访问,无需暴露9000端口到公网。sudo ufw allow 9000/tcp
5. 重启服务验证
修改配置后,重启所有服务:
docker-compose -f docker-compose-prod.yml down && docker-compose -f docker-compose-prod.yml up -d
再次查看Nginx容器日志,确认是否还有连接拒绝错误。
内容的提问来源于stack exchange,提问作者DjMicCheck
相关产品推荐
相关产品推荐

