Nginx作為緩存服務

一、介紹

Nginx緩存服務原理

緩存服務的類型分為服務端緩存,客戶端緩存和代理緩存。

通過Nginx作緩存服務即是一種代理緩存。

客戶端向Nginx發起請求,此時Nginx沒有緩存,所以此時Nginx向服務端發起請求

請求回數據後緩存至Nginx再返回數據給客戶端。

當客戶端再次向Nginx發起同一請求,此時Nginx有該數據緩存,所以此時Nginx直接返回數據給客戶端

這就是Nginx代理的緩存模式

Nginx作為代理緩存也是要通過Nginx反向代理配置來實現

關於反向代理的配置在之前的文章中有介紹:Nginx正向代理與反向代理


二、Nginx緩存服務的配置語法和簡單場景演示

1、proxy_cache

配置緩存

proxy_cache zone|off

配置緩存過期週期

proxy_cache_valid [code…] time

配置緩存的維度

proxy_cache_key string

2、配置反向代理

在server節點下location裡通過proxy_pass配置反向代理

server {
location / {
proxy_pass: http://upstreamname;
}
}

3、簡單配置場景演示

接下來登錄到服務器進行簡單的配置演示。

配置需求:

我準備了兩臺服務器A(112.74.55.9)和B(112.74.33.216)

A作為代理緩存服務器

B作為存放數據的服務器

接下來演示A使用Nginx作為代理緩存服務緩存B提供的數據

首先我們登錄B服務器配置啟動8888端口一個web服務:

server {
listen 8888;
server_name localhost;
location / {
root /opt/app/demo/html;
index test.html test.htm;

}
}

然後我們登錄A服務器配置反向代理,代理到B服務器的8888端口:

server {
listen 80;
server_name localhost;
location / {
proxy_pass http://112.74.33.216:8888;
}
}

此時我們訪問服務器A(112.74.55.9)

Nginx作為緩存服務

訪問A服務器

客戶端訪問到了B服務器上的test.html,此時即配置好了反向代理

接著我們回到A服務器配置緩存服務:

proxy_cache_path /opt/app/cache levels=1:2 keys_zone=test_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name localhost;
location / { #root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://112.74.33.216:8888;
proxy_cache test_cache;
proxy_cache_valid 200 304 12h;
add_header Nginx-Cache "$upstream_cache_status";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

這裡註釋一下的配置的信息

proxy_cache_path這個為配置緩存文件存放的目錄

levels設置在相對於緩存目錄的指定級數hash目錄中緩存數據。1:2表示兩級hash目錄。

keys_zone=test_cache:10m定義緩存空間的名字,10m為空間的大小

max_size=10g設置緩存空間的大小限制

inactive=60m60分鐘內不活躍的緩存文件清理掉

use_temp_path=off關閉存放臨時文件

proxy_cache test_cache調用定義的zone

proxy_cache_valid 定義返回200或者304的頭信息12小時過期

add_header 添加頭信息

配置好後我們reload一下Nginx然後訪問A服務器:

Nginx作為緩存服務

訪問A服務器

此時可以訪問 並在Network中看到了我們添加的頭信息為HIT命中。

我們到服務器上查看我們的緩存目錄:

Nginx作為緩存服務

查看緩存目錄

我們發現緩存目錄多了一個文件夾,這便是我們緩存下來的文件:

Nginx作為緩存服務

查看緩存的文件內容

此時我們將該文件刪掉,再訪問A服務器發現該文件再次生成,說明此時緩存服務已經生效。

接下來我們進行另一項演示

將B服務器的8888端口的服務配置更改:

server {
listen 8889;
server_name localhost;
location / {
root /opt/app/demo/html;
index test.html test.htm;
}

}

然後reload一下Nginx,此時即是相當於關閉了8888端口的服務。

然後我們再次訪問A地址:

Nginx作為緩存服務

再次訪問A服務

此時發現該服務還是可以訪問,接下來我們登錄A服務器將緩存服務關閉:

proxy_cache_path /opt/app/cache levels=1:2 keys_zone=test_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;

server_name localhost;
location / { #root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://112.74.33.216:8888;
proxy_cache off;
proxy_cache_valid 200 304 12h;
add_header Nginx-Cache "$upstream_cache_status";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

將proxy_cache設置為off,關閉了A服務器的緩存服務,reload了Nginx後我們再來訪問A服務:

Nginx作為緩存服務

重新訪問A服務

此時無法正常獲取到我們預想的數據

這個演示了我們訪問代理服務器A後

A將B的數據緩存到了A下

所以當我們關閉了B的服務後我們仍然可以訪問拿到B緩存在A的數據

當我們關閉了緩存服務後訪問A

則是去訪問了關閉服務後的B

此時便無法訪問到我們開始想要的數據

以上便是Nginx作為緩存服務的簡單場景演示。


三、讓部分請求不緩存

上面演示了Nginx緩存服務的簡單場景,但是在一些場景中並不是所有數據我們都需要緩存的,接下來我們配置部分請求的不緩存。

我們在B服務器/opt/app/demo/html下添加了一個nocache.html

hello!this is nocache.html,tangll add it.

我們現在需要讓這個頁面不緩存我們可以在A服務器上配置如下:

proxy_cache_path /opt/app/cache levels=1:2 keys_zone=test_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name localhost;
location / { #如果url中匹配nocache則nocache參數設置為1
if ($request_uri ~ ^/(nocache)) {
set $nocache 1;
}
proxy_pass http://112.74.33.216:8888;
proxy_cache test_cache;
proxy_cache_valid 200 304 12h;
proxy_no_cache $nocache;#設置nocache參數
add_header Nginx-Cache "$upstream_cache_status";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

這裡proxy_no_cache即是作為配置不緩存的參數

此時我們將緩存目錄下的緩存文件rm -rf 刪除掉

Nginx作為緩存服務

鏈接:https://www.jianshu.com/p/2a33420f7f3f


分享到:


相關文章: