Nginx緩存&優(yōu)雅清除緩存問(wèn)題
1.Nginx緩存
前面我們知道Nginx可以對(duì)瀏覽器緩存進(jìn)行配置,讓一些靜態(tài)資源緩存到用戶本地存儲(chǔ),以提高頁(yè)面的響應(yīng)速度,也能降低服務(wù)端的壓力。
瀏覽器執(zhí)行緩存的流程如下:

試想一下,如果用戶主動(dòng)清空了本地的瀏覽器緩存,那么是不是請(qǐng)求的壓力又來(lái)到了服務(wù)端,為此我們可以增加web緩存服務(wù)器,當(dāng)用戶本地緩存失效時(shí),可以去web緩存服務(wù)器中獲取數(shù)據(jù),而不是直接將請(qǐng)求打到后端服務(wù)器。
Nginx就可以擔(dān)當(dāng)這樣的角色。其作為一個(gè)高性能的web服務(wù)器,同時(shí)也可以是一個(gè)緩存服務(wù)器。其為我們提供了ngx_http_proxy_module模塊,用來(lái)實(shí)現(xiàn)緩存功能。
官方文檔:
https://nginx.org/en/docs/http/ngx_http_proxy_module.html
Tips:緩存的資源也不是一成不變的,因此緩存也需要有更新的機(jī)制。
因此,對(duì)于Nginx的緩存主要圍繞以下幾點(diǎn)展開(kāi):
- 緩存文件存放在哪兒
- 緩存的有效期
- 如何指定哪些請(qǐng)求走緩存,哪些請(qǐng)求不緩存
- 如何刪除緩存
2.Nginx配置緩存
2.1 緩存文件存放在哪兒
proxy_cache:定義共享內(nèi)存區(qū)域的名稱。proxy_cache_path:定義緩存的存儲(chǔ)路徑。
2.1.1 proxy_cache
- 作用域:http, server, location
- 語(yǔ)法:proxy_cache zone | off;
- 默認(rèn)值:proxy_cache off;
zone:用于定義共享內(nèi)存區(qū)域的名稱。可以使用變量。此參數(shù)是proxy_cache_path指令的基礎(chǔ)。off:表示禁用緩存。
2.1.2 proxy_cache_path
- 作用域:http
- 語(yǔ)法:proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size];
該指令可以配置緩存的路徑,并設(shè)置相關(guān)的參數(shù)。
path:設(shè)置緩存的路徑。levels:用于設(shè)置緩存的目錄結(jié)構(gòu),例如levels=1:2,意味著生成兩層目錄。該參數(shù)與proxy_cache_key指令有關(guān),proxy_cache_key的默認(rèn)值為$scheme$proxy_host$request_uri,然后將獲取到的值MD5加密,然后依次從末尾按照levels的設(shè)置取值來(lái)創(chuàng)建目錄。keys_zone:其中name為proxy_cache定義的值。size表示共享內(nèi)存區(qū)域的大小。1M的內(nèi)存可以存儲(chǔ)大約8000個(gè)key。inactive:指定緩存失效的時(shí)間,如果在該段時(shí)間內(nèi),緩存文件沒(méi)被訪問(wèn),緩存將被刪除。max_size:指定最大的緩存大小,當(dāng)超出大小,會(huì)根據(jù)LRU算法,刪除最近最少使用的數(shù)據(jù)。
2.2 緩存有效期
2.2.1 proxy_cache_valid
該指令可以設(shè)置不同響應(yīng)碼對(duì)應(yīng)的緩存時(shí)間,超過(guò)時(shí)間緩存就會(huì)過(guò)期,但是不會(huì)刪除緩存。
- 作用域:http, server, location
- 語(yǔ)法:proxy_cache_valid [code …] time;
前面我們?cè)谂渲?code>proxy_cache_path指令時(shí),inactive參數(shù)可以指定一定時(shí)間內(nèi)緩存未被訪問(wèn)就會(huì)被刪除。而proxy_cache_valid指定的是緩存的過(guò)期時(shí)間,超過(guò)該時(shí)間緩存將會(huì)過(guò)期,但是不會(huì)被刪除。
因此我們?cè)谂渲玫臅r(shí)候,一般inactive的值會(huì)大于proxy_cache_valid中的值,否則將會(huì)導(dǎo)致緩存還不過(guò)期就被刪除了。
- 不指定響應(yīng)碼,則只對(duì)200、301和302進(jìn)行緩存。
proxy_cache_valid 10m;
- 對(duì)指定響應(yīng)碼進(jìn)行緩存。
proxy_cache_valid 200 301 10m;
- 對(duì)任何響應(yīng)碼進(jìn)行緩存。
proxy_cache_valid any 10m;
2.3 如何指定哪些請(qǐng)求走緩存,哪些請(qǐng)求不緩存
2.3.1 proxy_cache_bypass
該指令配置不走緩存響應(yīng)的條件,如果條件命中,則不走緩存??膳cproxy_no_cache配合使用。
- 作用域:http, server, location
- 語(yǔ)法:proxy_cache_bypass string …;
如果參數(shù)中的值至少有一個(gè)值不為空且不為"0",則不走緩存響應(yīng)。
# 以$arg開(kāi)頭的參數(shù)表示url中的對(duì)應(yīng)的參數(shù)。 proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
2.3.2 proxy_no_cache
該指令配置不緩存響應(yīng)的條件,如果條件命中,則不緩存??膳cproxy_cache_bypass配合使用。
- 作用域:http, server, location
- 語(yǔ)法:proxy_no_cache string …;
如果參數(shù)中的值至少有一個(gè)值不為空且不為"0",則不緩存響應(yīng)。
# 以$arg開(kāi)頭的參數(shù)表示url中的對(duì)應(yīng)的參數(shù)。 proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
2.3.3 proxy_cache_min_uses
該指令設(shè)置某個(gè)請(qǐng)求達(dá)到指定次數(shù)后,才對(duì)其進(jìn)行緩存。
- 作用域:http, server, location
- 語(yǔ)法:proxy_cache_min_uses number;
- 默認(rèn)值:proxy_cache_min_uses 1;
2.4 綜合案例
1)環(huán)境
- Nginx緩存服務(wù)器:192.168.110.101
- 服務(wù)端:192.168.110.100
2)配置
Nginx緩存服務(wù)器配置:
$upstream_cache_status為緩存命中狀態(tài)。狀態(tài)值分別為MISS、BYPASS、EXPIRED、STALE、UPDATING、REVALIDATED、HIT.
http {
# 緩存在10分鐘之內(nèi)未被訪問(wèn)即刪除
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;
# 緩存的有效期會(huì)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;
}
}
}服務(wù)端配置:
同時(shí)在html文件夾下創(chuàng)建cache文件,并放入test.html文件。
http {
server {
listen 80;
server_name localhost;
location /cache {
root html;
}
}
}3)訪問(wèn)http://192.168.110.101/cache/test.html
第一次訪問(wèn):緩存狀態(tài)為MISS,即未命中。

第二次訪問(wèn):緩存狀態(tài)為HIT,即已命中緩存。

查看緩存文件夾,已經(jīng)按照levels參數(shù)指定的規(guī)則生成目錄結(jié)構(gòu),并緩存文件。

第三次訪問(wèn):緩存狀態(tài)為EXPIRED,緩存已過(guò)期,因?yàn)槲覀冊(cè)O(shè)置的10s過(guò)期。

3.Nginx刪除緩存
如果服務(wù)端的文件發(fā)生變化,那么也需要將文件同步到Nginx的緩存中去,因此我們需要對(duì)緩存進(jìn)行刪除。
刪除對(duì)應(yīng)緩存目錄:這種方式看上去簡(jiǎn)單粗暴,但是想要?jiǎng)h除指定的緩存,則猶如大海撈針。ngx_cache_purge:第三方模塊,通過(guò)請(qǐng)求刪除指定的緩存文件。
3.1 刪除對(duì)應(yīng)的緩存目錄
rm -rf /home/stone/proxy_cache
3.2 ngx_cache_purge
我們可以借助第三方模塊ngx_cache_purge來(lái)實(shí)現(xiàn)對(duì)指定緩存的刪除。
下載地址:https://github.com/FRiCKLE/ngx_cache_purge/archive/refs/heads/master.zip
- 作用域:location
- 語(yǔ)法: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;
# 設(shè)置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)訪問(wèn)http://192.168.110.101/cache/test.html,產(chǎn)生緩存。
2)訪問(wèn)http://192.168.110.101/purge/cache/test.html,如下圖表示刪除緩存成功。

總結(jié)
以上就是Nginx實(shí)現(xiàn)負(fù)載均衡的全部?jī)?nèi)容,Nginx是多模塊化的,還有很多高級(jí)功能,我們后面繼續(xù)探索。
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
nginx反向代理踩坑實(shí)戰(zhàn)記錄(容器方式)
Nginx是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù),下面這篇文章主要給大家介紹了關(guān)于nginx反向代理踩坑(容器方式)的相關(guān)資料,需要的朋友可以參考下2022-04-04
Nginx?反向代理緩存(proxy_cache)的實(shí)現(xiàn)
Nginx的緩存加速功能是由proxy_cache和fastcgi_cache兩個(gè)功能模塊完成,本文主要介紹了Nginx?反向代理緩存(proxy_cache)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
Nginx中l(wèi)imit_req模塊和limit_conn模塊的使用
本文主要介紹了Nginx中l(wèi)imit_req模塊和limit_conn模塊的使用,通過(guò)limit_req和limit_conn模塊,可以有效實(shí)現(xiàn)精確的請(qǐng)求頻率和連接數(shù)控制,下面就來(lái)具體介紹一下2024-05-05
在Nginx服務(wù)器上配置Google反向代理的基本方法
這篇文章主要介紹了在Nginx服務(wù)器上配置Google反向代理的基本方法,文中使用到了SSL來(lái)加密反向代理,需要的朋友可以參考下2015-12-12
504?Gateway?Timeout網(wǎng)關(guān)超時(shí)詳細(xì)解決方法
這篇文章主要介紹了504?Gateway?Timeout網(wǎng)關(guān)超時(shí)詳細(xì)解決方法的相關(guān)資料,504GatewayTimeout是HTTP狀態(tài)碼,表示網(wǎng)關(guān)或代理服務(wù)器在等待上游服務(wù)器響應(yīng)時(shí)超時(shí),常見(jiàn)觸發(fā)場(chǎng)景包括Nginx超時(shí)、后端性能問(wèn)題、網(wǎng)絡(luò)延遲和服務(wù)器資源耗盡,需要的朋友可以參考下2025-02-02
Nginx之upstream被動(dòng)式重試機(jī)制的實(shí)現(xiàn)
本文主要介紹了Nginx之upstream被動(dòng)式重試機(jī)制的實(shí)現(xiàn),可以通過(guò)proxy_next_upstream來(lái)自定義配置,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03

