目錄
- 1. 前言
- 2. 指令
- 3. 原理及總結
1. 前言
關於緩沖,主要是合理設置緩沖區大小,盡量避免緩沖到硬盤
2. 指令
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啟用時,要提防使用的代理緩沖區太大。這可能會吃掉你的內存,限制代理能夠支持的最大並發連接數。
proxy_buffer_size
后端服務器的響應頭會放到proxy_buffer_size當中,這個大小默認等於proxy_buffers當中的設置單個緩沖區的大小。
proxy_buffer_size只是響應頭的緩沖區,沒有必要也跟着設置太大。 proxy_buffer_size最好單獨設置,一般設置個4k就夠了。
proxy_buffers
proxy_buffers的緩沖區大小一般會設置的比較大,以應付大網頁。 proxy_buffers當中單個緩沖區的大小是由系統的內存頁面大小決定的,Linux系統中一般為4k。
proxy_buffers由緩沖區數量和緩沖區大小組成的。總的大小為number*size。
若某些請求的響應過大,則超過_buffers的部分將被緩沖到硬盤(緩沖目錄由_temp_path指令指定), 當然這將會使讀取響應的速度減慢, 影響用戶體驗. 可以使用proxy_max_temp_file_size指令關閉磁盤緩沖.
proxy_busy_buffers_size
proxy_busy_buffers_size不是獨立的空間,他是proxy_buffers和proxy_buffer_size的一部分。nginx會在沒有完全讀完后端響應的時候就開始向客戶端傳送數據,所以它會划出一部分緩沖區來專門向客戶端傳送數據(這部分的大小是由proxy_busy_buffers_size來控制的,建議為proxy_buffers中單個緩沖區大小的2倍),然后它繼續從后端取數據,緩沖區滿了之后就寫到磁盤的臨時文件中。
proxy_max_temp_file_size和proxy_temp_file_write_size
臨時文件由proxy_max_temp_file_size和proxy_temp_file_write_size這兩個指令決定。
proxy_temp_file_write_size是一次訪問能寫入的臨時文件的大小,默認是proxy_buffer_size和proxy_buffers中設置的緩沖區大小的2倍,Linux下一般是8k。
proxy_max_temp_file_size指定當響應內容大於proxy_buffers指定的緩沖區時, 寫入硬盤的臨時文件的大小. 如果超過了這個值, Nginx將與Proxy服務器同步的傳遞內容, 而不再緩沖到硬盤. 設置為0時, 則直接關閉硬盤緩沖.
3. 原理及總結
nginx buffer 原理圖

總結:
首先第一個概念是所有的這些 proxy buffer參數是作用到每一個請求的。每一個請求會按照參數的配置獲得自己的buffer。proxy buffer不是global 而是 per request的。
1. 無論在 proxy_buffering 是否開啟的情況下,proxy_buffer_size 都會用來緩沖后端服務的 header信息。
2. 當proxy_buffering 開啟時, proxy_buffers 和 proxy_busy_buffers_size 才會生效。
3. 在開啟 proxy_buffering 的情況下,nginx會盡量將后端獲取到的數據存入 buffer中,直到 proxy_buffers 被寫滿或數據讀取完畢。如果buffer裝不下后端返回的數據,那么nginx服務器會將部分接收到的數據臨時存放在磁盤的臨時文件中,磁盤上的臨時文件目錄可以通過 proxy_temp_path 指定,臨時文件的大小有 proxy_max_temp_file_size 和 proxy_temp_file_write_size 指令決定
4. 一旦proxy_buffers設置的buffer被寫入,直到buffer里面的數據被完整的傳輸完(傳輸到客戶端),這個buffer將會一直處在busy狀態,我們不能對這個buffer進行任何別的操作。所有處在busy狀態的buffer size加起來不能超過proxy_busy_buffers_size,所以proxy_busy_buffers_size是用來控制同時傳輸到客戶端的buffer數量的。
5. 一次響應數據接收完成或者buffer已經轉滿,nginx服務器開始向客戶端傳輸數據。
通用網站配置:
proxy_buffer_size 4k; # 設置代理服務器(nginx)保存用戶頭信息的緩沖區大小 proxy_buffers 4 32k; #proxy_buffers # 緩沖區,網頁平均在32k以下的設置 -> 如果頁面過大可以設置為 4 512k proxy_busy_buffers_size 64k; # 高負荷下緩沖大小(proxy_buffers*2) -> 1024 k proxy_temp_file_write_size 64k; # 設定緩存文件夾大小,大於這個值,將從upstream服務器傳 -> 10m;
