Nginx緩存&優(yōu)雅清除緩存問題
1.Nginx緩存
前面我們知道Nginx可以對瀏覽器緩存進行配置,讓一些靜態(tài)資源緩存到用戶本地存儲,以提高頁面的響應速度,也能降低服務端的壓力。
瀏覽器執(zhí)行緩存的流程如下:
試想一下,如果用戶主動清空了本地的瀏覽器緩存,那么是不是請求的壓力又來到了服務端,為此我們可以增加web緩存服務器,當用戶本地緩存失效時,可以去web緩存服務器中獲取數(shù)據(jù),而不是直接將請求打到后端服務器。
Nginx就可以擔當這樣的角色。其作為一個高性能的web服務器,同時也可以是一個緩存服務器。其為我們提供了ngx_http_proxy_module
模塊,用來實現(xiàn)緩存功能。
官方文檔:
https://nginx.org/en/docs/http/ngx_http_proxy_module.html
Tips:緩存的資源也不是一成不變的,因此緩存也需要有更新的機制。
因此,對于Nginx的緩存主要圍繞以下幾點展開:
- 緩存文件存放在哪兒
- 緩存的有效期
- 如何指定哪些請求走緩存,哪些請求不緩存
- 如何刪除緩存
2.Nginx配置緩存
2.1 緩存文件存放在哪兒
proxy_cache
:定義共享內存區(qū)域的名稱。proxy_cache_path
:定義緩存的存儲路徑。
2.1.1 proxy_cache
- 作用域:http, server, location
- 語法:proxy_cache zone | off;
- 默認值:proxy_cache off;
zone
:用于定義共享內存區(qū)域的名稱。可以使用變量。此參數(shù)是proxy_cache_path
指令的基礎。off
:表示禁用緩存。
2.1.2 proxy_cache_path
- 作用域:http
- 語法:proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size];
該指令可以配置緩存的路徑,并設置相關的參數(shù)。
path
:設置緩存的路徑。levels
:用于設置緩存的目錄結構,例如levels=1:2
,意味著生成兩層目錄。該參數(shù)與proxy_cache_key
指令有關,proxy_cache_key
的默認值為$scheme$proxy_host$request_uri
,然后將獲取到的值MD5加密,然后依次從末尾按照levels
的設置取值來創(chuàng)建目錄。keys_zone
:其中name
為proxy_cache
定義的值。size
表示共享內存區(qū)域的大小。1M的內存可以存儲大約8000個key。inactive
:指定緩存失效的時間,如果在該段時間內,緩存文件沒被訪問,緩存將被刪除。max_size
:指定最大的緩存大小,當超出大小,會根據(jù)LRU算法,刪除最近最少使用的數(shù)據(jù)。
2.2 緩存有效期
2.2.1 proxy_cache_valid
該指令可以設置不同響應碼對應的緩存時間,超過時間緩存就會過期,但是不會刪除緩存。
- 作用域:http, server, location
- 語法:proxy_cache_valid [code …] time;
前面我們在配置proxy_cache_path
指令時,inactive
參數(shù)可以指定一定時間內緩存未被訪問就會被刪除。而proxy_cache_valid
指定的是緩存的過期時間,超過該時間緩存將會過期,但是不會被刪除。
因此我們在配置的時候,一般inactive
的值會大于proxy_cache_valid
中的值,否則將會導致緩存還不過期就被刪除了。
- 不指定響應碼,則只對200、301和302進行緩存。
proxy_cache_valid 10m;
- 對指定響應碼進行緩存。
proxy_cache_valid 200 301 10m;
- 對任何響應碼進行緩存。
proxy_cache_valid any 10m;
2.3 如何指定哪些請求走緩存,哪些請求不緩存
2.3.1 proxy_cache_bypass
該指令配置不走緩存響應的條件,如果條件命中,則不走緩存??膳cproxy_no_cache
配合使用。
- 作用域:http, server, location
- 語法:proxy_cache_bypass string …;
如果參數(shù)中的值至少有一個值不為空且不為"0",則不走緩存響應。
# 以$arg開頭的參數(shù)表示url中的對應的參數(shù)。 proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
2.3.2 proxy_no_cache
該指令配置不緩存響應的條件,如果條件命中,則不緩存??膳cproxy_cache_bypass
配合使用。
- 作用域:http, server, location
- 語法:proxy_no_cache string …;
如果參數(shù)中的值至少有一個值不為空且不為"0",則不緩存響應。
# 以$arg開頭的參數(shù)表示url中的對應的參數(shù)。 proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
2.3.3 proxy_cache_min_uses
該指令設置某個請求達到指定次數(shù)后,才對其進行緩存。
- 作用域:http, server, location
- 語法:proxy_cache_min_uses number;
- 默認值:proxy_cache_min_uses 1;
2.4 綜合案例
1)環(huán)境
- Nginx緩存服務器:192.168.110.101
- 服務端:192.168.110.100
2)配置
Nginx緩存服務器配置:
$upstream_cache_status
為緩存命中狀態(tài)。狀態(tài)值分別為MISS
、BYPASS
、EXPIRED
、STALE
、UPDATING
、REVALIDATED
、HIT
.
http { # 緩存在10分鐘之內未被訪問即刪除 proxy_cache_path /home/stone/proxy_cache levels=1:2 keys_zone=my_cache:10M inactive=10m max_size=10G; server { listen 80; server_name localhost; location /cache { proxy_cache my_cache; proxy_cache_key $uri$is_args$args; # 緩存的有效期會10s proxy_cache_valid any 10s; proxy_cache_min_uses 1; # 添加緩存命中狀態(tài),$upstream_cache_status add_header Nginx-Cache $upstream_cache_status; proxy_pass http://192.168.110.100; } } }
服務端配置:
同時在html文件夾下創(chuàng)建cache文件,并放入test.html文件。
http { server { listen 80; server_name localhost; location /cache { root html; } } }
3)訪問http://192.168.110.101/cache/test.html
第一次訪問:緩存狀態(tài)為MISS
,即未命中。
第二次訪問:緩存狀態(tài)為HIT
,即已命中緩存。
查看緩存文件夾,已經(jīng)按照levels
參數(shù)指定的規(guī)則生成目錄結構,并緩存文件。
第三次訪問:緩存狀態(tài)為EXPIRED
,緩存已過期,因為我們設置的10s過期。
3.Nginx刪除緩存
如果服務端的文件發(fā)生變化,那么也需要將文件同步到Nginx的緩存中去,因此我們需要對緩存進行刪除。
刪除對應緩存目錄
:這種方式看上去簡單粗暴,但是想要刪除指定的緩存,則猶如大海撈針。ngx_cache_purge
:第三方模塊,通過請求刪除指定的緩存文件。
3.1 刪除對應的緩存目錄
rm -rf /home/stone/proxy_cache
3.2 ngx_cache_purge
我們可以借助第三方模塊ngx_cache_purge
來實現(xiàn)對指定緩存的刪除。
下載地址:https://github.com/FRiCKLE/ngx_cache_purge/archive/refs/heads/master.zip
- 作用域:location
- 語法:proxy_cache_purge keys_zone key;
keys_zone
:該參數(shù)為proxy_cache
指令指定的值。key
:該參數(shù)為proxy_cache_key
指定的值。
配置示例:
server { listen 80; server_name localhost; location /cache { proxy_cache my_cache; # 設置proxy_cache_key proxy_cache_key $uri$is_args$args; proxy_cache_valid 200 302 10s; # 添加緩存命中狀態(tài) add_header Nginx-Cache $upstream_cache_status; proxy_pass http://192.168.110.100; } # 刪除指定緩存 location ~/purge(/.*) { proxy_cache_purge my_cache $1$is_args$args; } }
1)訪問http://192.168.110.101/cache/test.html,產(chǎn)生緩存。
2)訪問http://192.168.110.101/purge/cache/test.html,如下圖表示刪除緩存成功。
總結
以上就是Nginx實現(xiàn)負載均衡的全部內容,Nginx是多模塊化的,還有很多高級功能,我們后面繼續(xù)探索。
這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Nginx(PHP/fastcgi)的PATH_INFO問題
PATH_INFO是一個CGI 1.1的標準,經(jīng)常用來做為傳參載體. 比如, 我們可以使用PATH_INFO來代替Rewrite來實現(xiàn)偽靜態(tài)頁面, 另外不少PHP框架也使用PATH_INFO來作為路由載體.2011-08-08使用nginx方式實現(xiàn)http轉換為https的示例代碼
這篇文章主要介紹了使用nginx方式實現(xiàn)http轉換為https的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09