关键是要禁用proxy_request_buffering以实现边收边转,避免Nginx全量缓存请求体导致首字节延迟高;必须同步关闭proxy_buffering、proxy_cache,设置HTTP/1.1连接及延长超时时间。

要实现极低延迟的文件流转发,关键不是只关 proxy_buffering,而是必须同步禁用 proxy_request_buffering——它控制的是请求体(比如上传的视频、音频流、大文件分块)在到达后端前是否被 Nginx 全量缓存。默认开启时,Nginx 会等整个请求体收完再发给后端,这在流式场景下直接造成首字节延迟高、卡顿明显、实时性丧失。
为什么 proxy_request_buffering 必须关?
这个指令决定了 Nginx 处理客户端上传数据的方式:
- on(默认):Nginx 把整个请求体(哪怕几百 MB)先读进内存或磁盘临时文件,确认完整后再一次性转发给后端。适合表单提交、小文件上传,但彻底违背流式传输“边收边转”的本质。
- off:Nginx 收到一点数据就立刻转发一点,不等待、不拼装、不缓存。后端能实时拿到原始字节流,视频转码、AI 音频流处理、实时日志注入等场景依赖的就是这种行为。
适用场景与判断依据
以下情况建议明确设为 off:
- 前端通过
fetch或XMLHttpRequest流式上传大视频/音频,后端需逐帧处理 - IoT 设备持续推送传感器二进制流,服务端需毫秒级响应并触发告警
- 代理 WebSocket 升级前的长连接握手阶段,避免请求体被截断或延迟
- 使用
multipart/form-data上传超大文件且后端支持分块接收(如 S3 presigned URL 直传中转)
配置要点与协同参数
单独写 proxy_request_buffering off; 不够,必须配合以下设置才能稳定生效:
-
关闭响应缓冲:
proxy_buffering off;(防止后端返回的进度/状态流被二次积压) -
禁用代理缓存:
proxy_cache off;(避免 Nginx 错误缓存上传中的中间状态) -
保持 HTTP/1.1 连接:
proxy_http_version 1.1;+proxy_set_header Connection "";(防止连接被意外关闭) -
延长超时时间:
client_body_timeout 300s;和proxy_read_timeout 300s;(适应慢速上传或长流处理) -
限制单次读取大小(可选):
client_max_body_size 0;(不限制)或设合理上限,避免恶意大包耗尽资源
Kubernetes Ingress 中的落地方式
在基于 NGINX Ingress Controller 的集群中,不能直接改 nginx.conf,而是通过注解配置:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
注意:值必须是字符串 "off",不能写成 false 或省略引号。配置后需检查 Ingress Controller Pod 内生成的配置片段是否已生效:
kubectl exec -it










