1. 程式人生 > 資訊 >威剛釋出 ISSS31AP 2.5" 工業級固態硬碟:最大 4TB,3000 次 P/E

威剛釋出 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,如何新增對應的模組:

  1. 下載nginx-upstream-fair模組
下載地址為:
	https://github.com/gnosek/nginx-upstream-fair
  1. 將下載的檔案上傳到伺服器並進行解壓縮
unzip nginx-upstream-fair-master.zip
  1. 重新命名資源
mv nginx-upstream-fair-master fair
  1. 使用./configure命令將資源新增到Nginx模組中
./configure --add-module=/root/fair
  1. 編譯
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.

  1. 更新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
  1. 編譯測試使用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
指的是當前請求的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