1 概述
緩存啟用時,nginx保存響應到磁盤緩存,客戶端每次請求相同內容時無需代理請求,直接使用緩存內容響應客戶端。
2 啟用響應緩存
為了啟用緩存,在http上下文中設置proxy_cache_path指令。第一個必選參數是緩存內容的本地文件系統路徑,必選參數keys_zone定義用于存儲緩存條目的元數據的共享內存區域的名稱和大小:
http { # … proxy_cache_path /data/nginx/cache keys_zone=one:10m; }
然后在你想要緩存服務器響應的上下文(協議類型、虛擬主機或location)中使用proxy_cache指令,指定proxy_cache_path指令的keys_zone參數定義的區域名稱(在這種情況下,是one):
http { # … proxy_cache_path /data/nginx/cache keys_zone=one:10m; server { proxy_cache one; location / { proxy_pass http://localhost:8000; } } }
注意,keys_zone參數定義的大小不限制緩存響應數據的總大小。緩存的響應本身存儲在文件系統中特定文件的元數據副本中。使用proxy_cache_path指令的max_size參數限制緩存響應數據的總大小。(但是注意,緩存數據的總大小可以臨時超過這個限制。)
3 涉及緩存的nginx進程
有兩個額外nginx進程涉及緩存:
緩存管理器定期被激活檢查緩存的狀態。如果緩存大小超過proxy_cache_path指令的max_size參數設置的限制,緩存管理器刪除最近訪問的數據。如前所述,大多數緩存數據能在緩存管理器激活期間臨時超過限制。 緩存加載器只在nginx啟動后運行一次。它加載之前緩存數據到共享內存區域的元數據。在第一次啟動后幾分鐘加載整個緩存立即消耗大量資源,導致nginx性能降低。為了避免這個問題,在proxy_cache_path指令上配置迭代加載緩存的參數: loader_threshold:迭代周期,以毫秒為單位(默認是200)。 loader_files:一次加載的最大項目數(默認是100)。 loader_sleeps:兩次迭代之間的延遲,以毫秒為單位(默認是50)。
在下面例子中,每次迭代加載至少300毫秒或至少加載200個項目:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200; 4 指定哪些請求被緩存
默認,nginx緩存所有第一次使用http get和head方法的請求的響應,響應接收自代理服務器。nginx使用請求字符串作為請求的緩存鍵。如果請求與緩存的響應有相同的緩存鍵,nginx發送緩存響應到客戶端。可以在http、server或location上下文中包括各種指令控制那些響應被緩存。
使用proxy_cache_key指令修改緩存鍵的計算方式:
proxy_cache_key "$host$request_uri$cookie_user";
使用proxy_cache_min_uses指令定義請求使用相同緩存鍵至少多少次后響應才被緩存:
proxy_cache_min_uses 5;
使用proxy_cache_methods指令緩存get和head之外的請求的響應:
proxy_cache_methods get head post; 5 限制或禁用緩存
默認,響應無限期的保存在響應中。只有當超過配置的最大大小時,才會按最后請求的時間遠近順序刪除。可以設置緩存響應多久失效,甚至是否它們一直使用。
使用proxy_cache_valid指令限制特定狀態碼響應的有效時間:
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m;
在上面例子中,狀態碼為200或302的響應有效期是10分鐘,狀態碼為404的響應有效期是1分鐘。為了定義所有響應的有效期使用any作為第一個參數:
proxy_cache_valid any 5m;
使用proxy_cache_bypass指令定義nginx不發送緩存響應到客戶端的條件。每個參數定義一個條件,由大量變量組成。如果至少一個參數不為空并且不等于“0”,nginx就不在緩存中查找響應,而是立即將請求轉發到后端服務器。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
使用proxy_no_cache指令定義nginx不緩存響應的條件。與proxy_cache_bypass參數相同。
proxy_no_cache $http_pragma $http_authorization; 6 清理緩存內容
nginx可以清理過期緩存文件。為了防止同時服務新老版本的web頁面,非常有必要清理過期緩存內容。當接收到特定包含自定義http頭或http purge方法的“purge”請求時,nginx清理過期的緩存。
6.1 配置緩存清理
下面例子配置,使用purge http方法標識請求并刪除匹配的uri。
在http上下文中,使用map指令創建一個變量,例如:
http { # … map $request_method $purge_method { purge 1; default 0; } } 在location塊中配置了緩存,使用proxy_cache_purge指令指定清理緩存請求的條件。在我們的例子中,使用上一步配置的$purge_method:
server { listen 80; server_name www.example.com; location / { proxy_pass https://localhost:8002; proxy_cache mycache; proxy_cache_purge $purge_method; } } 6.2 發送清理命令
當proxy_cache_purge指令被配置時,可以發送一條特定的緩存清理請求清理緩存。有一系列的發送請求工具,例如,curl命令:
$ curl -x purge -d – "https://www.example.com/*" http/1.1 204 no content server: nginx/1.5.7 date: sat, 01 dec 2015 16:33:04 gmt connection: keep-alive
在例子中,有一個公共url部分(通過星號通配符指定)的資源備清理。然而,這些緩存條目不會完全從緩存中刪除:它們會保留在磁盤上,直到它們不活躍(通過proxy_cache_path指令的inactive參數決定)或清理緩存(使用proxy_cache_path指令的purger參數啟用),或客戶端嘗試訪問它們時刪除。
6.3 限制清理命令訪問
推薦限制允許發送清理緩存請求的ip地址的數量:
geo $purge_allowed { default 0; # 拒絕其他ip地址 10.0.0.1 1; # 允許從10.0.0.1訪問 192.168.0.0/24 1; # 允許從192.168.0.0/24訪問 } map $request_method $purge_method { purge $purge_allowed; default 0; }
在該例子中,nginx檢查該請求是否是“purge”方法,如果是,分析客戶端的ip地址。如果ip地址是白名單,那么$purge_method設置$purge_allowed為:1,允許清理,0,拒絕清理。
6.4 完全刪除緩存文件
為了完全刪除匹配星號的緩存文件,激活特定緩存清理進程,永久編譯所有緩存條目并刪除匹配通配符的條目。包括purger參數到http上下文的proxy_cache_path指令:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on; 6.5 清理緩存配置示例
http { # … proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:
怎么管局審核注銷了到現在西部還沒更新狀態外網云服務器價格對比pycharm背景設置為白色 pycharm怎么設置背景為白色談談AngularJS中Providers之間的差異虛擬主機和服務器哪個好?虛擬主機和服務器有什么區別?微軟云怎么購買服務器云服務器1m能看視頻嗎多枚雙拼結拍 gushan.com拍出88888元