Nginx大文件上传失败的核心是定位中断环节:客户端→Nginx(查client_max_body_size和client_body_timeout)、Nginx→后端(查proxy_send_timeout或fastcgi_send_timeout)、Nginx→客户端(查send_timeout),结合error.log中“upstream timed out while sending request to upstream”及tcpdump抓包确认RST发起方。

排查 Nginx 中因数据发送超时导致客户端上传大文件失败,核心是确认请求在哪个环节被中断——是客户端发到 Nginx 的过程(接收超时),还是 Nginx 转发给后端(如 FastCGI、proxy)的过程(发送超时),或是 Nginx 向客户端回传响应时卡住(发送响应超时)。常见表现是上传中途断连、返回 504 Gateway Timeout 或直接连接重置(Connection reset by peer),但日志里未必明确提示“发送超时”,需结合配置与日志交叉分析。
检查 client_max_body_size 和 client_body_timeout
这两个指令控制 Nginx 接收客户端请求体的行为。若上传大文件时被截断或返回 413 Request Entity Too Large,说明 client_max_body_size 不足;若上传过程中长时间无数据到达 Nginx,触发中断,则可能是 client_body_timeout 过短(默认 60s)。该超时针对“两次读取请求体之间”的间隔,不是整个上传耗时。
- 确认上传路径是否匹配了正确的 server 或 location 块,避免配置未生效
- 临时调高值测试:例如
client_max_body_size 2G;、client_body_timeout 300s; - 注意:修改后需重载 Nginx(
nginx -s reload),而非重启
定位是 proxy_send_timeout 还是 fastcgi_send_timeout 触发的超时
如果 Nginx 作为反向代理(如转发给 Node.js、Python 应用),或使用 FastCGI(如 PHP-FPM),上传失败常发生在 Nginx 等待后端响应时。此时真正“发送超时”的是 Nginx 向后端发送完整请求体的过程(proxy_send_timeout / fastcgi_send_timeout),或等待后端返回响应头的间隔(proxy_read_timeout / fastcgi_read_timeout)。错误日志中出现 upstream timed out 且 upstream 是你的后端地址,就指向这里。
- 查看 error.log 中类似
upstream timed out (110: Connection timed out) while sending request to upstream的记录 - 对应调整:
proxy_send_timeout 600;(单位秒,建议 ≥ 预估最大上传耗时) - 同时检查
proxy_buffering off;是否开启——关闭缓冲会令 Nginx 边收边转,对慢后端更敏感,但能减少内存占用;开启则需关注proxy_buffer_size和proxy_buffers
启用详细日志并抓包验证实际行为
仅靠默认日志很难区分是网络抖动、客户端主动断开,还是 Nginx 主动终止。需开启更细粒度记录:
- 在 http/server/location 块中添加:
log_format debug '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time $upstream_connect_time';并在 access_log 中使用该格式 - 关键字段:
$request_time(整个请求耗时)、$upstream_response_time(后端响应耗时)、$upstream_connect_time(建连耗时)——若前者很大而后两者为空或极小,说明卡在 Nginx 自身处理或发送阶段 - 在服务器侧用
tcpdump抓包(如tcpdump -i any port 80 -w upload.pcap),上传时观察 FIN/RST 包由哪端发出:客户端发 RST 表示它先放弃;Nginx 发 RST 或 FIN 后无响应,说明它主动中断
检查系统级限制和中间设备干扰
Nginx 配置再合理,也可能被底层掐断。常见干扰源包括:
- Linux 内核参数:
net.ipv4.tcp_fin_timeout、net.ipv4.ip_local_port_range影响连接复用;net.core.somaxconn过低会导致 accept 队列溢出,尤其并发上传时 - 云厂商 SLB/ALB/WAF:很多负载均衡器自带 60–300 秒的空闲连接超时,且无法配置。上传大文件时若中间无数据交互,SLB 可能静默断连,现象是客户端看到连接中断,Nginx 日志却无异常
- 防火墙或 NAT 设备:企业网出口、家用路由器常有连接老化机制(如 300 秒无流量即清理连接表),导致长传中断
不复杂但容易忽略


















