1. 程式人生 > >Nginx代理服務 - 代理緩衝區、代理重新定義請求頭、代理連線超時

Nginx代理服務 - 代理緩衝區、代理重新定義請求頭、代理連線超時

1. 代理緩衝區

代理伺服器可以快取一些響應資料,來減少I/O損耗,資料預設儲存在記憶體中,當記憶體不夠時,會儲存到硬碟上。

proxy_buffering

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_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的緩衝區大小一般會設定的比較大,以應付大網頁。 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_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. 重新定義或新增傳遞給代理伺服器的請求頭

proxy_set_header

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. 代理超時

proxy_connect_timeout

Syntax:    proxy_connect_timeout time;
Default:    proxy_connect_timeout 60s;
Context:    http, server, location

定義Nginx作為代理,到後端伺服器中間的連線超時時間,預設為60秒。
應該注意的是,這個超時時通常不能超過75秒。

proxy_read_timeout

Syntax:    proxy_read_timeout time;
Default:    proxy_read_timeout 60s;
Context:    http, server, location

定義了從代理伺服器讀取響應的超時時間,預設為60秒。
超時只設置在兩個連續的讀取操作之間,而不是整個響應的傳輸。
如果代理伺服器在這個時間內沒有傳輸任何資料,那麼連線就關閉了。

proxy_send_timeout

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;

}