nginx 緩存機制
Nginx緩存的基本思路
利用請求的局部性原理,將請求過的內容在本地建立一個副本,下次訪問時不再連接到后端服務器,直接響應本地內容
Nginx服務器啟動后,會對本地磁盤上的緩存文件進行掃描,在內存中建立緩存索引,並有專門的進程對緩存文件進行過期判斷、更新等進行管理
對於緩存,我們大概會有以下問題:
(1)緩存文件放在哪兒?
(2)緩存的空間大小是否可以限定?
(3)如何指定哪些請求被緩存?
(4)緩存的有效期是多久?
(5)對於某些請求,是否可以不走緩存?
解決這些問題后,nginx的緩存也就基本配置完成了,下面看詳細配置過程
開啟緩存
要使用緩存,首先要使用 proxy_cache_path 這個指令(必須放在 http 上下文的頂層位置),然后在目標上下文中使用 proxy_cache 指令
配置示例
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
server {
proxy_cache one;
location / {
proxy_pass http://localhost:8000;
}
}
}
proxy_cache_path 有兩個必填參數,第一個參數為 緩存目錄,第二個參數keys_zone指定緩存名稱和占用內存空間的大小(注:示例中的10m是對內存中緩存內容元數據信息大小的限制,如果想限制緩存總量大小,需要用 max_size 參數)
proxy_cache 的參數為之前指定的緩存名稱
緩存管理的相關進程
在緩存工作中有兩個附加進程:
(1)緩存管理器
定期檢查緩存狀態,看緩存總量是否超出限制,如果超出,就移除其中最少使用的部分
(2)緩存加載器
加載器只在nginx啟動后運行一次,把緩存內容的元數據信息加載到內存空間,如果一次性加載全部緩存信息,會大量消耗資源,使nginx在啟動后的幾分鍾里變慢,為避免此問題,有3種加載策略:
loader_threshold – 指定每次加載執行的時間
loader_files – 每次最多加載的數量
loader_sleeps – 每次加載的延時
例如:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
指定緩存哪些請求
nginx默認會緩存所有 get 和 head 方法的請求結果,緩存的key默認使用請求字符串
(1)自定義key
例如 proxy_cache_key "$host$request_uri$cookie_user";
(2)指定請求至少被發送了多少次以上時才緩存,可以防止低頻請求被緩存
例如 proxy_cache_min_uses 5;
(3)指定哪些方法的請求被緩存
例如 proxy_cache_methods GET HEAD POST;
緩存有效期
默認情況下,緩存內容是長期存留的,除非緩存的總量超出限制
可以指定緩存有效時間,例如
proxy_cache_valid 200 302 10m; //響應狀態碼為200 302時,10分鍾有效
proxy_cache_valid any 5m; //對應任何狀態碼,5分鍾有效
繞開緩存
例如 proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
如果任何一個參數值不為空,或者不等於0,nginx就不會查找緩存,直接進行代理轉發
綜合示例
http {
...
// 緩存目錄:/data/nginx/cache
// 緩存名稱:one
// 緩存占用內存空間:10m
// 加載器每次迭代過程最多執行300毫秒
// 加載器每次迭代過程中最多加載200個文件
// 緩存硬盤空間最多為 200m
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300
loader_files=200 max_size=200m;
server {
listen 8080;
// 使用名稱為one的緩存
proxy_cache one;
location / {
// 此location中使用默認的緩存配置
proxy_pass http://backend1;
}
location /some/path {
proxy_pass http://backend2;
// 緩存有效期為1分鍾
proxy_cache_valid any 1m;
// 被請求3次以上時才緩存
proxy_cache_min_uses 3;
// 請求中有下面參數值時不走緩存
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
}
}
}
