在使用 NGINX 作为反向代理服务器时,处理客户端请求体(如上传文件或大体积 POST 请求)的方式会直接影响应用性能与资源使用。其中,proxy_request_buffering
是一个非常关键但容易被忽略的配置项。
本文将详细介绍该指令的作用、典型使用场景及其在 Kubernetes(Ingress NGINX)环境中的配置方法。
一、什么是 proxy_request_buffering
?
proxy_request_buffering
是 NGINX 的一个 反向代理模块指令,用于控制 NGINX 在将客户端请求体转发给后端之前,是否先将其缓存在本地(内存或磁盘)。
✅ 语法
proxy_request_buffering on | off;
on
(默认):NGINX 会在转发请求前,先将整个请求体读完并缓存在本地。off
:NGINX 会 边读取请求体边转发到后端,即 流式转发。
二、为什么重要?有哪些影响?
✅ 启用(默认 on
)时:
- 请求体完整读入 NGINX 缓冲区后再发送到后端。
- 避免后端被慢速上传客户端阻塞(Slowloris 攻击防护)。
- 更利于请求体完整性验证(如文件大小检查)。
- 可能会使用更多 NGINX 主机的内存或磁盘。
✅ 关闭(off
)时:
- 实现流式转发:适合处理大文件上传,降低延迟。
- 对后端实时处理上传数据的服务(如视频流处理、websocket)更友好。
- 后端可能暴露于慢速客户端风险(除非自行控制超时)。
三、典型使用场景
场景 | 是否建议关闭 buffering | 说明 |
---|---|---|
大文件上传(如视频、镜像) | ✅ 建议关闭 | 减少 NGINX 内存/磁盘使用 |
实时视频流 / API 流数据接口 | ✅ 建议关闭 | 实现低延迟实时传输 |
普通 Web 表单提交 | ❌ 保持默认开启 | 更安全、控制资源使用 |
防御慢速客户端 | ❌ 保持开启 | 防止慢速上传拖垮后端资源 |
四、Kubernetes 中如何配置?
在 Ingress NGINX 中,可以通过注解的方式配置 proxy-request-buffering
。
✅ 配置方式(Ingress 注解)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-appannotations:nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
spec:...
注意:值必须是字符串
"on"
或"off"
,不能写成布尔值。
五、验证生效
你可以进入某个 NGINX Ingress Controller Pod 中,查看生成的 NGINX 配置:
kubectl exec -it <nginx-ingress-pod> -n ingress-nginx -- cat /etc/nginx/nginx.conf | grep proxy_request_buffering
输出类似:
proxy_request_buffering off;