nginx優化緩沖緩存


反向代理的一個問題是代理大量用戶時會增加服務器進程的性能沖擊影響。在大多數情況下,可以很大程度上能通過利用Nginx的緩沖和緩存功能減輕。

當代理到另一台服務器,兩個不同的連接速度會影響客戶的體驗:

從客戶機到Nginx代理的連接。

從Nginx代理到后端服務器的連接。

Nginx具有優化這些連接調整其行為的能力。

如果沒有緩沖,數據從代理的服務器發送並立即開始被發送到客戶。如果假定客戶端很快,緩沖可以關閉而盡快使數據到客戶端,有了緩沖,Nginx代理將暫時存儲后端的響應,然后按需供給數據給客戶端。如果客戶端是緩慢的,允許Nginx服務器關閉到后端的連接。然后,它可以處理數據分配到客戶端,以任何可能的速度。

Nginx默認有緩沖設計,因為客戶端往往有很大的不同的連接速度。我們可以用以下指令調節緩沖行為。可以在HTTP,server或location位置來設置。重要的是要記住,大小size指令是針對每個請求配置的,所以增加超出你需求會影響你的性能,如果這時有許多客戶端請求:

proxy_buffering:該指令控制緩沖是否啟用。默認情況下,它的值是“on”。

proxy_buffers:該指令控制代理響應緩沖區的數量(第一個參數)和大小(第二個參數)。默認配置是8個緩沖區大小等於一個內存頁(4K或者8K)。增加緩沖區的數目可以讓你緩沖更多信息。

proxy_buffer_size:從后端服務器的響應頭緩沖區大小,它包含headers,和其他部分響應是分開的。該指令設置響應部分的緩沖區大小。默認情況下,它和proxy_buffers是相同的尺寸,但因為這是用於頭信息,這通常可以設置為一個較低的值。

proxy_busy_buffers_size:此指令設置標注“client-ready”緩沖區的最大尺寸。而客戶端可以一次讀取來自一個緩沖區的數據,緩沖被放置在隊列中,批量發送到客戶端。此指令控制允許是在這種狀態下的緩沖空間的大小。

proxy_max_temp_file_size:這是每個請求能用磁盤上臨時文件最大大小。這些當上游響應太大不能裝配到緩沖區時被創建。

proxy_temp_file_write_size:這是當被代理服務器的響應過大時Nginx一次性寫入臨時文件的數據量。

proxy_temp_path:當上游服務器的響應過大不能存儲到配置的緩沖區域時,Nginx存儲臨時文件硬盤路徑。

正如你所看到的,Nginx提供了相當多的不同的指令來調整緩沖行為。大多數時候,你不必擔心太多,但它對於調整一些值可能是有用的。可能最有用的調整是proxy_buffers和proxy_buffer_size指令。

一個例子:、

proxy_busy_buffers_size 8k;

proxy_max_temp_file_size 2048m;

proxy_temp_file_write_size 32k;

proxy_pass http://example.com;

配置代理服務緩存來減少響應時間

盡管緩沖可以幫助釋放后端服務器以處理更多的請求,Nginx還提供了一種方法來緩存從后端服務器的內容,對於許多請求無需連接到上游。

配置代理緩存

要設置緩存用於代理內容,我們可以使用proxy_cache_path指令。這將創建區域保存來自被代理服務器返回的數據。該proxy_cache_path指令必須在HTTP上下文部分進行設置。

在下面的例子中,我們將配置一些相關的指令來建立我們的緩存系統。

# http context

proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=backcache:8m max_size=50m;

proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404 1m;

用proxy_cache_path指令,我們首先應該已經定義在文件系統中希望存儲緩存的目錄。在這個例子中,我們選擇在/var/lib/nginx/cache目錄。如果該目錄不存在,你可以用正確的權限和所有權創建它:

sudo mkdir -p /var/lib/nginx/cache

sudo chown www-data /var/lib/nginx/cache

sudo chmod 700 /var/lib/nginx/cache

levels=參數指定緩存將如何組織。 Nginx將通過散列鍵(下方配置)的值來創建一個緩存鍵。我們選擇了上述的levels決定了單個字符目錄(這是散列值的最后一個字符)配有兩個字符的子目錄(下兩個字符取自散列值的末尾)將被創建。你通常不必對這個細節關注,但它可以幫助Nginx快速找到相關的值。

keys_zone=參數定義緩存區域的名字,我們稱之為backcache。這也是我們定義多少元數據存儲的地方。在這個例子里,我們是存儲8 MB的key。對於每兆字節,Nginx可存儲8000左右的條目。MAX_SIZE參數設置實際緩存數據的最大尺寸。

我們使用上面的另一個指令是proxy_cache_key。這個設置將設置用於存儲緩存值的鍵。此鍵用於檢查是否一個請求可以從高速緩存提供服務。我們將它設置成方案(http或https),HTTP請求方法,以及被請求的主機和URI的組合。

proxy_cache_valid指令可以被指定多次。它依賴於狀態代碼值使我們能夠配置多長時間存儲。在我們的例子中,我們對於后端返回200和302存儲10分鍾,404響應的一分鍾過期。

現在,我們已經配置了緩存區,但我們仍然需要告訴Nginx什么時候使用緩存。

在我們代理到后端的location位置,我們可以配置使用這個緩存:

# server context

location /proxy-me {

proxy_cache backcache;

proxy_cache_bypass $http_cache_control;

add_header X-Proxy-Cache $upstream_cache_status;

proxy_pass http://backend;

}

使用proxy_cache指令,就可以指定該backcache緩存區被用於這個位置。 Nginx會在這里檢查傳遞給后端有效的條目。

上述proxy_cache_bypass指令被設置為$ http_cache_control變量。這將包含一個指示器,用以指示該客戶端是否被明確地請求一個最新的,非緩存版本。設置此指令允許Nginx正確處理這些類型的客戶端請求。無需進行進一步的配置。

我們還增加了被稱為X-Proxy-Cache的額外頭。我們設置這個頭部為$ upstream_cache_status變量的值。這個設置頭,使我們能夠看到,如果請求導致高速緩存命中,高速緩存未命中,或者高速緩存被明確旁路。這是對於調試特別有價值,也對客戶端是有用的信息。

關於緩存結果的注意事項

高速緩存能夠極大地提高代理服務器的性能。不過,也需要明確的考慮配置緩存時候,要記住。

首先,任何用戶相關的數據不應被高速緩存。這可能導致一個用戶的數據被呈現給其他用戶。如果你的網站是完全靜態的,這可能不是一個問題。

如果你的網站有一些動態元素,你將不得不考慮到這一點。你如何處理要看是什么應用程序或服務器處理的后端處理。對於私人的內容,你應該設置Cache-Control頭為“no-cache”,“no-sotre”,或者“private”依賴於數據的性質:

no-cache:

請求: 告知緩存者,必須原原本本的轉發原始請求,並告知任何緩存者,需要去轉發請求,並驗證緩存(如果有的話).對應名詞:端對端重載.    

響應: 允許緩存者緩存副本.那么其實際價值是,總是強制緩存者,校驗緩存的新鮮度.一旦確認新鮮,則可以使用緩存副本作為響應. no-cache,還可以指定某個包含字段,比如一個典型應用,no-cache=Set-Cookie. 這樣做的結果,就是告知緩存者,對於Set-Cookie字段,你不要使用緩存內容.而是使用新滴.其他內容則可以使用緩存

no-store:表示在任何時候收到的數據不被緩存。這對於私人數據是最安全,因為它意味着,該數據必須從服務器每次進行檢索。

private:這表明共享的緩存空間不能緩存此數據。這可以用於指示用戶的瀏覽器高速緩存數據,但代理服務器不應當考慮隨后的請求數據有效。

public:這表明該響應是可在連接的任何點被高速緩存的公共數據。

一個相關的可以控制此行為報頭是max-age頭,其指示,任何資源應該緩存的秒數。

根據內容的敏感性,正確設置這些頭,會幫助你利用緩存優勢,同時保持你的私人數據安全,並使您的動態數據最新。

如果你的后端也使用Nginx,你可以設置使用過期指令,設置max-age來實現Cache-Control:

location / {

expires 60m;

}

location /check-me {

expires -1;

}

在上面的例子中,第一個塊允許緩存一個小時的內容。第二塊設置Cache-Control頭為“無緩存”。要設置其他值,可以使用add_header指令,就像這樣:

location /private {

expires -1;

add_header Cache-Control "no-store";

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM