Nginx后Docker容器运行异常:Django应用报连接重置错误
排查Nginx与Docker容器间的连接重置问题
首先,这个recv() failed (104: Connection reset by peer)错误核心是Nginx和上游Gunicorn容器的连接被意外中断了,结合你的场景(Django+Gunicorn容器、Registry容器,Nginx做反向代理),我整理了几个最常见的排查方向和解决方法:
1. 容器网络配置不匹配
- 核对Nginx upstream与容器端口的对应关系
如果你用Docker内部网络(推荐方式),Nginx的upstream必须指向Django容器的内部端口或者容器名(前提是Nginx和Django容器在同一个Docker网络组里),比如:
要是用了端口映射把容器端口转到宿主机,得确认宿主机端口没被占用,同时Nginx upstream要写upstream django_app { server django_container:8000; # 这里的django_container是你的Django容器名 }localhost:映射端口或者宿主机IP+端口。 - 测试容器间的连通性
进到Nginx容器(或者宿主机),用curl验证Gunicorn服务是否能访问:
如果curl也失败,那问题大概率出在Gunicorn容器本身的服务启动或者网络配置上。# 内部网络直接用容器名+端口 curl http://django_container:8000 # 端口映射就用宿主机IP+映射端口 curl http://127.0.0.1:8000
2. Gunicorn监听地址配置错误
很多人在容器里跑Gunicorn时,默认只监听127.0.0.1:8000——这个地址只能容器内部访问,外部(包括Nginx)根本连不上!必须改成监听0.0.0.0:8000,确保容器服务能接受外部连接。
启动Gunicorn的命令应该是这样的:
gunicorn --bind 0.0.0.0:8000 your_project.wsgi:application
另外记得查看Gunicorn容器的日志,看看有没有启动失败、依赖缺失的报错:
docker logs django_container_name
3. Nginx超时/缓冲配置不足
你的请求是POST类型,这类请求往往数据量更大,要是Nginx的超时设置太短、缓冲不够,就会触发连接中断。可以调整Nginx的相关配置:
server { # 其他原有配置... proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; proxy_buffers 8 16k; proxy_buffer_size 32k; }
改完后重启Nginx:nginx -s reload
4. Docker资源限制导致服务崩溃
如果给Django容器分配的CPU、内存太少,Gunicorn在处理请求时可能直接崩溃,进而导致连接重置。可以检查容器的资源配置:
docker inspect django_container_name | grep -A 10 "Resources"
要是发现内存/CPU限制过低,适当调高后重启容器试试。
5. 防火墙/安全组阻断连接
哪怕是Docker环境,宿主机的防火墙(比如iptables、ufw)或者云安全组也可能阻断Nginx和容器之间的连接。检查宿主机的防火墙规则,确保相关端口(比如8000)允许内部访问。
内容的提问来源于stack exchange,提问作者user2573436
相关产品推荐
相关产品推荐

