nginx流式转发需关闭proxy_request_buffering并协同配置:client_body_buffer_size 0、proxy_http_version 1.1、proxy_set_header connection ''、client_body_timeout 30s等,k8s ingress中须用注解nginx.ingress.kubernetes.io/proxy-request-buffering: "off"实现。

要实现流式数据的极速转发,核心是让 Nginx 放弃对请求体的预读缓存,改为“边收边传”。proxy_request_buffering off 就是达成这一目标的关键开关,但它不是孤立生效的,必须配合其他关键参数协同工作。
明确哪些场景必须关闭 proxy_request_buffering
该指令默认为 on,Nginx 会等整个请求体(比如一个 200MB 的视频分片或 AI 推理的语音 chunk)全部接收完毕,再一次性转发给后端。这对流式场景会造成不可接受的延迟:
- 大文件分片上传:Vue 或前端 SDK 做断点续传时,单个分片可能达几十 MB,缓存等待会触发超时或缓冲区溢出
- AI 推理流式输入:语音识别、多模态模型需要首 chunk 到达即启动计算,不能等完整 body
- IoT 实时帧注入:设备以 50–100ms 间隔持续上报二进制帧,端到端延迟超过 200ms 就影响告警有效性
- SSE 或自定义 event-stream 接口:后端按需生成并 flush 数据,Nginx 缓存会阻塞首字节时间(TTFB)
关闭后 Nginx 的真实行为变化
设为 off 后,Nginx 不再扮演“中转仓库”,而是变成“透明管道”:
- TCP 数据包一到达,立刻转发到 upstream,不暂存在内存或磁盘
- 不再校验 Content-Length 是否与实际 body 长度一致(后端需自行处理不完整或提前中断的请求)
- proxy_max_temp_file_size 失效,不会写临时文件
- 放弃 Slowloris 类慢速攻击防护能力——这点必须由后端服务或前置 WAF 补位
生产环境必须同步调整的配套配置
只写一行 proxy_request_buffering off; 很容易引发新问题。以下参数需成组设置:
-
禁用请求体内存缓冲:显式设置
client_body_buffer_size 0;(值为 0 表示不分配任何内存缓冲区) -
限制单连接带宽:用
limit_rate_after 1m; limit_rate 10m;防止单个上传流吃光代理节点出口带宽 -
收紧超时控制:设置
client_body_timeout 30s;和proxy_read_timeout 300s;,避免弱网下连接长期挂起 -
确保协议兼容性:启用 HTTP/1.1 并清除 Connection 头:
proxy_http_version 1.1; proxy_set_header Connection '';
Kubernetes Ingress 中的正确落地方式
若使用 NGINX Ingress Controller,无法直接改 nginx.conf,需通过注解声明:
-
nginx.ingress.kubernetes.io/proxy-request-buffering: "off"(注意:必须是字符串 "off",不是false或0) - 建议同时添加:
nginx.ingress.kubernetes.io/proxy-body-size: "0"(禁用 body 大小上限检查) - 以及:
nginx.ingress.kubernetes.io/client-body-timeout: "30"(单位秒)
这些注解需加在对应 Ingress 资源的 metadata.annotations 下,作用于特定 path 或 host 级别,不影响全局策略。











