天天看點

nginx 反向代理之 proxy_buffering

proxy_buffering主要是實作被代理伺服器的資料和用戶端的請求異步。

為了友善了解,我們定義三個角色,A為用戶端,B為代理伺服器,C為被代理伺服器。

當proxy_buffering開啟,A發起請求到B,B再到C,C回報的資料先到B的buffer上,然後B會根據proxy_busy_buffer_size來決定什麼時候開始把資料傳輸給A。

在此過程中,如果所有的buffer被寫滿,資料将會寫入到temp_file中。

相反,如果proxy_buffering關閉,C回報的資料實時地通過B傳輸給A。

以下配置,都是針對每一個http請求的:

1. proxy_buffering  on;
該參數設定是否開啟proxy的buffer功能,參數的值為on或者off。
如果這個設定為off,那麼proxy_buffers和proxy_busy_buffers_size這兩個指令将會失效。 
但是無論proxy_buffering是否開啟,proxy_buffer_size都是生效的

2. proxy_buffer_size  4k;
該參數用來設定一個特殊的buffer大小的。
從被代理伺服器(C)上擷取到的第一部分響應資料内容到代理伺服器(B)上,通常是header,就存到了這個buffer中。 
如果該參數設定太小,會出現502錯誤碼,這是因為這部分buffer不夠存儲header資訊。建議設定為4k。

3. proxy_buffers  8  4k;
這個參數設定存儲被代理伺服器上的資料所占用的buffer的個數和每個buffer的大小。
所有buffer的大小為這兩個數字的乘積。

4. proxy_busy_buffer_size 16k;
在所有的buffer裡,我們需要規定一部分buffer把自己存的資料傳給A,這部分buffer就叫做busy_buffer。
proxy_busy_buffer_size參數用來設定處于busy狀态的buffer有多大。

對于B上buffer裡的資料何時傳輸給A,我個人的了解是這樣的:
1)如果完整資料大小小于busy_buffer大小,當資料傳輸完成後,馬上傳給A;
2)如果完整資料大小不少于busy_buffer大小,則裝滿busy_buffer後,馬上傳給A;

5. proxy_temp_path
文法:proxy_temp_path  path [level1 level2 level3]
定義proxy的臨時檔案存在目錄以及目錄的層級。

例:proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
其中/usr/local/nginx/proxy_temp為臨時檔案所在目錄,1表示層級1的目錄名為1個數字(0-9),2表示層級2目錄名為2個數字(00-99)

6. proxy_max_temp_file_size
設定臨時檔案的總大小,例如 proxy_max_temp_file_size 100M;

7. proxy_temp_file_wirte_size
設定同時寫入臨時檔案的資料量的總大小。通常設定為8k或者16k。      

配置示例:

server
{
    listen 80;
    server_name www.aminglinux.com;
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 2 4k;
    proxy_busy_buffers_size 4k;
    proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
    proxy_max_temp_file_size 20M;
    proxy_temp_file_write_size 8k;
    
    location /
    {
        proxy_pass      http://192.168.10.110:8080/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}