Nginx-快取配置
快取的概念
快取就是資料交換的緩衝區(稱作:Cache),當用戶要獲取資料的時候,會先從快取中去查詢獲取資料,如果快取中有就會直接返回給使用者,如果快取中沒有,則會發請求從伺服器重新查詢資料,將資料返回給使用者的同時將資料放入快取,下次使用者就會直接從快取中獲取資料。
快取其實在很多場景中都有用到,比如:
場景 | 作用 |
---|---|
作業系統磁碟快取 | 減少磁碟機械操作 |
資料庫快取 | 減少檔案系統的IO操作 |
應用程式快取 | 減少對資料庫的查詢 |
Web伺服器快取 | 減少對應用伺服器請求次數 |
瀏覽器快取 | 減少與後臺的互動次數 |
快取的優點
- 減少資料傳輸,節省網路流量,加快響應速度,提升使用者體驗;
- 減輕伺服器壓力;
- 提供服務端的高可用性;
快取的缺點
- 資料的不一致
- 增加成本
Nginx作為Web快取伺服器,它介於客戶端和應用伺服器之間,當用戶通過瀏覽器訪問一個URL時,web快取伺服器會去應用伺服器獲取要展示給使用者的內容,將內容快取到自己的伺服器上,當下一次請求到來時,如果訪問的是同一個URL,web快取伺服器就會直接將之前快取的內容返回給客戶端,而不是嚮應用伺服器再次傳送請求。web快取降低了應用伺服器、資料庫的負載,減少了網路延遲,提高了使用者訪問的響應速度,增強了使用者的體驗。
Nginx的web快取服務
Nginx是從0.7.48版開始提供快取功能。Nginx是基於Proxy Store來實現的,其原理是把URL及相關組合當做Key,在使用MD5演算法對Key進行雜湊,得到硬碟上對應的雜湊目錄路徑,從而將快取內容儲存在該目錄中。它可以支援任意URL連線,同時也支援404/301/302這樣的非200狀態碼。Nginx即可以支援對指定URL或者狀態碼設定過期時間,也可以使用purge命令來手動清除指定URL的快取。
Nginx快取設定的相關指令
Nginx的web快取服務主要是使用ngx_http_proxy_module
模組相關指令集來完成,接下來我們把常用的指令來進行介紹下。
proxy_cache_path
該指定用於設定快取檔案的存放路徑
語法 | proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time][max_size=size]; |
---|---|
預設值 | — |
位置 | http |
path
: 快取路徑地址,如:
/usr/local/proxy_cache
levels
: 指定該快取空間對應的目錄,最多可以設定3層,每層取值為1|2如 :
# 快取空間有兩層目錄,第一次是1個字母,第二次是2個字母
levels=1:2
舉例說明:
itheima[key]通過MD5加密以後的值為 43c8233266edce38c2c9af0694e2107d
levels=1:2 最終的儲存路徑為/usr/local/proxy_cache/d/07
levels=2:1:2 最終的儲存路徑為/usr/local/proxy_cache/7d/0/21
levels=2:2:2 最終的儲存路徑為??/usr/local/proxy_cache/7d/10/e2
keys_zone
: 用來為這個快取區設定名稱和指定大小,如:
# 快取區的名稱是itcast,大小為200M,1M大概能儲存8000個keys
keys_zone=itcast:200m
inactive
: 指定快取的資料多次時間未被訪問就將被刪除,如:
# 快取資料在1天內沒有被訪問就會被刪除
inactive=1d
max_size
: 設定最大快取空間,如果快取空間存滿,預設會覆蓋快取時間最長的資源,如:
max_size=20g
案例:
http{
proxy_cache_path /usr/local/proxy_cache keys_zone=itcast:200m levels=1:2:1 inactive=1d max_size=20g;
}
proxy_cache
該指令用來開啟或關閉代理快取,如果是開啟則自定使用哪個快取區來進行快取。
語法 | proxy_cache zone_name|off; |
---|---|
預設值 | proxy_cache off; |
位置 | http、server、location |
zone_name
:指定使用快取區的名稱
proxy_cache_key
該指令用來設定web快取的key值,Nginx會根據key值MD5雜湊存快取。
語法 | proxy_cache_key key; |
---|---|
預設值 | proxy_cache_key $scheme$proxy_host$request_uri; |
位置 | http、server、location |
proxy_cache_valid
該指令用來對不同返回狀態碼的URL設定不同的快取時間
語法 | proxy_cache_valid [code ...] time; |
---|---|
預設值 | — |
位置 | http、server、location |
如:
# 為200和302的響應URL設定10分鐘快取,為404的響應URL設定1分鐘快取
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 對所有響應狀態碼的URL都設定1分鐘快取
proxy_cache_valid any 1m;
proxy_cache_min_uses
該指令用來設定資源被訪問多少次後被快取
語法 | proxy_cache_min_uses number; |
---|---|
預設值 | proxy_cache_min_uses 1; |
位置 | http、server、location |
proxy_cache_methods
該指令使用者設定快取哪些HTTP方法
語法 | proxy_cache_methods GET|HEAD|POST; |
---|---|
預設值 | proxy_cache_methods GET HEAD; |
位置 | http、server、location |
預設快取HTTP的GET和HEAD方法,不快取POST方法。
Nginx快取設定案例
應用伺服器的環境準備
- 在192.168.200.146伺服器上的tomcat的webapps下面新增一個js目錄,並在js目錄中新增一個jquery.js檔案
- 啟動tomcat
- 訪問測試
http://192.168.200.146:8080/js/jquery.js
Nginx的環境準備
- 完成Nginx反向代理配置
http{
upstream backend{
server 192.168.200.146:8080;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://backend/js/;
}
}
}
- 完成Nginx快取配置
http{
proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
upstream backend{
server 192.168.200.146:8080;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_cache itcast;
proxy_cache_key itheima;
proxy_cache_min_uses 5;
proxy_cache_valid 200 5d;
proxy_cache_valid 404 30s;
proxy_cache_valid any 1m;
add_header nginx-cache "$upstream_cache_status";
proxy_pass http://backend/js/;
}
}
}
Nginx快取的清除
刪除對應的快取目錄
rm -rf /usr/local/proxy_cache/......
Nginx設定資源不快取
前面已經完成了Nginx作為web快取伺服器的使用。但是我們得思考一個問題就是不是所有的資料都適合進行快取。比如說對於一些經常發生變化的資料。如果進行快取的話,就很容易出現使用者訪問到的資料不是伺服器真實的資料。所以對於這些資源我們在快取的過程中就需要進行過濾,不進行快取。
Nginx也提供了這塊的功能設定,需要使用到如下兩個指令
proxy_no_cache
該指令是用來定義不將資料進行快取的條件。
語法 | proxy_no_cache string ...; |
---|---|
預設值 | — |
位置 | http、server、location |
配置例項
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass
該指令是用來設定不從快取中獲取資料的條件。
語法 | proxy_cache_bypass string ...; |
---|---|
預設值 | — |
位置 | http、server、location |
配置例項
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
上述兩個指令都有一個指定的條件,這個條件可以是多個,並且多個條件中至少有一個不為空且不等於"0",則條件滿足成立。上面給的配置例項是從官方網站獲取的,裡面使用到了三個變數,分別是$cookie_nocache
、$arg_nocache
、$arg_comment
$cookie_nocache
- 指的是當前請求的cookie中鍵的名稱為nocache對應的值
$arg_nocache
和$arg_comment
- 指的是當前請求的引數中屬性名為nocache和comment對應的屬性值
設定不快取資源的配置方案
server{
listen 8080;
server_name localhost;
location / {
if ($request_uri ~ /.*\.js$){
set $nocache 1;
}
proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
}
}