nginx大文件上传优化核心是匹配连接生命周期与上传行为,需精准调大worker并发连接数(worker_rlimit_nofile 65535、worker_connections 65535)、启用keepalive复用(keepalive_timeout 30s、keepalive_requests 100)、为上传路径隔离资源(延长client_body_timeout等超时、proxy_request_buffering off)、并限制非必要行为(reset_timedout_connection on、client_max_body_size 2g)。

大文件上传对 Nginx 负载均衡器的连接管理构成双重压力:既要维持大量长时连接,又要避免单个上传耗尽 worker 资源。优化核心不是“堆参数”,而是让连接生命周期与上传行为匹配——重点控制连接复用、资源隔离和超时协同。
精准调大 worker 级并发连接数
每个 worker 进程必须能承载多路并发上传流:
-
worker_rlimit_nofile 65535(提升进程级文件描述符上限) -
events { worker_connections 65535; }(单 worker 支持约 6.5 万连接) - 若 CPU 核心数 ≥4,建议
worker_processes auto;,避免单核过载
启用并合理设置 keepalive 连接复用
上传过程常含多次分片请求(如 tus 协议),复用连接可显著降低握手开销:
-
keepalive_timeout 30s;(不宜过长,防止连接堆积) -
keepalive_requests 100;(单连接最多处理 100 次请求,防老化) - 后端 upstream 中显式开启长连接:
upstream backend { server 10.0.1.10:8080; keepalive 32; # 每个 worker 与后端保持最多 32 个空闲连接 }
为上传路径做连接资源隔离
避免普通请求与上传请求争抢缓冲区和超时资源:
- 在
location /api/upload块中单独配置:-
client_header_timeout 3600s;(等待请求头,一般 60s 够用,但断点续传需更长) -
client_body_timeout 3600s;(接收分片间隔,覆盖弱网重传窗口) -
proxy_read_timeout 3600s;和proxy_send_timeout 3600s;(前后端双向透传保障)
-
关闭请求体预读,释放连接持有压力
默认 proxy_request_buffering on 会让 Nginx 等待整个文件收完才发给后端,导致连接长时间挂起:
- 必须在上传 location 中设
proxy_request_buffering off;(Nginx 1.13.10+) - 同步设
proxy_buffering off;,避免响应阶段缓存阻塞 - 此时连接不再“卡住”,而是边收边转,内存占用恒定,worker 可快速腾出资源处理新请求
限制非必要连接行为,防资源挤占
-
reset_timedout_connection on;(及时回收超时连接,释放 fd) -
client_max_body_size 2G;(写在 location 内,不全局放开,防恶意放大攻击) -
client_body_temp_path /var/tmp/nginx-upload/ 1 2;(指定 SSD 路径,避免默认/var/lib/nginx/bodyI/O 瓶颈)
不复杂但容易忽略











