Django服务器触发ConnectionResetError: [Errno 104]连接被对端重置问题求解
问题背景
- 服务器运行过程中无明确诱因随机出现连接错误
- 错误触发时所有请求被完全阻断,无需人工干预数分钟后即可自动恢复正常
- 初步推测问题可能和文件上传相关的线程处理逻辑有关,尚未完成验证
错误堆栈
Exception occurred during processing of request from ('0.0.0.7', 23266) web_1 | Traceback (most recent call last): web_1 | File "/usr/local/lib/python3.9/socketserver.py", line 683, in process_request_thread web_1 | self.finish_request(request, client_address) web_1 | File "/usr/local/lib/python3.9/socketserver.py", line 360, in finish_request web_1 | self.RequestHandlerClass(request, client_address, self) web_1 | File "/usr/local/lib/python3.9/socketserver.py", line 747, in __init__ web_1 | self.handle() web_1 | File "/usr/local/lib/python3.9/site-packages/django/core/servers/basehttp.py", line 171, in handle web_1 | self.handle_one_request() web_1 | File "/usr/local/lib/python3.9/site-packages/django/core/servers/basehttp.py", line 179, in handle_one_request web_1 | self.raw_requestline = self.rfile.readline(65537) web_1 | File "/usr/local/lib/python3.9/socket.py", line 704, in readinto web_1 | return self._sock.recv_into(b) web_1 | ConnectionResetError: [Errno 104] Connection reset by peer
排查思路
1. 上传逻辑关联验证
- 在Django中添加全量请求日志中间件,记录每个请求的接口路径、请求体大小、处理耗时、来源IP,匹配错误发生的时间点是否对应集中的大文件上传请求
- 对文件上传接口做并发压测,模拟10~50倍日常流量的大文件上传场景,观察是否能复现请求阻断问题,压测过程中同步监控服务进程的线程数、内存占用、打开文件句柄数量
2. 系统内核参数排查
- 执行
ulimit -n检查服务进程的最大打开文件句柄限制,连接数过高导致句柄耗尽时会出现随机连接中断,可临时调大限制后观察问题是否复现 - 检查TCP内核参数配置:确认
net.core.somaxconn(TCP监听队列大小)、net.ipv4.tcp_tw_reuse(TIME_WAIT连接复用)、net.ipv4.tcp_fin_timeout(TIME_WAIT回收超时)参数配置是否合理,大量TIME_WAIT连接堆积会导致新连接被拒绝
3. 服务部署配置排查
- 你当前使用的是Django自带的开发服务器(runserver),该服务为单进程多线程模型,并发处理能力极弱,高并发场景下极易出现请求阻塞。建议替换为Gunicorn、uWSGI等生产级WSGI服务器,配置合理的worker进程数和线程数
- 检查WSGI服务的请求队列长度、超时时间配置,队列满后新请求会被直接重置,就会触发你遇到的ConnectionResetError报错
4. 网络层排查
- 检查服务端和客户端之间的防火墙、WAF、负载均衡等中间设备的会话超时配置,会话超时后中间设备会主动断开连接,触发连接重置
- 错误触发时执行
netstat -anp统计当前服务器的TCP连接状态,重点统计ESTABLISHED、TIME_WAIT、CLOSE_WAIT状态的连接数量,确认是否为连接耗尽导致的阻塞
内容的提问来源于stack exchange,提问作者Mitesh
相关产品推荐
相关产品推荐

