在使用 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;