A. nginx如何實現負載均衡、限流、緩存、黑白名單和灰度發布
1.負載均衡配置
2.失敗重試配置
在fail_timeout時間內失敗了max_fails次請求後,認為上游伺服器不可用,就會將服務地址剔除掉,fail_timeout時間後會再次將伺服器加入存活列表進行重試。
limit_req_zone指令設置參數
參數說明
limit_req_zone定義在http塊中,$binary_remote_addr表示保存客戶端IP地址的二進制形式。
Zone定義IP狀態及URL訪問頻率的共享內存區域。zone=keyword標識區域的名字,以及冒號後面跟區域大小。16000個IP地址的狀態信息約1MB,例子區域可以存儲160000個IP地址。
Rate定義最大請求速率。示例中速率不能超過每秒10個請求。
設置限流
burs排隊大小,nodelay不限制單個請求間的時間。具體使用可以查看高並發場景如何使用nginx實現限流-實戰篇
不限流白名單
該配置說明 192.168.1.0/24網段的ip訪問是不限流的,其它限流。ip後面數字的含義
24表示子網掩碼:255.255.255.0
16表示子網掩碼:255.255.0.0
8表示子網掩碼:255.0.0.0
1.瀏覽器緩存 靜態資源緩存用expire
Response Header中添加了Expires和Cache-Control
所謂的靜態資源一般包括一直不變的圖像,如網站的logo,js、css靜態文件還有可下載的內容,媒體文件
協商緩存(add_header ETag/Last-Modified value)包括html文件,經常替換的圖片,經常需要修改的js、css文件和基本不變的api介面
不需要緩存包括用戶隱私等敏感數據,用戶經常變動的api介面
2.代理層緩存
在本地磁碟創建一個文件目錄,根據我們的配置把請求資源以k(key自定義,這邊用url的hash值)->v形式緩存到目錄里,並根據需求對內容設置緩存時長,比如狀態碼為200緩存10分鍾,其餘的緩存1分鍾等待。要清理緩存可以藉助purger的功能。如果ab測試/個性化需求時應禁用瀏覽器緩存,否則會因為緩存導致誤差。
方式一
方式二 lua+redis動態黑名單(openresty)
配置(/usr/local/openresty/nginx/conf/nginx.conf)
lua腳本編寫(ip_blacklist.lua)
1.根據cookie實現灰度發布
根據cooke查詢version值,根據version跳轉到對應的host,如果沒有匹配上的就跳轉到默認配置。
2.根據來路ip實現灰度發布
B. 哪些服務可以用作緩存服務
Nginx可以用作緩存服務。
使用nginx作為緩存服務是一種代理緩存,客戶端向nginx發送請求,此時nginx沒有緩存,因此nginx向伺服器發送請求,請求返回數據後,將其緩存到nginx,然後將數據返回到客戶端,當客戶端再次向nginx發送相同的請求時,nginx具有數據緩存,因此nginx直接將數據返回給客戶端
這是nginx代理的緩存模式,Nginx as代理緩存也通過Nginx反向代理配置實現。
優點分析:
Nginx 可以在大多數UnixLinux OS 上編譯運行,並有Windows移植版。 Nginx 的1.4.0穩定版已經於2013年4月24日發布,一般情況下,對於新建站點,建議使用最新穩定版作為生產版本,已有站點的升級急迫性不高。
在連接高並發的情況下,Nginx是Apache伺服器不錯的替代品:Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平台之一,能夠支持高達 50,000 個並發連接數的響應,感謝Nginx為我們選擇了 epoll and kqueue作為開發模型。
C. Nginx作為緩存服務
上一篇文章講了Nginx作為代理服務的使用方式,這篇文章我們講一講Nginx作為緩存服務是怎麼工作的,以及實戰的使用。
先看一張圖:
面對第一次客戶端的應用Nginx需要從後端的服務獲取數據,對於後續的請求,Nginx若進行了緩存就不再從後端服務獲取數據。
語法:proxy_cache_path path [levels=levels].只能用在http中。
proxy_cache zone | off。默認是關閉的,可以用在http,server,location中。
訪問zzm這個路徑的時候,會返回配置文件中的spring.s項,具體值可以參考我們的啟動設置:
三個後台金正分別對應6000埠,6001埠,6002埠
所以我們訪問ip:port/zzm的時候會自動去訪問後台
我們首先注釋掉proxy_cache zzm_cache;進行訪問,也就是沒有緩存的情況下,訪問3次:
我們可以看到沒有緩存的情況下,會進行輪詢訪問,每次訪問的結果不一樣,而且我們的緩存路徑什麼都沒有,讓我想起了一首歌空空如也:
好奇的看了下目錄下的文件內容:
add_header Nging-Cache "$upstream_cache_status";
當我們沒有緩存的時候,我們可以看到應答會是MISS:
現在nginx.conf中加入新的配置項:
此時我們怒刷前端頁面,會發現後端日誌如下:
Nginx的緩存服務就講到這里,歡迎大家指正
D. 【NGINX入門】3.Nginx的緩存伺服器proxy_cache配置
本文介紹NGINX緩存機制,配置和參數說明。
如圖所示,nginx緩存,可以在一定程度上,減少源伺服器的處理請求壓力。因為靜態文件(比如css,js, 圖片)中,很多都是不經常更新的。nginx使用proxy_cache將用戶的請求緩存到本地一個目錄。下一個相同請求可以直接調取緩存文件,就不用去請求伺服器了。畢竟,IO密集型服務的處理是nginx的強項。
Nginx的緩存加速功能是由proxy_cache(用於反向代理和靜態緩存)和fastcgi_cache(PHP動態緩存)兩個功能模塊完成。
Nginx緩存特點:
先上個例子:
因為我是在一台伺服器上做試驗,所以用了兩個埠 80 和 90 進行模擬兩台伺服器之間的交互。
接下來講一下配置項:
這里我設置了 圖片 、 css 、 js 靜態資源進行緩存。
當用戶輸入 http://wangxiaokai.vip 域名時,解析得到 ip:port 的訪問地址。 port 默認為80。所以頁面請求會被當前server截取到,進行請求處理。
當解析到上述文件名結尾的靜態資源,會到緩存區獲取靜態資源。
如果獲取到對應資源,則直接返回數據。
如果獲取不到,則將請求轉發給 proxy_pass 指向的地址進行處理。
這里直接處理 90 埠接受到的請求,到伺服器本地目錄 /mnt/blog 下抓取資源進行響應。
細心的讀者應該發現,我在第二段例子里,留了個彩蛋 add_header wall "hey!guys!give me a star." 。
add_header 是用於在報頭設置自定義的信息。
所以,如果緩存有效的話,那麼靜態資源返回的報頭,一定會帶上這個信息。
(1)Nginx系列教程(3)nginx緩存伺服器上的靜態文件
https://yq.aliyun.com/articles/752967
(2)proxy_cache
nginx 反向代理之 proxy_cache https://www.cnblogs.com/yyxianren/p/10832172.html
(3)Nginx使用upstream負載均衡和proxy_cache緩存實現反向代理
https://blog.51cto.com/13770206/2163952
E. nginx中怎麼把文件數據存入redis
1、redis 中的每一個資料庫,都由一個 redisDb 的結構存儲。其中,redisDb.id 存儲著 redis 資料庫以整數表示的號碼。redisDb.dict 存儲著該庫所有的鍵值對數據。redisDb.expires 保存著每一個鍵的過期時間。
2、當redis 伺服器拿罩寬初始化時,會預先分配 16 個資料庫(該數量可以通過配置文件消亮配置),所有資料庫保存到結構 redisServer 的一個成員 redisServer.db 數組中。當我們選擇資料庫 select number 時,程序直接通過 redisServer.db[number] 來切換資料庫。有時候當程序需要知道自己是在哪個資料庫時,直接讀取 redisDb.id 即可。
3、既然我們知道一個資料庫的所有鍵值都存儲在redisDb.dict中,那麼我們要知道如果找到key的位置,就有必要了解一下dict 的結構了:
typedef struct dict {
// 特定於類型的處理函數
dictType *type;
// 類型處理函數的私有數據
void *privdata;
// 哈希表(2個)
dictht ht[2];
// 記錄 rehash 進度的標志,值為-1 表示 rehash 未進行
int rehashidx;
// 當前正悶陸在運作的安全迭代器數量
int iterators;
} dict;
由上述的結構可以看出,redis 的字典使用哈希表作為其底層實現。dict 類型使用的兩個指向哈希表的指針,其中 0 號哈希表(ht[0])主要用於存儲資料庫的所有鍵值,而1號哈希表主要用於程序對 0 號哈希表進行 rehash 時使用,rehash 一般是在添加新值時會觸發,這里不做過多的贅述。所以redis 中查找一個key,其實就是對進行該dict 結構中的 ht[0] 進行查找操作。
4、既然是哈希,那麼我們知道就會有哈希碰撞,那麼當多個鍵哈希之後為同一個值怎麼辦呢?redis採取鏈表的方式來存儲多個哈希碰撞的鍵。也就是說,當根據key的哈希值找到該列表後,如果列表的長度大於1,那麼我們需要遍歷該鏈表來找到我們所查找的key。當然,一般情況下鏈表長度都為是1,所以時間復雜度可看作o(1)。
二、當redis 拿到一個key 時,如果找到該key的位置。
了解了上述知識之後,我們就可以來分析redis如果在內存找到一個key了。
1、當拿到一個key後, redis 先判斷當前庫的0號哈希表是否為空,即:if (dict->ht[0].size == 0)。如果為true直接返回NULL。
2、判斷該0號哈希表是否需要rehash,因為如果在進行rehash,那麼兩個表中者有可能存儲該key。如果正在進行rehash,將調用一次_dictRehashStep方法,_dictRehashStep 用於對資料庫字典、以及哈希鍵的字典進行被動 rehash,這里不作贅述。
3、計算哈希表,根據當前字典與key進行哈希值的計算。
4、根據哈希值與當前字典計算哈希表的索引值。
5、根據索引值在哈希表中取出鏈表,遍歷該鏈表找到key的位置。一般情況,該鏈表長度為1。
6、當 ht[0] 查找完了之後,再進行了次rehash判斷,如果未在rehashing,則直接結束,否則對ht[1]重復345步驟。
到此我們就找到了key在內存中的位置了。
F. nginx優化以及多級緩存
配置文件:
lua是一個小巧的腳本語言,由標准C編寫而成,幾乎在所有操作系統和平台上都可以編譯運行。其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定製功能。
應用場景:游戲開發、獨立應用腳本、redis中嵌套調用實現類似事務的功能,web容器匯總處理NGINX的過濾緩存等等邏輯
OpenResty是一個基於Nginx與Lua的高性能web平台,由中國人章亦春發起,其內部集成了大量精良的Lua庫、第三方模塊以及大多數的依賴項。用於方便搭建能處理超高並發、擴展性極高的動態Web應用、web服務和動態網關
OpenResty簡單理解成就相當於封裝了NGINX,並且集成了LUA腳本,開發人員只需要簡單的使用其提供了模塊就可以實現相關的邏輯,而不像之前,還需要在NGINX中編寫lua的腳本。
1.拉取一個openresty的鏡像
2.隨便構建一個容器用於拷貝配置文件
3.進入容器,查找配置文件路徑(這里直接給出)
4.退出容器,復制容器中配置文件到宿主機
5.修改配置文件
1、使用Lua查詢Nginx緩存,如果有緩存,則直接將緩存中的分類數據返回
2、如果Nginx緩存中沒有分類數據,則通過Lua腳本查詢Redis,如果Redis中有數據,則將數據存入到Nginx緩存中,並返回查詢到的數據
3、如果Redis中也沒有緩存,則此時通過Lua腳本查詢Mysql,如果Mysql中有數據,將分類數據存入到Redis緩存,並返回數據
G. nginx 緩存機制
Nginx緩存的基本思路
基本思想是利用客戶訪問的時間局部性原理,對客戶已經訪問過的內容在Nginx伺服器本地建立副本,這樣在一段時間內再次訪問該數據,就不需要通過Nginx伺服器再次向後端伺服器發出請求,所以能夠減少Nginx伺服器與後端伺服器之間的網路流量,減輕網路擁塞,同時還能減小數據傳輸延遲,提高用戶訪問速度。同時,當後端伺服器宕機時,Nginx伺服器上的副本資源還能夠回應相關的用戶請求,這樣能夠提高後端伺服器的魯棒性。
對於緩存,我們大概會有以下問題:
(1)緩存文件放在哪兒?
(2)緩存的空間大小是否可以限定?
(3)如何指定哪些請求被緩存?
(4)緩存的有效期是多久?
(5)對於某些請求,是否可以不走緩存?
解決這些問題後,nginx的緩存也就基本配置完成了,下面看詳細配置過程
開啟緩存
要使用緩存,首先要使用 proxy_cache_path 這個指令(必須放在 http 上下文的頂層位置),然後在目標上下文中使用 proxy_cache 指令
配置示例
proxy_cache_path 有兩個必填參數,第一個參數為 緩存目錄,第二個參數keys_zone指定緩存名稱和佔用內存空間的大小(註:示例中的10m是對內存中緩存內容元數據信息大小的限制,如果想限制緩存總量大小,需要用 max_size 參數)
proxy_cache 的參數為之前指定的緩存名稱
緩存管理的相關進程
在緩存工作中有兩個附加進程:
(1)緩存管理器
定期檢查緩存狀態,看緩存總量是否超出限制,如果超出,就移除其中最少使用的部分
(2)緩存載入器
載入器只在nginx啟動後運行一次,把緩存內容的元數據信息載入到內存空間,如果一次性載入全部緩存信息,會大量消耗資源,使nginx在啟動後的幾分鍾里變慢,為避免此問題,有3種載入策略:
loader_threshold – 指定每次載入執行的時間
loader_files – 每次最多載入的數量
loader_sleeps – 每次載入的延時
例如:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
指定緩存哪些請求
nginx默認會緩存所有 get 和 head 方法的請求結果,緩存的key默認使用請求字元串
(1)自定義key
例如 proxy_cache_key " request_uri cookie_nocache arg_comment;
如果任何一個參數值不為空,或者不等於0,nginx就不會查找緩存,直接進行代理轉發
綜合示例
nginx 緩存機制
三分鍾看懂Nginx伺服器的緩存原理和機制
H. nginx如何配置代理
nginx源碼: https://trac.nginx.org/nginx/browser
nginx官網: http://www.nginx.org/
... #全局塊
events { #events塊
...
}
http #http塊
{
}
1、全局塊:全局模塊影響nginx的全局指令,一般有運行nginx伺服器的用戶,nginx進程pid存放路勁,日誌存放路徑,配置文件引入,允許生成worker,process數。
2、events塊:配置影響nginx伺服器或與用戶的網路連接, ,有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個連接,開啟多個網路連接序列化。
3、http塊:可以嵌套多個server,配置代理,緩存
4、server塊:配置虛擬主機參數,一個http中有多個server
5、location塊:配置請求的路由。
########### 每個指令必須有分號結束。#################
error_log log/error.log debug; #制定日誌路徑,級別。這個設置可以放入全局塊,http塊,server塊,級別以此為:
debug|info|notice|warn|error|crit|alert|emerg
events {
} http {
}
四、nginx的簡單命令
五、配置解析
server {
1、location 支持配置項目的絕對路徑
2、假設我們的後台API地址是以API開頭,location ^~ /user/ 代表nginx將會攔截請求地址中包含"/user/"字樣的請求,洞敗其實這就是我們的ajax請求路徑,攔截到請求之後根據寫法會分成兩種情況把這個請求轉發到 下面 proxy_pass 的地址上。
舉個例子納逗顫:
a、如上圖,如果proxy_pass 的URL以 / 結尾 ,那麼請求轉發的時候 將 不會 帶上 匹配到的 /api/ ,也就是說如果 登錄請求 URL是 localhost:80/user/login,proxy_pass URL 是 http://a.xx.com:8080/platform/, Nginx將會 把這個請求轉發成 http://a.xx.com:8080/platform/user/login
b、如果proxy_pass 的URL不以 / 結尾 ,那麼請求轉發的時候 將 會帶上 匹配到的 /user/ ,也就是說如果 登錄請求 URL是 localhost:60001/user/login,proxy_pass URL 是 http://a.xx.com:8080/platform/, Nginx將會 把這個請求轉發成 http://a.xx.com:8080/user/login
3、一般我們登錄之後伺服器會通過Set-Cookie把token寫回到我們本地,如果不設置 proxy_cookie_path 的話,伺服器Set-Cookie命令會失效,本地存不了cookie,從而導致token丟失。
這里proxy_cookie_path有一點需要注意的是 如果 proxy_pass URL 是 http://a.xx.com:8080/user/ 這種情況 proxy_cookie_path應該設置成 /platform/ / (注意兩個斜杠之間有空格)。
如果 proxy_pass URL 是 http://a.xx.com:8080/這種情況 proxy_cookie_path應該設置成 / / (注意兩個斜杠指盯之間有空格)
語法規則:location [=| | *|^~] /uri/ { … }
I. 利用nginx實現Redis的負載均衡,應該怎麼配置
在項目運營時,我們都會遇到一個問題,項目需要更新時,我們可能需先暫時關閉下伺服器來更新。但這可能會出現一些狀況:
1.用戶還在操作,被強迫終止了(我們可以看日誌等沒人操作的時候更新,但總可能會有萬一)
2.不知道的用戶可能會想網站是不是被攻擊了,降低了對網站的信任程度,從而導致失去部分潛在客戶,這點尤其對金融互聯網公司不利。
在查了一些資料後,決定採用Tomcat + Nginx + Redis來實現負載均衡和session共享。下面記錄下我的實踐過程,如有錯誤不足之處歡迎大神指點,不喜勿噴。
1.Nginx簡單介紹及開啟
Nginx是一款輕量級兼備高性能的Http和反向代理伺服器。所謂反向代理就是指在用戶發起訪問請求,由代理伺服器接收,然後將請求轉發給正式伺服器,並且將正式伺服器處理完的數據返回給客戶端,此時代理伺服器就表現為一個伺服器。這么做看起來多經過了一步,稍顯麻煩,但實則是好處多多,在下面的demo中我會將其體現出來。
首或御先我們去Nginx官網下載個Nginx,我這是在自己電腦上,所以當然下載的是windows版本的。下載完成後直接放在某個盤中即可,不需要安裝。接下去我們打開cmd,進入nginx的目錄下,輸入start nginx。
我們可以看到一個窗口一閃而過,這樣nginx就已經被開啟了,我們在任務管理器中可以找到它的進程。
現在我們在瀏覽器中輸入localhost。可以看到出現一個頁面,雖然簡陋了點,但這確確實實就是nginx的歡迎頁面,橘團轎就類似tomcat剛啟動完成的locahost:8080的歡迎頁面。
2.使用Nginx實現反向代理
現在我們搭建一個基於SpringMVC +Spring + Mybaties框架的maven項目,搭建過程不加以贅述。功能很簡單,就是能跳轉到一個頁面就行了,當然也可以使用別的框架。
運行demo,我這tomcat埠是8080,在瀏覽器輸入localhost:8080,出現我們的頁面。
這時我們還是直接訪問tomcat伺服器的,現在我想通過nginx訪問tomcat,即輸入localhost就能顯示我們demo的頁面。
這就要我們去修改nginx的核心配置文件,在其目錄下的conf文件夾下的nginx.conf文件,那麼首先我們就要了解該文件中一些節點的作用。
worker_processes:工作進程個數,可配置多個
worker_connections:單個進程最大連接數
server:每一個server相當於一個代理伺服器
lister:監聽埠,默認80
server_name:當前服務的域名,可以有多個,用空格分隔(我們是本地所以是localhost)
location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這里
index:當沒有指定主頁時,默認會選擇這個指定的文件,可多個,空格分隔
proxy_pass:請求轉向自定義的伺服器列表
upstream name{ }:伺服器集群名稱
知道了節點作用後,我們就知道我們需要修改的文件中的server部分,這是它原有的代碼,我刪除了它注釋部分。現在我們就能明白為什麼輸入localhost,
它訪問的是它歡迎頁面即index.html。
下面我們對這段代碼進行一些小小修改。就是將請求轉向我們定義的伺服器。
隨後在cmd中輸入命令nginx -s reload即可重啟nginx。
重啟後,我們再輸入localhost,可以看到跳轉到的頁面是我們demo的。
至此,反向代理已完成,這樣所有請求都需經過代理伺服器才能訪圓肆問到正式伺服器,某種程度上可以保護網站安全。
3.使用Nginx實現負載均衡
負載均衡即是代理伺服器將接收的請求均衡的分發到各伺服器中。
負載均衡的優勢在訪問量少或並發小的時候可能並不明顯,且不說淘寶雙11、鐵道部搶票這種級別的訪問量、高並發,就是一般網站的搶購活動時,也會給伺服器造成很大壓力,可能會造成伺服器崩潰。而負載均衡可以很明顯的減少甚至消除這種情況的出現,下面我們說說實現方法。
首先我們再開啟一個tomcat伺服器,這里區分一下就叫tomcat2吧,原先的叫tomcat1。將tomcat1上的項目,拷貝到tomcat2上,稍微修改下頁面上的文字以便等下區分我們的請求被分發到了哪個tomcat上。tomcat2埠我這里為8081。在瀏覽器中輸入localhost:8081。
伺服器准備好了,我們要在server外部定義個伺服器集群,即用到了上文中提到的upstream 標簽。伺服器集群名字取為test。
同時我們需要再修改下server,將定向的路徑轉到問你伺服器集群上。
重啟下nginx,在瀏覽器輸入localhost,再多刷新幾次,可以看到兩個頁面在來回切換。
這樣即實現了負債均衡。假設我們伺服器在運行過程中,其中一個tomcat掛了,仍然還有另一個可以訪問。更新的時候也能先關閉只其中一個,輪流更新。另外還能有效緩解伺服器壓力,是不是很棒呢?
當然,以上nginx的配置是簡單化的,實際上我們還可以配置nginx對靜態資源的緩存等等,在此就不多加演示了。
4.小結
花了好些時間,總算陸陸續續要寫好了,在此小結一下。
nginx作為一個反向代理伺服器,能緩存我們項目的靜態文件,並實現反向代理與均衡負載,可以有效減少伺服器壓力,即使項目不大,也可以使用。
大家另外應該都還發現了個問題,雖然這樣請求能分別請求到兩個tomcat上,如果是一般不需身份校檢的或什麼認證的方法尚可,但如果出現這類情況:
我們在tomcat1上進行了登錄,這時用戶session當然是存在tomcat1上的,而這時進入個人中心的請求請求到tomcat2上了,這時就會出現問題了。tomcat2會告訴你還未登錄,這顯然不是我們想看到的。
這就涉及到session共享了,如何讓兩個伺服器上的session共用。我這里放到下次再說,作為碼農比較忙,可能要過個好幾天。另外我將這次的demo源碼上傳了,下次還要用,nginx配置就不傳了,大家自己多動手試驗。
J. nginx緩存(proxy_cache模塊)
緩存的基本思想是利用客戶端訪問的時間局限性,將客戶端訪問過的內容做一個副本,在一定時間內存放到本地,當改數據下次被訪問時,不必連接到後端伺服器反復去查詢數據,而是由本地保存的副本響應數據。
保存在本地的這些副本具有一個過期時間,超過該時間將會更新。判斷一個副本數據是否為過期數據的辦法有很多,可以使用保留時間來判斷,也可以使用數據完整度來判斷。
許多Web伺服器還具有校驗功能,就是當某些副本數據過期以後,先向後端伺服器發送校驗請求,後端伺服器對這些數據進行校驗,如果發現原數據和副本沒有差別,則將過期副本重新置為可用副本。
以上nginx配置結合使用:
proxy_params文件的配置如下:
訪問一次頁面,並向 http://www.blogs-s.com:8080/api/ 發起一個介面數據請求,查看/cache/nginx目錄下的緩存結果:
ngx_cache_purge是nginx的第三方模塊,能夠幫助我清除nginx中的緩存。
在之前的nginx編譯安裝中我們是沒有把緩存的清除模塊ngx_cache_purge編譯進去的,如果啟動了緩存,沒有安裝這個模塊,在之後的調試中我們嘗試去清除緩存時,將會出現異常:
這個異常是在指示我們,找不到該指令的驅動,需要按照相關模塊。
ngx_cache_purge只是nginx的第三方模塊,並不是某個特殊的軟體,所以我們需要對nginx重新進行編譯,操作如下:
配置nginx:
再一次啟動nginx成功;
接下來進行緩存清除測試,訪問: http://blogs.com/clear_cache/api/index.php , 訪問這個連接將會清除介面: http://blogs.com/api/index.php 的緩存數據。
結果如下:
在項目開發中,不可能出現什麼都需要緩存的數據,緩存僅僅適合去緩存查詢頻繁,但是不需要實時更新的數據,這個是它適合的場景,而我們上面的配置,只要是訪問api介面目錄就會緩存介面的數據,這樣對於一些需要實時更新的介面數據來說是不合理的,需要控制好nginx的緩存去緩存什麼以及不緩存什麼
set 指令為變數設置,proxy_no_cache參數中的值可以設置多個,但是多個值中,只要有一個是不為0的,就會通過緩存響應數據。
該指令用於配置一塊公用的內存區域的名稱,該區域可以存放緩存的索引數據。這些數據在Nginx伺服器啟動時由緩存索引重建進程負責建立,在Nginx伺服器的整個運行過程中由緩存管理進程負責定時檢測過期數據,檢索等管理工作。
該指令用於配置Nginx伺服器向客戶端發送響應數據時,不從緩存中獲取的條件。這些條件支持使用Nginx 配置的常用變數。
看一個例子:
其中,Scookie_nocache、Sarg_nocache、Sarg_comment、Shttp_pragma 和Shttp_authorization 都是Nginx配置文件的變數,
該指令用於設置Nginx伺服器在內存中為緩存數據建立索引時使用的關鍵字
如果我們希望緩存數據包含伺服器主機名稱等關鍵字,則可以將該指令設置為:
該指令用於設置是否開啟緩存的鎖功能。在緩存中,某些數據項可以同時被多個請求返回的響應數據填充。開啟該功能後,Nginx伺服器同時只能有一個請求填充緩存中的某一數據項,這相當於給該數據項上鎖,不允許其他請求操作。其他的請求如果也想填充該項,必須等待該數據項的鎖被釋放。這個等待時間由 proxy_cache_lock_timeout 指令配置。
該指令用於設置緩存的鎖功能開啟以後鎖的超時時間。具體細節參見proxy_cache_lock 指令的相關內容
其中,time為設置的時間,默認為5s。
該指令用於設置客戶端請求發送的次數,當客戶端向被代理伺服器發送相同請求達到該指令設定的次數後,Nginx伺服器才對該請求的響應數據做緩存。合理設置該值可以有效地降低硬碟上緩存數據的數量,並提高緩存的命中率。
其中,number為設置的次數。默認設置為1。
該指令用於設置Nginx伺服器存儲緩存數據的路徑以及和緩存索引相關的內容
該指令設置比較復雜,一般需要設置前面三個指令的情形比較多,後面的幾個變數與Nginx伺服器緩存索引重建進程及管理進程的性能相關,一般情況下保持默認設置就可以了。我們來看幾個簡單的配置實例:
如果Nginx在訪問被代理伺服器過程中出現被代理的伺服器無法訪問或者訪問錯誤等現象時,Nginx伺服器可以使用歷史緩存響應客戶端的請求,這些數據不一定和被代理伺服器上最新的數據相一致,但對於更新頻率不高的後端伺服器來說,Nginx伺服器的該功能在一定程度上能夠為客戶端提供不間斷訪問。該指令用來設置一些狀態,當後端被代理的伺服器處於這些狀態時,Nginx伺服器啟用該功能。
該指令可以支持的狀態如語法結構中所示。
該指令可以針對不同的HTTP響應狀態設置不同的緩存時間,
該指令同於配置在什麼情況下不使用cache功能
該指令配置是否在本地磁碟緩存來自被代理伺服器的響應數據。這是Nginx伺服器提供的另一種緩存數據的方法,但是該功能相對 Proxy Cache簡單一些,它不提供緩存過期更新、內存索引建立等功能,不佔用內存空間,對靜態數據的效果比較好。
Proxy Store方法多使用在被代理伺服器端發生錯誤的情況下,用來緩存被代理伺服器的響應數據。
該指令用於設置用戶或用戶組對Proxy Store緩存的數據的訪問許可權,
有關Proxy Store方法的使用,我們通過官方給出的實例加深理解,在該實例中筆者通過注釋對配置做了說明: