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