威剛釋出 ISSS31AP 2.5" 工業級固態硬碟:最大 4TB,3000 次 P/E
Nginx負載均衡
負載均衡概述
早期的網站流量和業務功能都比較簡單,單臺伺服器足以滿足基本的需求,但是隨著網際網路的發展,業務流量越來越大並且業務邏輯也跟著越來越複雜,單臺伺服器的效能及單點故障問題就凸顯出來了,因此需要多臺伺服器進行效能的水平擴充套件及避免單點故障出現。那麼如何將不同使用者的請求流量分發到不同的伺服器上呢?
負載均衡的原理及處理流程
系統的擴充套件可以分為縱向擴充套件和橫向擴充套件。
縱向擴充套件是從單機的角度出發,通過增加系統的硬體處理能力來提升伺服器的處理能力
橫向擴充套件是通過新增機器來滿足大型網站服務的處理能力。
這裡面涉及到兩個重要的角色分別是"應用叢集"和"負載均衡器"。
應用叢集:將同一應用部署到多臺機器上,組成處理叢集,接收負載均衡裝置分發的請求,進行處理並返回響應的資料。
負載均衡器:將使用者訪問的請求根據對應的負載均衡演算法,分發到叢集中的一臺伺服器進行處理。
負載均衡的作用
1、解決伺服器的高併發壓力,提高應用程式的處理效能。
2、提供故障轉移,實現高可用。
3、通過新增或減少伺服器數量,增強網站的可擴充套件性。
4、在負載均衡器上進行過濾,可以提高系統的安全性。
負載均衡常用的處理方式
方式一:使用者手動選擇
這種方式比較原始,只要實現的方式就是在網站主頁上面提供不同線路、不同伺服器連結方式,讓使用者來選擇自己訪問的具體伺服器,來實現負載均衡。
方式二:DNS輪詢方式
DNS
域名系統(服務)協議(DNS)是一種分散式網路目錄服務,主要用於域名與 IP 地址的相互轉換。
大多域名註冊商都支援對同一個主機名新增多條A記錄,這就是DNS輪詢,DNS伺服器將解析請求按照A記錄的順序,隨機分配到不同的IP上,這樣就能完成簡單的負載均衡。DNS輪詢的成本非常低,在一些不重要的伺服器,被經常使用。
如下是我們為某一個域名新增的IP地址,用2臺伺服器來做負載均衡。
驗證:
ping www.nginx521.cn
清空本地的dns快取
ipconfig/flushdns
我們發現使用DNS來實現輪詢,不需要投入過多的成本,雖然DNS輪詢成本低廉,但是DNS負載均衡存在明顯的缺點。
1.可靠性低
假設一個域名DNS輪詢多臺伺服器,如果其中的一臺伺服器發生故障,那麼所有的訪問該伺服器的請求將不會有所迴應,即使你將該伺服器的IP從DNS中去掉,但是由於各大寬頻接入商將眾多的DNS存放在快取中,以節省訪問時間,導致DNS不會實時更新。所以DNS輪流上一定程度上解決了負載均衡問題,但是卻存在可靠性不高的缺點。
2.負載均衡不均衡
DNS負載均衡採用的是簡單的輪詢負載演算法,不能區分伺服器的差異,不能反映伺服器的當前執行狀態,不能做到為效能好的伺服器多分配請求,另外本地計算機也會快取已經解析的域名到IP地址的對映,這也會導致使用該DNS伺服器的使用者在一定時間內訪問的是同一臺Web伺服器,從而引發Web伺服器減的負載不均衡。
負載不均衡則會導致某幾臺伺服器負荷很低,而另外幾臺伺服器負荷確很高,處理請求的速度慢,配置高的伺服器分配到的請求少,而配置低的伺服器分配到的請求多。
方式三:四/七層負載均衡
介紹四/七層負載均衡之前,我們先了解一個概念,OSI(open system interconnection),叫開放式系統互聯模型,這個是由國際標準化組織ISO指定的一個不基於具體機型、作業系統或公司的網路體系結構。該模型將網路通訊的工作分為七層。
應用層:為應用程式提供網路服務。
表示層:對資料進行格式化、編碼、加密、壓縮等操作。
會話層:建立、維護、管理會話連線。
傳輸層:建立、維護、管理端到端的連線,常見的有TCP/UDP。
網路層:IP定址和路由選擇
資料鏈路層:控制網路層與物理層之間的通訊。
物理層:位元流傳輸。
所謂四層負載均衡指的是OSI七層模型中的傳輸層,主要是基於IP+PORT的負載均衡
實現四層負載均衡的方式:
硬體:F5 BIG-IP、Radware等
軟體:LVS、Nginx、Hayproxy等
所謂的七層負載均衡指的是在應用層,主要是基於虛擬的URL或主機IP的負載均衡
實現七層負載均衡的方式:
軟體:Nginx、Hayproxy等
四層和七層負載均衡的區別
四層負載均衡資料包是在底層就進行了分發,而七層負載均衡資料包則在最頂端進行分發,所以四層負載均衡的效率比七層負載均衡的要高。
四層負載均衡不識別域名,而七層負載均衡識別域名。
處理四層和七層負載以為其實還有二層、三層負載均衡,二層是在資料鏈路層基於mac地址來實現負載均衡,三層是在網路層一般採用虛擬IP地址的方式實現負載均衡。
實際環境採用的模式
四層負載(LVS)+七層負載(Nginx)
Nginx七層負載均衡
Nginx要實現七層負載均衡需要用到proxy_pass代理模組配置。Nginx預設安裝支援這個模組,我們不需要再做任何處理。Nginx的負載均衡是在Nginx的反向代理基礎上把使用者的請求根據指定的演算法分發到一組【upstream虛擬服務池】。
Nginx七層負載均衡的指令
upstream指令
該指令是用來定義一組伺服器,它們可以是監聽不同埠的伺服器,並且也可以是同時監聽TCP和Unix socket的伺服器。伺服器可以指定不同的權重,預設為1。
語法 | upstream name {...} |
---|---|
預設值 | — |
位置 | http |
server指令
該指令用來指定後端伺服器的名稱和一些引數,可以使用域名、IP、埠或者unix socket
語法 | server name [paramerters] |
---|---|
預設值 | — |
位置 | upstream |
Nginx七層負載均衡的實現流程
服務端設定
server {
listen 9001;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.200.146:9001</h1>';
}
}
server {
listen 9002;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.200.146:9002</h1>';
}
}
server {
listen 9003;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.200.146:9003</h1>';
}
}
負載均衡器設定
upstream backend{
server 192.168.200.146:9091;
server 192.168.200.146:9092;
server 192.168.200.146:9093;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
負載均衡狀態
代理伺服器在負責均衡排程中的狀態有以下幾個:
狀態 | 概述 |
---|---|
down | 當前的server暫時不參與負載均衡 |
backup | 預留的備份伺服器 |
max_fails | 允許請求失敗的次數 |
fail_timeout | 經過max_fails失敗後, 服務暫停時間 |
max_conns | 限制最大的接收連線數 |
down
down:將該伺服器標記為永久不可用,那麼該代理伺服器將不參與負載均衡。
upstream backend{
server 192.168.200.146:9001 down;
server 192.168.200.146:9002
server 192.168.200.146:9003;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
該狀態一般會對需要停機維護的伺服器進行設定。
backup
backup:將該伺服器標記為備份伺服器,當主伺服器不可用時,將用來傳遞請求。
upstream backend{
server 192.168.200.146:9001 down;
server 192.168.200.146:9002 backup;
server 192.168.200.146:9003;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
此時需要將9094埠的訪問禁止掉來模擬下唯一能對外提供訪問的服務宕機以後,backup的備份伺服器就要開始對外提供服務,此時為了測試驗證,我們需要使用防火牆來進行攔截。
介紹一個工具firewall-cmd
,該工具是Linux提供的專門用來操作firewall的。
查詢防火牆中指定的埠是否開放
firewall-cmd --query-port=9001/tcp
如何開放一個指定的埠
firewall-cmd --permanent --add-port=9002/tcp
批量新增開發埠
firewall-cmd --permanent --add-port=9001-9003/tcp
如何移除一個指定的埠
firewall-cmd --permanent --remove-port=9003/tcp
重新載入
firewall-cmd --reload
其中
--permanent表示設定為持久
--add-port表示新增指定埠
--remove-port表示移除指定埠
max_conns
max_conns=number:用來設定代理伺服器同時活動連結的最大數量,預設為0,表示不限制,使用該配置可以根據後端伺服器處理請求的併發量來進行設定,防止後端伺服器被壓垮。
max_fails和fail_timeout
max_fails=number:設定允許請求代理伺服器失敗的次數,預設為1。
fail_timeout=time:設定經過max_fails失敗後,服務暫停的時間,預設是10秒。
upstream backend{
server 192.168.200.133:9001 down;
server 192.168.200.133:9002 backup;
server 192.168.200.133:9003 max_fails=3 fail_timeout=15;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
負載均衡策略
介紹完Nginx負載均衡的相關指令後,我們已經能實現將使用者的請求分發到不同的伺服器上,那麼除了採用預設的分配方式以外,我們還能採用什麼樣的負載演算法?
Nginx的upstream支援如下六種方式的分配演算法,分別是:
演算法名稱 | 說明 |
---|---|
輪詢 | 預設方式 |
weight | 權重方式 |
ip_hash | 依據ip分配方式 |
least_conn | 依據最少連線方式 |
url_hash | 依據URL分配方式 |
fair | 依據響應時間方式 |
輪詢
是upstream模組負載均衡預設的策略。每個請求會按時間順序逐個分配到不同的後端伺服器。輪詢不需要額外的配置。
upstream backend{
server 192.168.200.146:9001 weight=1;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
weight加權[加權輪詢]
weight=number:用來設定伺服器的權重,預設為1,權重資料越大,被分配到請求的機率越大;該權重值,主要是針對實際工作環境中不同的後端伺服器硬體配置進行調整的,所有此策略比較適合伺服器的硬體配置差別比較大的情況。
upstream backend{
server 192.168.200.146:9001 weight=10;
server 192.168.200.146:9002 weight=5;
server 192.168.200.146:9003 weight=3;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
ip_hash
當對後端的多臺動態應用伺服器做負載均衡時,ip_hash指令能夠將某個客戶端IP的請求通過雜湊演算法定位到同一臺後端伺服器上。這樣,當來自某一個IP的使用者在後端Web伺服器A上登入後,在訪問該站點的其他URL,能保證其訪問的還是後端web伺服器A。
語法 | ip_hash; |
---|---|
預設值 | — |
位置 | upstream |
upstream backend{
ip_hash;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
需要額外多說一點的是使用ip_hash指令無法保證後端伺服器的負載均衡,可能導致有些後端伺服器接收到的請求多,有些後端伺服器接收的請求少,而且設定後端伺服器權重等方法將不起作用。
least_conn
最少連線,把請求轉發給連線數較少的後端伺服器。輪詢演算法是把請求平均的轉發給各個後端,使它們的負載大致相同;但是,有些請求佔用的時間很長,會導致其所在的後端負載較高。這種情況下,least_conn這種方式就可以達到更好的負載均衡效果。
upstream backend{
least_conn;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
此負載均衡策略適合請求處理時間長短不一造成伺服器過載的情況。
url_hash
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,要配合快取命中來使用。同一個資源多次請求,可能會到達不同的伺服器上,導致不必要的多次下載,快取命中率不高,以及一些資源時間的浪費。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達同一臺伺服器,一旦快取住了資源,再此收到請求,就可以從快取中讀取。
upstream backend{
hash &request_uri;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
訪問如下地址:
http://192.168.200.133:8083/a
http://192.168.200.133:8083/b
http://192.168.200.133:8083/c
fair
fair採用的不是內建負載均衡使用的輪換的均衡演算法,而是可以根據頁面大小、載入時間長短智慧的進行負載均衡。那麼如何使用第三方模組的fair負載均衡策略。
upstream backend{
fair;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
但是如何直接使用會報錯,因為fair屬於第三方模組實現的負載均衡。需要新增nginx-upstream-fair
,如何新增對應的模組:
- 下載nginx-upstream-fair模組
下載地址為:
https://github.com/gnosek/nginx-upstream-fair
- 將下載的檔案上傳到伺服器並進行解壓縮
unzip nginx-upstream-fair-master.zip
- 重新命名資源
mv nginx-upstream-fair-master fair
- 使用./configure命令將資源新增到Nginx模組中
./configure --add-module=/root/fair
- 編譯
make
編譯可能會出現如下錯誤,ngx_http_upstream_srv_conf_t結構中缺少default_port
解決方案:
在Nginx的原始碼中 src/http/ngx_http_upstream.h,找到ngx_http_upstream_srv_conf_s
,在模組中新增新增default_port屬性
in_port_t default_port
然後再進行make.
- 更新Nginx
6.1 將sbin目錄下的nginx進行備份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
6.2 將安裝目錄下的objs中的nginx拷貝到sbin目錄
cd objs
cp nginx /usr/local/nginx/sbin
6.3 更新Nginx
cd ../
make upgrade
- 編譯測試使用Nginx
上面介紹了Nginx常用的負載均衡的策略,有人說是5種,是把輪詢和加權輪詢歸為一種,也有人說是6種。那麼在咱們以後的開發中到底使用哪種,這個需要根據實際專案的應用場景來決定的。
負載均衡案例
案例一:對所有請求實現一般輪詢規則的負載均衡
upstream backend{
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
案例二:對所有請求實現加權輪詢規則的負載均衡
upstream backend{
server 192.168.200.146:9001 weight=7;
server 192.168.200.146:9002 weight=5;
server 192.168.200.146:9003 weight=3;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
案例三:對特定資源實現負載均衡
upstream videobackend{
server 192.168.200.146:9001;
server 192.168.200.146:9002;
}
upstream filebackend{
server 192.168.200.146:9003;
server 192.168.200.146:9004;
}
server {
listen 8084;
server_name localhost;
location /video/ {
proxy_pass http://videobackend;
}
location /file/ {
proxy_pass http://filebackend;
}
}
案例四:對不同域名實現負載均衡
upstream itcastbackend{
server 192.168.200.146:9001;
server 192.168.200.146:9002;
}
upstream itheimabackend{
server 192.168.200.146:9003;
server 192.168.200.146:9004;
}
server {
listen 8085;
server_name www.itcast.cn;
location / {
proxy_pass http://itcastbackend;
}
}
server {
listen 8086;
server_name www.itheima.cn;
location / {
proxy_pass http://itheimabackend;
}
}
案例五:實現帶有URL重寫的負載均衡
upstream backend{
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
server {
listen 80;
server_name localhost;
location /file/ {
rewrite ^(/file/.*) /server/$1 last;
}
location / {
proxy_pass http://backend;
}
}
Nginx四層負載均衡
Nginx在1.9之後,增加了一個stream模組,用來實現四層協議的轉發、代理、負載均衡等。stream模組的用法跟http的用法類似,允許我們配置一組TCP或者UDP等協議的監聽,然後通過proxy_pass來轉發我們的請求,通過upstream新增多個後端服務,實現負載均衡。
四層協議負載均衡的實現,一般都會用到LVS、HAProxy、F5等,要麼很貴要麼配置很麻煩,而Nginx的配置相對來說更簡單,更能快速完成工作。
新增stream模組的支援
Nginx預設是沒有編譯這個模組的,需要使用到stream模組,那麼需要在編譯的時候加上--with-stream
。
完成新增--with-stream
的實現步驟:
》將原有/usr/local/nginx/sbin/nginx進行備份
》拷貝nginx之前的配置資訊
》在nginx的安裝原始碼進行配置指定對應模組 ./configure --with-stream
》通過make模板進行編譯
》將objs下面的nginx移動到/usr/local/nginx/sbin下
》在原始碼目錄下執行 make upgrade進行升級,這個可以實現不停機新增新模組的功能
Nginx四層負載均衡的指令
stream指令
該指令提供在其中指定流伺服器指令的配置檔案上下文。和http指令同級。
語法 | stream { ... } |
---|---|
預設值 | — |
位置 | main |
upstream指令
該指令和http的upstream指令是類似的。
四層負載均衡的案例
需求分析
實現步驟
(1)準備Redis伺服器,在一條伺服器上準備三個Redis,埠分別是6379,6378
1.上傳redis的安裝包,redis-4.0.14.tar.gz
2.將安裝包進行解壓縮
tar -zxf redis-4.0.14.tar.gz
3.進入redis的安裝包
cd redis-4.0.14
4.使用make和install進行編譯和安裝
make PREFIX=/usr/local/redis/redis01 install
5.拷貝redis配置檔案redis.conf
到/usr/local/redis/redis01/bin目錄中
cp redis.conf /usr/local/redis/redis01/bin
6.修改redis.conf配置檔案
port 6379 #redis的埠
daemonize yes #後臺啟動redis
7.將redis01複製一份為redis02
cd /usr/local/redis
cp -r redis01 redis02
8.將redis02檔案資料夾中的redis.conf進行修改
port 6378 #redis的埠
daemonize yes #後臺啟動redis
9.分別啟動,即可獲取兩個Redis.並檢視
ps -ef | grep redis
使用Nginx將請求分發到不同的Redis伺服器上。
(2)準備Tomcat伺服器.
1.上傳tomcat的安裝包,apache-tomcat-8.5.56.tar.gz
2.將安裝包進行解壓縮
tar -zxf apache-tomcat-8.5.56.tar.gz
3.進入tomcat的bin目錄
cd apache-tomcat-8.5.56/bin
./startup
nginx.conf配置
stream {
upstream redisbackend {
server 192.168.200.146:6379;
server 192.168.200.146:6378;
}
upstream tomcatbackend {
server 192.168.200.146:8080;
}
server {
listen 81;
proxy_pass redisbackend;
}
server {
listen 82;
proxy_pass tomcatbackend;
}
}
訪問測試。
Nginx快取整合
快取的概念
快取就是資料交換的緩衝區(稱作:Cache),當用戶要獲取資料的時候,會先從快取中去查詢獲取資料,如果快取中有就會直接返回給使用者,如果快取中沒有,則會發請求從伺服器重新查詢資料,將資料返回給使用者的同時將資料放入快取,下次使用者就會直接從快取中獲取資料。
快取其實在很多場景中都有用到,比如:
場景 | 作用 |
---|---|
作業系統磁碟快取 | 減少磁碟機械操作 |
資料庫快取 | 減少檔案系統的IO操作 |
應用程式快取 | 減少對資料庫的查詢 |
Web伺服器快取 | 減少對應用伺服器請求次數 |
瀏覽器快取 | 減少與後臺的互動次數 |
快取的優點
1.減少資料傳輸,節省網路流量,加快響應速度,提升使用者體驗;
2.減輕伺服器壓力;
3.提供服務端的高可用性;
快取的缺點
1.資料的不一致
2.增加成本
本次課程註解講解的是Nginx,Nginx作為web伺服器,Nginx作為Web快取伺服器,它介於客戶端和應用伺服器之間,當用戶通過瀏覽器訪問一個URL時,web快取伺服器會去應用伺服器獲取要展示給使用者的內容,將內容快取到自己的伺服器上,當下一次請求到來時,如果訪問的是同一個URL,web快取伺服器就會直接將之前快取的內容返回給客戶端,而不是嚮應用伺服器再次傳送請求。web快取降低了應用伺服器、資料庫的負載,減少了網路延遲,提高了使用者訪問的響應速度,增強了使用者的體驗。
Nginx的web快取服務
Nginx是從0.7.48版開始提供快取功能。Nginx是基於Proxy Store來實現的,其原理是把URL及相關組合當做Key,在使用MD5演算法對Key進行雜湊,得到硬碟上對應的雜湊目錄路徑,從而將快取內容儲存在該目錄中。它可以支援任意URL連線,同時也支援404/301/302這樣的非200狀態碼。Nginx即可以支援對指定URL或者狀態碼設定過期時間,也可以使用purge命令來手動清除指定URL的快取。
Nginx快取設定的相關指令
Nginx的web快取服務主要是使用ngx_http_proxy_module
模組相關指令集來完成,接下來我們把常用的指令來進行介紹下。
proxy_cache_path
該指定用於設定快取檔案的存放路徑
語法 | proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time][max_size=size]; |
---|---|
預設值 | — |
位置 | http |
path:快取路徑地址,如:
/usr/local/proxy_cache
levels: 指定該快取空間對應的目錄,最多可以設定3層,每層取值為1|2如 :
levels=1:2 快取空間有兩層目錄,第一次是1個字母,第二次是2個字母
舉例說明:
itheima[key]通過MD5加密以後的值為 43c8233266edce38c2c9af0694e2107d
levels=1:2 最終的儲存路徑為/usr/local/proxy_cache/d/07
levels=2:1:2 最終的儲存路徑為/usr/local/proxy_cache/7d/0/21
levels=2:2:2 最終的儲存路徑為??/usr/local/proxy_cache/7d/10/e2
keys_zone:用來為這個快取區設定名稱和指定大小,如:
keys_zone=itcast:200m 快取區的名稱是itcast,大小為200M,1M大概能儲存8000個keys
inactive:指定快取的資料多次時間未被訪問就將被刪除,如:
inactive=1d 快取資料在1天內沒有被訪問就會被刪除
max_size:設定最大快取空間,如果快取空間存滿,預設會覆蓋快取時間最長的資源,如:
max_size=20g
配置例項:
http{
proxy_cache_path /usr/local/proxy_cache keys_zone=itcast:200m levels=1:2:1 inactive=1d max_size=20g;
}
proxy_cache
該指令用來開啟或關閉代理快取,如果是開啟則自定使用哪個快取區來進行快取。
語法 | proxy_cache zone_name|off; |
---|---|
預設值 | proxy_cache off; |
位置 | http、server、location |
zone_name:指定使用快取區的名稱
proxy_cache_key
該指令用來設定web快取的key值,Nginx會根據key值MD5雜湊存快取。
語法 | proxy_cache_key key; |
---|---|
預設值 | proxy_cache_key $scheme$proxy_host$request_uri; |
位置 | http、server、location |
proxy_cache_valid
該指令用來對不同返回狀態碼的URL設定不同的快取時間
語法 | proxy_cache_valid [code ...] time; |
---|---|
預設值 | — |
位置 | http、server、location |
如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
為200和302的響應URL設定10分鐘快取,為404的響應URL設定1分鐘快取
proxy_cache_valid any 1m;
對所有響應狀態碼的URL都設定1分鐘快取
proxy_cache_min_uses
該指令用來設定資源被訪問多少次後被快取
語法 | proxy_cache_min_uses number; |
---|---|
預設值 | proxy_cache_min_uses 1; |
位置 | http、server、location |
proxy_cache_methods
該指令使用者設定快取哪些HTTP方法
語法 | proxy_cache_methods GET|HEAD|POST; |
---|---|
預設值 | proxy_cache_methods GET HEAD; |
位置 | http、server、location |
預設快取HTTP的GET和HEAD方法,不快取POST方法。
Nginx快取設定案例
需求分析
步驟實現
1.環境準備
應用伺服器的環境準備
(1)在192.168.200.146伺服器上的tomcat的webapps下面新增一個js目錄,並在js目錄中新增一個jquery.js檔案
(2)啟動tomcat
(3)訪問測試
http://192.168.200.146:8080/js/jquery.js
Nginx的環境準備
(1)完成Nginx反向代理配置
http{
upstream backend{
server 192.168.200.146:8080;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://backend/js/;
}
}
}
(2)完成Nginx快取配置
4.新增快取配置
http{
proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
upstream backend{
server 192.168.200.146:8080;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_cache itcast;
proxy_cache_key itheima;
proxy_cache_min_uses 5;
proxy_cache_valid 200 5d;
proxy_cache_valid 404 30s;
proxy_cache_valid any 1m;
add_header nginx-cache "$upstream_cache_status";
proxy_pass http://backend/js/;
}
}
}
Nginx快取的清除
方式一:刪除對應的快取目錄
rm -rf /usr/local/proxy_cache/......
方式二:使用第三方擴充套件模組
ngx_cache_purge
(1)下載ngx_cache_purge模組對應的資源包,並上傳到伺服器上。
ngx_cache_purge-2.3.tar.gz
(2)對資原始檔進行解壓縮
tar -zxf ngx_cache_purge-2.3.tar.gz
(3)修改資料夾名稱,方便後期配置
mv ngx_cache_purge-2.3 purge
(4)查詢Nginx的配置引數
nginx -V
(5)進入Nginx的安裝目錄,使用./configure進行引數配置
./configure --add-module=/root/nginx/module/purge
(6)使用make進行編譯
make
(7)將nginx安裝目錄的nginx二級制可執行檔案備份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
(8)將編譯後的objs中的nginx拷貝到nginx的sbin目錄下
cp objs/nginx /usr/local/nginx/sbin
(9)使用make進行升級
make upgrade
(10)在nginx配置檔案中進行如下配置
server{
location ~/purge(/.*) {
proxy_cache_purge itcast itheima;
}
}
Nginx設定資源不快取
前面咱們已經完成了Nginx作為web快取伺服器的使用。但是我們得思考一個問題就是不是所有的資料都適合進行快取。比如說對於一些經常發生變化的資料。如果進行快取的話,就很容易出現使用者訪問到的資料不是伺服器真實的資料。所以對於這些資源我們在快取的過程中就需要進行過濾,不進行快取。
Nginx也提供了這塊的功能設定,需要使用到如下兩個指令
proxy_no_cache
該指令是用來定義不將資料進行快取的條件。
語法 | proxy_no_cache string ...; |
---|---|
預設值 | — |
位置 | http、server、location |
配置例項
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass
該指令是用來設定不從快取中獲取資料的條件。
語法 | proxy_cache_bypass string ...; |
---|---|
預設值 | — |
位置 | http、server、location |
配置例項
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
上述兩個指令都有一個指定的條件,這個條件可以是多個,並且多個條件中至少有一個不為空且不等於"0",則條件滿足成立。上面給的配置例項是從官方網站獲取的,裡面使用到了三個變數,分別是$cookie_nocache、$arg_nocache、$arg_comment
$cookie_nocache、$arg_nocache、$arg_comment
這三個引數分別代表的含義是:
$cookie_nocache
指的是當前請求的cookie中鍵的名稱為nocache對應的值
$arg_nocache和$arg_comment
指的是當前請求的引數中屬性名為nocache和comment對應的屬性值
案例演示下:
log_format params $cookie_nocache | $arg_nocache | $arg_comment;
server{
listen 8081;
server_name localhost;
location /{
access_log logs/access_params.log params;
add_header Set-Cookie 'nocache=999';
root html;
index index.html;
}
}
案例實現
設定不快取資源的配置方案
server{
listen 8080;
server_name localhost;
location / {
if ($request_uri ~ /.*\.js$){
set $nocache 1;
}
proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
}
}
本文來自部落格園,作者:微笑帶你去,轉載請註明原文連結:https://www.cnblogs.com/wxdnq/p/15774175.html