关键是关闭 proxy_buffering off,同时禁用 proxy_cache、启用 HTTP/1.1 长连接、调大 proxy_read_timeout 等超时参数,并确保后端支持流式输出,实现边收边发。

要让 Nginx 代理大文件时支持流式传输(比如视频边下边播、SSE、或大文件分块下载),关键之一是关闭 proxy_buffering,并配合其他缓冲和超时参数调整,避免 Nginx 缓存整个响应再返回给客户端。
1. 关闭 proxy_buffering 并设置基础流式参数
在对应的 location 块中显式关闭缓冲,并禁用响应体缓存:
location /stream/ {
proxy_pass https://backend-server;
proxy_buffering off;
<pre class="brush:php;toolbar:false;"># 禁用响应头/体的临时磁盘缓存
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
proxy_max_temp_file_size 0;
# 强制实时转发,不等待后端关闭连接
proxy_http_version 1.1;
proxy_set_header Connection '';
}
其中 proxy_buffering off 是核心;proxy_max_temp_file_size 0 防止 Nginx 在内存不足时写临时文件,破坏流式行为。
2. 调整超时与连接保持参数
流式传输往往耗时长、连接持续久,需延长超时并启用 HTTP/1.1 长连接:
-
proxy_read_timeout 300:后端响应数据间隔超时(单位秒),根据业务设为 5 分钟或更长 -
proxy_send_timeout 300:Nginx 向客户端发送响应的超时间隔 -
proxy_ignore_client_abort off:默认即可(保持连接,即使客户端暂时断开重连) -
keepalive_timeout 65和proxy_http_version 1.1+proxy_set_header Connection ''共同确保后端复用连接
3. 可选:禁用压缩与缓存头干扰
若后端已压缩或你希望客户端直接处理原始流,避免 Nginx 中间介入:
-
gzip off;或gzip_disable "msie6";(如全局开启 gzip,此处可局部关闭) -
proxy_cache off;:确保未意外启用代理缓存 -
add_header X-Accel-Buffering no;:显式告知浏览器“不要缓冲”,对部分基于 Chromium 的播放器有帮助
4. 验证是否生效
可通过以下方式确认流式传输正常:
- 用
curl -v http://nginx/stream/big.mp4 | head -c 10000观察是否快速返回前几 KB(而非卡住等完整响应) - 查看 Nginx 日志中
$upstream_http_content_length是否为-(表示 chunked 或无长度),且响应头含Transfer-Encoding: chunked或明确的Content-Length - 浏览器开发者工具 Network 面板观察
Response是否随时间持续增长(progressive loading)
注意:后端服务本身也必须支持流式输出(如不调用 flush() 就直接 return、或使用 Response.write() 分段写入),否则仅改 Nginx 无效。关闭 proxy_buffering 后,Nginx 将以“收到即转发”模式工作,对后端稳定性和网络延迟更敏感,建议搭配健康检查和合理重试策略使用。











