對于經(jīng)常被用戶訪問的內(nèi)容,若每一次都要到后端服務器中獲取,會給服務器造成很大的壓力。為此,利用反向代理服務器對訪問頻率較多的內(nèi)容進行緩存。
Nginx提供了兩種Web緩存方式,一種是永久緩存,另一種是臨時性緩存。
Web緩存服務器位于內(nèi)容源Web服務器和客戶端之間,當客戶端用戶訪問一個URL時,Web緩存服務器就會請求相應的內(nèi)容源Web服務器,并將響應的信息緩存至內(nèi)存或磁盤,然后,當下一個請求到來時,如果訪問的是相同的URL,Web緩存服務器會直接將已緩存的內(nèi)容輸出給客戶端,而不用再次向內(nèi)容源Web服務器發(fā)送請求。
利用緩存服務器,可以有效降低內(nèi)容源服務器和數(shù)據(jù)庫的負載,提高用戶訪問的響應速度。
Nginx提供的proxy_store指令可以用于將內(nèi)容源服務器響應的內(nèi)容緩存到本地,若不手動刪除,該緩存文件會一直生效,永久緩存方式適用于緩存網(wǎng)站幾乎不會改變的一些內(nèi)容。
1、準備服務器
31作為Web緩存服務器,32作為內(nèi)容源Web服務器
2、緩存配置
修改Nginx配置文件nginx.conf:
root cache:用于指定緩存文件的保存目錄;
proxy_store:用于開啟本地緩存;
proxy_store_access:設置緩存的讀寫規(guī)則;
proxy_temp_path:設置反向代理時接收的數(shù)據(jù)臨時存儲文件的目錄(會由Nginx在配置生效后自動創(chuàng)建);
if (!-e $request_filename):!-e:檢查一個文件,目錄或符號鏈接是否存在,$request_filename:當前請求的文件路徑或URI。
注意:if和(有空格,!-e和$request_filename有空格。
3、驗證測試
在32服務器中建立test目錄并在目錄下新建index.html并存放一張圖片。
訪問后查看cache目錄文件,如果tree報command not found,
執(zhí)行如下安裝:yum -y install tree后再次執(zhí)行tree命令:
Nginx服務器中,還有一種使用proxy_cache指令設置的臨時緩存配置,它采用md5算法將請求鏈接進行hash之后,根據(jù)具體配置生成緩存文件目錄,保存響應的數(shù)據(jù)。
1、http塊緩存配置:
proxy_temp_path /usr/local/nginx/proxy_temp_dir;
proxy_cache_path /usr/local/nginx/proxy_cache_dir levels=1.2 keys_zone=cache_one:50m;
inactive= 1m max_size= 500m;
proxy_cache_dir:表示用戶自定義的緩存文件保存目錄;
levels:表示緩存目錄下的層級目錄結構,它是根據(jù)hash之后的請求url,地址創(chuàng)建的,目錄名稱從哈希后的字符串結尾處開始截??;
keys_zone:指定緩存區(qū)名稱及大小,例如:cache_one:50m表示緩存名稱為cache_one,在內(nèi)存中的空間是50MB;
inactive:表示主動清空在指定時間內(nèi)未被訪問的緩存。1m:1分鐘,1h:1小時,1d:1天;
max_size:表示指定磁盤空間大??;
2、server塊添加臨時緩存的相關配置:
location / {
# 設置緩存區(qū)域名稱
proxy_cache cache_one;
# 以域名,uri,參數(shù)組合成web緩存的key值,nginx根據(jù)key值hash
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m; #200緩存10分鐘
proxy_cache_valid 304 1m; #304緩存1分鐘
proxy_cache_valid 301 302 1h; #301,302緩存1小時
proxy_cache_valid any 1m; #其他未設置的狀態(tài)緩存1分鐘
proxy_temp_path cache_tmp;
if (!-e $request_filename){
proxy_pass http://192.168.44.32;
}
}
說明:
proxy_cache_key:用于設置hash的key值組成規(guī)則,在省略的情況下,Nginx將使用默認的key值組成規(guī)則;
proxy_cache_valid:對不同http狀態(tài)不同設置不同時間的緩存;
$is_args:有url參數(shù)時,則值為?,否則為空字符串;
緩存狀態(tài)返回值:
HIT:緩存命中;
MISS:未命中,請求被傳送到后端;
EXPIRED:緩存已過期,請求被傳到后端;
UPDATING:正在更新緩存,將使用舊的應答;
STALE:無法從后端服務器更新緩存時,返回了舊的緩存內(nèi)容(可通過proxy_cache_use_stale指令配置);
BYPASS:緩存被繞過了(可通過proxy_cache_bypass指令配置);
REVALIDATED:啟用proxy_cache_revalidate指令后,當緩存內(nèi)容過期時,Nginx通過一次If-Modiffied-Since的請求頭去驗證緩存內(nèi)容是否過期,此時會返回該狀態(tài);
3、訪問測試
通過開發(fā)工具選擇Network選項,查看Response Headers標簽選項,查看X-Via和X-Cache的值。
HIT表示設置成功。
過段時間后文件被刪除
常用緩存配置指令:
proxy_cache_bypass:用于配置Nginx向客戶端發(fā)送響應數(shù)據(jù)時,不從緩存中獲取的條件;
proxy_cache_lock:用于設置是否開啟緩存的鎖功能;
proxy_cache_lock_timeout:用于設置緩存的鎖功能開啟以后的超時時間;
proxy_no_cache:配置在什么情況下不使用緩存功能;
proxy_cache_min_uses:當同一個URL被重復請求達到指定的次數(shù)后,才對該URL進行緩存;
proxy_cache_revalidate:用于當緩存內(nèi)容過期時,Nginx通過一次If-Modified-Since的請求去驗證緩存內(nèi)容是否過期;
proxy_cache_use_stale:設置狀態(tài),用于內(nèi)容源Web服務器處于這些狀態(tài)時,Nginx向客戶端響應歷史緩存數(shù)據(jù);
利用Nginx緩存雖然減輕了后端服務器的壓力,但是會導致文件修改后無法及時更新緩存,只有刪除服務器中的緩存文件,Nginx才會重新請求后端服務器。
1、安裝ngx_cache_purge模塊
在github上下載:https://github.com/search?utf8=%E2%9C%93&q=ngx_cache_purge&type=
解壓ngx_cache_purge-master.zip:
配置:./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/ngx_cache_purge-master --add-module=/root/nginx-upstream-fair
編譯:make && make install
查看安裝的模塊:/usr/local/nginx/sbin/nginx -V
2、配置緩存清理功能
修改nginx.conf配置文件,在server塊中添加如下清理緩存配置
~/purge(/.*):第一行用于匹配用戶的請求,請求地址符合/purge/URI形式時,就會清理URI對應的緩存文件;
allow:指定僅允許IP為1的客戶端清理緩存;
proxy_cache_purge:指定名稱cache_one緩存區(qū),和待清理文件的key值組成規(guī)則;
在安裝完purge模塊后,可以使用該模塊提供的指令實現(xiàn)緩存清理,在使用指令時需要遵循幾個規(guī)則:
指定的緩存區(qū)名稱要與proxy_cache_path指令出現(xiàn)的緩存區(qū)名稱一致;
指定的Key直組成規(guī)則,要與proxy_cache_key指令設置的規(guī)則相同;
清理緩存的location編寫位置,要在server塊中所有的location之前,防止其他正則提前匹配;
3、訪問測試
清理proxy_cache_dir后訪問index.html地址。
查看后,在查看目錄結構:
訪問purge/index.html,清理緩存文件,從圖可以看到當前清理的緩存文件的key值
清理完成后在此查看目錄:
上篇:10、Nginx負載均衡
聯(lián)系客服