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;
}
}