Nginx-緩存配置


緩存的概念

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

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

場景 作用
操作系統磁盤緩存 減少磁盤機械操作
數據庫緩存 減少文件系統的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的緩存。
image

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緩存設置案例

image

應用服務器的環境准備

  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;
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM