Nginx代理緩衝 proxy_buffering 配置

linkfun發表於2020-03-07

什麼是代理緩衝

Nginx作為一個常用的反向代理,提供了代理緩衝的功能。它允許nginx將server端的響應讀取下來快取在本地記憶體或磁碟中,再已合適的速度傳送給客戶端。

為什麼要有代理緩衝

在網際網路中,nginx作為反向代理層,往往和server是在同區機房的。這意外這nginx和server之間的網路質量很好,nginx可以用很快的速度從server端讀取響應。

但是客戶端往往是使用者網路,到nginx的機房網路質量不可控,肯定是要遠遠低於nginx到後端server的網速。

這就會帶來一個問題:因為客戶端到nginx的網速過慢,導致nginx只能以一個較慢的速度將響應傳給客戶端;進而導致後端server也只能以同樣較慢的速度傳遞響應給nginx,造成一次請求連線耗時過長。

在高併發的情況下,後端server可能會出現大量的連線積壓,最終拖垮server端。

代理緩衝的優缺點

代理緩衝的優點

開啟代理緩衝後,nginx可以用較快的速度儘可能將響應體讀取並緩衝到本地記憶體或磁碟中,然後同時根據客戶端的網路質量以合適的網速將響應傳遞給客戶端。

這樣既解決了server端連線過多的問題,也保證了能持續穩定的像客戶端傳遞響應。

代理緩衝的缺點

  1. 開啟代理緩衝會消耗nginx伺服器的記憶體,如果請求過多,可能會導致nginx記憶體消耗過大;所以緩衝區的大小設定需要根據實際的伺服器配置和請求量進行評估。

  2. 在響應過大的情況下,設定的緩衝區無法存下整個響應體,nginx會將剩餘的內容寫到磁碟臨時檔案中。在請求量較大的情況下,可能會導致nginx伺服器磁碟io過高。而往往臨時檔案都存放在/tmp下,而/tmp目錄一般掛載在系統盤上,系統盤io過高會進一步導致系統負載上漲。

  3. 在客戶端網路質量很好的情況下,比如客戶端到nginx也是同機房內,這時關閉代理緩衝直接將響應實時轉發給客戶端效率更高。

代理緩衝的配置引數

nginx對於控制代理緩衝區,有一些常用的配置引數。這些引數都是可以作用於http塊、server塊或者location塊中。

1. proxy_buffering

Syntax:	proxy_buffering on | off;
Default:	proxy_buffering on;
Context:	http, server, location
複製程式碼

該引數使用者控制開啟或關閉代理緩衝區。

當開啟代理緩衝區時,nginx會盡快的從server端讀取響應並快取在記憶體分配的緩衝區中。代理緩衝區的大小由proxy_buffer_size和proxy_buffers引數指定。

當響應大小超出記憶體緩衝區時,一部分響應體可以儲存在磁碟臨時檔案中。磁碟臨時檔案的大小由proxy_max_temp_file_size和proxy_temp_file_write_size引數指定。

2. proxy_buffer_size

Syntax:	proxy_buffer_size size;
Default:	proxy_buffer_size 4k|8k;
Context:	http, server, location
複製程式碼

該引數用於設定從server端讀取初始部分響應(the first part of the response)所使用的快取大小。這部分通常包含了一個小的response header。

通常,該緩衝區大小設定為一個記憶體頁的大小,具體是4k或8k,取決於伺服器平臺。也可以把它設定的更小,但是沒必要設定過大了,因為只是用於緩衝初始部分響應。

值得注意的是,proxy_buffer_size引數並不受proxy_buffering開啟或關閉的影響。它始終都是生效的。

3. proxy_buffers

Syntax:	proxy_buffers number size;
Default:	proxy_buffers 8 4k|8k;
Context:	http, server, location
複製程式碼

該引數用於設定從server端讀取響應所使用的緩衝區個數和大小。通常預設情況下,單個緩衝區大小設定為一個記憶體頁的大小,如4k或8k。

值得注意的是,這裡設定的緩衝區大小是針對每個請求連線而言的。也就是說對於每一個連線,都會分配 ”number*size“大小的記憶體緩衝區。

另外需要注意,要根據伺服器配置和請求量評估緩衝區配置大小;避免出現nginx將記憶體耗盡的情況。

4. proxy_busy_buffers_size

Syntax:	proxy_busy_buffers_size size;
Default:	proxy_busy_buffers_size 8k|16k;
Context:	http, server, location
複製程式碼

該引數用於設定當還未從server端讀取到完整響應時,允許開始給客戶端傳送響應的緩衝區大小。

在指定大小的緩衝區進入busy狀態後將無法再寫入,而剩餘的緩衝區可以同時繼續從server端讀取響應,或者將響應寫入磁碟臨時檔案。

通常該引數值設定為proxy_buffer_size和proxy_buffers中單個buffer之和,也就是單個記憶體頁的2倍。

5. proxy_max_temp_file_size

Syntax:	proxy_max_temp_file_size size;
Default:	proxy_max_temp_file_size 1024m;
Context:	http, server, location
複製程式碼

該引數用於設定磁碟臨時檔案的最大size。

當server端返回的整個響應超出proxy_buffering和proxy_buffers設定的記憶體緩衝區大小時,剩餘的響應體可以儲存在一個磁碟臨時檔案中。proxy_max_temp_file_size指定了該臨時檔案的最大大小。

而一次能寫入磁碟臨時檔案的資料大小由proxy_temp_file_write_size引數指定。

注意,proxy_max_temp_file_size引數設定為0可以禁止將響應儲存到磁碟臨時檔案中。

6. proxy_temp_file_write_size

Syntax:	proxy_temp_file_write_size size;
Default:	proxy_temp_file_write_size 8k|16k;
Context:	http, server, location
複製程式碼

該引數用於設定每次寫入磁碟臨時檔案的大小。

通常該引數值設定為proxy_buffer_size和proxy_buffers中單個buffer之和,也就是單個記憶體頁的2倍。

代理緩衝配置樣例

# 開啟proxy_buffering
    proxy_buffering                 on;
    proxy_buffer_size               4k;
    proxy_buffers                   4       4k;
    proxy_busy_buffers_size         8k;
    proxy_max_temp_file_size        0;
複製程式碼

相關文章