緩存的概念
緩存就是數據交換的緩沖區(稱作: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;
}
}