Nginx 代理透传 chunked 需关闭 proxy_buffering off 并启用 HTTP/1.1;slice 模块与 chunked 无关,仅用于字节范围切片。

要让 Nginx 在 HTTP 代理场景下支持分片传输(即 Transfer-Encoding: chunked),关键不在于启用某个叫 “Slice 模块” 的功能——Nginx 官方并没有名为 “Slice 模块” 的模块用于处理 chunked 编码;真正相关的是 proxy_buffering、chunked_transfer_encoding 指令,以及后端响应是否实际使用了分块传输。
区分:slice 模块 ≠ chunked 传输
Nginx 确实有一个 ngx_http_slice_module(需编译启用),但它作用是将大文件**按字节范围切片**(如配合 Range 请求实现断点续传或 CDN 分片拉取),和 HTTP/1.1 的分块传输编码(Transfer-Encoding: chunked)无关。不要混淆二者。
代理中保持 chunked 传输的必要条件
当上游服务器(后端)以 Transfer-Encoding: chunked 返回响应时,Nginx 默认在开启 proxy_buffering on(默认开启)时会**缓存整个响应体再转发**,此时会移除原始的 Transfer-Encoding,改用 Content-Length(如果能确定长度)或关闭连接结束响应。这会破坏流式传输行为。
若需透传 chunked,应:
- 关闭代理缓冲:
proxy_buffering off; - 禁用缓存头操作(可选但推荐):
proxy_buffer_size 4k;和proxy_buffers 8 4k;不影响 chunked,但关闭 buffering 才是关键 - 确保未显式设置
proxy_http_version 1.0;(它会强制关闭 keepalive 并可能禁用 chunked) - 确认后端确实返回了
Transfer-Encoding: chunked且没有同时发送Content-Length(二者互斥)
常见配置示例(反向代理透传 chunked)
以下配置适用于需要流式响应的场景(如 SSE、长轮询、实时日志流):
location /stream/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_buffering off;
proxy_cache off;
proxy_redirect off;
}
说明:
-
proxy_http_version 1.1:确保支持 chunked(HTTP/1.0 不支持) -
proxy_set_header Connection '':清空 Connection 头,避免 Nginx 或客户端误处理连接控制 -
proxy_buffering off:核心项,使 Nginx 以流模式转发,不缓存响应体,从而保留原始 chunked 编码 -
proxy_cache off:防止缓存干扰流式响应
验证是否生效
用 curl 查看响应头与体:
curl -i http://your-nginx/stream/
成功时应看到响应头含 Transfer-Encoding: chunked,且响应体为十六进制长度 + 数据块格式(如 8\r\nhelloxxx\r\n0\r\n\r\n)。若出现 Content-Length 或响应延迟很久才开始返回,则 buffering 仍处于开启状态或后端未使用 chunked。










