一、介紹
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)
訪問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服務器:
訪問A服務器
此時可以訪問 並在Network中看到了我們添加的頭信息為HIT命中。
我們到服務器上查看我們的緩存目錄:
查看緩存目錄
我們發現緩存目錄多了一個文件夾,這便是我們緩存下來的文件:
查看緩存的文件內容
此時我們將該文件刪掉,再訪問A服務器發現該文件再次生成,說明此時緩存服務已經生效。
接下來我們進行另一項演示
將B服務器的8888端口的服務配置更改:
server {
listen 8889;
server_name localhost;
location / {
root /opt/app/demo/html;
index test.html test.htm;
}
}
然後reload一下Nginx,此時即是相當於關閉了8888端口的服務。
然後我們再次訪問A地址:
再次訪問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服務:
重新訪問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 刪除掉
鏈接:https://www.jianshu.com/p/2a33420f7f3f
閱讀更多 思夢PHP 的文章