1. 程式人生 > 其它 >Nginx-快取配置

Nginx-快取配置

快取的概念

快取就是資料交換的緩衝區(稱作:Cache),當用戶要獲取資料的時候,會先從快取中去查詢獲取資料,如果快取中有就會直接返回給使用者,如果快取中沒有,則會發請求從伺服器重新查詢資料,將資料返回給使用者的同時將資料放入快取,下次使用者就會直接從快取中獲取資料。

快取其實在很多場景中都有用到,比如:

場景 作用
作業系統磁碟快取 減少磁碟機械操作
資料庫快取 減少檔案系統的IO操作
應用程式快取 減少對資料庫的查詢
Web伺服器快取 減少對應用伺服器請求次數
瀏覽器快取 減少與後臺的互動次數

快取的優點

  1. 減少資料傳輸,節省網路流量,加快響應速度,提升使用者體驗;
  2. 減輕伺服器壓力;
  3. 提供服務端的高可用性;

快取的缺點

  1. 資料的不一致
  2. 增加成本

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快取設定案例

應用伺服器的環境準備

  1. 在192.168.200.146伺服器上的tomcat的webapps下面新增一個js目錄,並在js目錄中新增一個jquery.js檔案
  2. 啟動tomcat
  3. 訪問測試
http://192.168.200.146:8080/js/jquery.js

Nginx的環境準備

  1. 完成Nginx反向代理配置
http{
	upstream backend{
		server 192.168.200.146:8080;
	}
	server {
		listen       8080;
        server_name  localhost;
        location / {
        	proxy_pass http://backend/js/;
        }
	}
}
  1. 完成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;
	}
}