Nginx代理服務 - 代理緩衝區、代理重新定義請求頭、代理連線超時
1. 代理緩衝區
代理伺服器可以快取一些響應資料,來減少I/O損耗,資料預設儲存在記憶體中,當記憶體不夠時,會儲存到硬碟上。
proxy_buffering這個引數用來控制是否開啟後端響應內容的緩衝區,如果這個設定為off,那麼proxy_buffers和proxy_busy_buffers_size這兩個指令將會失效。 但是無論proxy_buffering是否開啟,對proxy_buffer_size都是生效的。
proxy_buffering開啟的情況下,nignx會把後端返回的內容先放到緩衝區當中,然後再返回給客戶端(邊收邊傳,不是全部接收完再傳給客戶端)。 臨時檔案由proxy_max_temp_file_size和proxy_temp_file_write_size這兩個指令決定的。
如果proxy_buffering關閉,那麼nginx會立即把從後端收到的響應內容傳送給客戶端,每次取的大小為proxy_buffer_size的大小,這樣效率肯定會比較低。
注: proxy_buffering啟用時,要提防使用的代理緩衝區太大。這可能會吃掉你的記憶體,限制代理能夠支援的最大併發連線數。
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
後端伺服器的響應頭會放到proxy_buffer_size當中,這個大小預設等於proxy_buffers當中的設定單個緩衝區的大小。 proxy_buffer_size只是響應頭的緩衝區,沒有必要也跟著設定太大。
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
proxy_buffers的緩衝區大小一般會設定的比較大,以應付大網頁。 proxy_buffers當中單個緩衝區的大小是由系統的記憶體頁面大小決定的,Linux系統中一般為4k。 proxy_buffers由緩衝區數量和緩衝區大小組成的。總的大小為number*size。
若某些請求的響應過大,則超過_buffers的部分將被緩衝到硬碟(緩衝目錄由_temp_path指令指定), 當然這將會使讀取響應的速度減慢, 影響使用者體驗. 可以使用proxy_max_temp_file_size指令關閉磁碟緩衝.
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
proxy_busy_buffers_size不是獨立的空間,他是proxy_buffers和proxy_buffer_size的一部分。nginx會在沒有完全讀完後端響應的時候就開始向客戶端傳送資料,所以它會劃出一部分緩衝區來專門向客戶端傳送資料(這部分的大小是由proxy_busy_buffers_size來控制的,建議為proxy_buffers中單個緩衝區大小的2倍),然後它繼續從後端取資料,緩衝區滿了之後就寫到磁碟的臨時檔案中。
Syntax: proxy_busy_buffers_size size;
Default: proxy_busy_buffers_size 8k|16k;
Context: http, server, location
2. 重新定義或新增傳遞給代理伺服器的請求頭
Syntax: proxy_set_header field value;
Default:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
允許重新定義或新增傳遞給代理伺服器的請求頭。value可以包含文字、變數或者它們的組合。 當前配置級別中沒有定義proxy_set_header指令時,會從上一級別繼承配置。 預設情況下,只有兩個請求頭會被重新定義:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
如果啟用快取,來原始請求的請求頭 “If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, 和 “If-Range” 將不會被代理伺服器傳遞。
可以通過下面的配置使請求頭 “Host” 不被代理伺服器替換:
proxy_set_header Host $http_host;
3. 代理超時
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
定義Nginx作為代理,到後端伺服器中間的連線超時時間,預設為60秒。
應該注意的是,這個超時時通常不能超過75秒。
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
定義了從代理伺服器讀取響應的超時時間,預設為60秒。
超時只設置在兩個連續的讀取操作之間,而不是整個響應的傳輸。
如果代理伺服器在這個時間內沒有傳輸任何資料,那麼連線就關閉了。
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
定義了將請求傳送到代理伺服器的超時時間,預設為60秒。
超時只設置在兩個連續的寫操作之間,而不是整個請求的傳輸。
如果代理伺服器在這個時間內沒有收到任何資料,那麼連線就關閉了。
4. 代理常用配置註解
location / {
# 配置反向代理到本機的8080埠
proxy_pass http://127.0.0.1:8080;
# 配置請求客戶端真實的 Host 資訊
proxy_set_header Host $http_host;
# 配置請求使用者真實的IP資訊
proxy_set_header X-Real-IP $remote_addr;
# 連線超時時間為30秒
proxy_connect_timeout 30;
# 傳送請求超時時間為60秒
proxy_send_timeout 60;
# 讀取響應超時時間為60秒
proxy_read_timeout 60;
# 開啟代理緩衝區
proxy_buffering on;
# 響應頭的緩衝區設為32k
proxy_buffer_size 32k;
# 網頁內容緩衝區個數為4,單個大小為128k
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
# 緩衝區臨時檔案最大為 256k
proxy_max_temp_file_size 256k;
}