nginx worker process 处理上传请求采用“边收边传”模式,需关闭 proxy_request_buffering off 并配合 client_body_timeout、proxy_read/send_timeout 等参数实现稳定流式上传,避免全量缓冲导致卡顿或 oom。

Nginx 的 Worker Process 处理上传请求流,核心不是“缓存后转发”,而是**边收边传**——尤其在大文件场景下,必须打破默认的全量缓冲行为,否则上传会卡在 99%、内存暴涨甚至 OOM。
上传请求进入 Worker 的起点
客户端发起上传(如 POST /upload),TCP 连接建立后,Worker 进程通过 epoll 监听到该连接上的可读事件,触发 ngx_http_wait_request_handler → ngx_http_process_request_line → ngx_http_process_request_headers,完成请求头解析。此时 Nginx 已知是上传请求(Content-Length 或 Transfer-Encoding: chunked),但尚未读取请求体。
关键:请求体如何被接收与流转
默认情况下,Nginx 启用 proxy_request_buffering on,会把整个请求体(比如 5GB 视频)先写入内存或临时磁盘文件,等全部收完才交给后端——这完全违背流式上传意图。
- 必须在对应
location块中显式关闭:proxy_request_buffering off; - 关闭后,Worker 不再等待完整 body,而是在收到一部分数据后立即调用
proxy_pass转发给 upstream(如后端服务) - 数据以“流”形式持续从客户端 socket → Worker 内存缓冲区 → upstream socket,中间不落盘、不拼整块
配套参数决定流是否稳定可靠
仅关 buffering 不够,还需协同调整超时与缓冲策略:
-
client_body_timeout 3600:允许客户端分多次发送(弱网/断点续传必备) -
proxy_read_timeout 3600和proxy_send_timeout 3600:匹配后端处理耗时(如校验、转码、分片落盘) -
proxy_buffering off:避免响应阶段(如 tus 上传进度回调)也被缓冲阻塞 -
proxy_http_version 1.1+proxy_set_header Connection "":保持长连接,防止中间代理或防火墙主动断连
临时文件与资源边界需可控
即使关闭 buffering,当单次接收的数据超过 client_body_buffer_size(默认 8KB),Nginx 仍会写临时文件:
- 建议显式设置:
client_body_buffer_size 512k; - 指定路径并确保可写:
client_body_temp_path /var/tmp/nginx/client_body 1 2; - 磁盘空间不足或权限错误会导致上传直接 500,而非超时











