天天看點

niginx的location的location詳細規則和優先級關系以及測試案例2.1比對文法2.2優先級判斷2.3練習3.1處理邏輯如何執行3.2功能測試3.3流程解析

1.介紹

在nginx的server配置中,可以一個server具備多個location,利用比對規則,多角度,多需求的比對多種請求路徑uri.這時,需要了解location詳細規則和優先級關系

2.規則

2.1比對文法

精确比對:=/image

location =/image { location 邏輯}

請求uri路徑必須 等于 /image

有修飾的字元串字首:^~/image

location ^~/image { location 邏輯}

請求uri路徑是 以/image開始的.一旦比對到,處于優先級最高狀态,其他規則一概不再比對(停止比對)

無修飾的字元串字首: /image

location /image { location 邏輯}

請求uri路徑是 以/image開始的.

正則比對:

區分大小寫 ~.png$ ~.Png$ ~.pNg$

不區分大小寫: ~.png ∣   ∗ . P n g |~*.Png ∣ ∗.Png

請求路徑uri隻要滿足正則就能比對到

location ~.png$ { location 邏輯}

通配: /

比對到所有目前server的請求

2.2優先級判斷

上述各種比對規則,使得如果server中location規則非常多,容易出現包含關系,必定要判斷優先級

上述順序從上到下優先級依次降低

精确比對>有修飾>無修飾>正則>通配

同種規則有包含關系

字元串字首比對

原則:最大比對長度,優先級最高(精度越高,優先級越高)

正則

原則:誰配置location在上,加載更靠前,優先級更高

2.3練習

server {
       listen 80;
       server_name www.easy.com;

location ^~/image {return 200}
location /image {return 201}
location ^~/image/easymall {return 202}
location =/image/ {return 203}
location ~*.png$ {return 204}
location ~.pNg$ {return 205}
location ~.(png|jpg|gif|jpeg)$ {return 206}
location / {return 207}
}
           

請求url uri 傳回值

http://www.easy.com / 207

http://www.easy.com/image /image 203

http://www.easy.com/image/easy /image/easy 200

http://www.easy.com/image/easy.pNg /image/easy.pNg 200

http://www.easy.com/image/easymall.png /image/easymall.png 202

http://www.easy.com/haha.png /haha.png 204

和字元串比對有關的 字首,精确,這些都會把uri中的路徑過濾掉,使用剩餘的uri拼接proxy_pass,能夠起到保護後端接口資源的功能

server {

listen 80;

server_name www.ou.com;

location /hello {

proxy_pass http://localhost:8090/;

}

}

浏覽器請求發起:http://www.ou.com/hello

|進入nginx 比對server

重要 | uri /hello url-patter /hello 比對過濾了hello,uri剩下/

最終響應資料:http://localhost:8090/

這樣的過濾規則,是為了保護後端的接口

需求說明

使用nginx将請求轉發到後端伺服器

niginx的location的location詳細規則和優先級關系以及測試案例2.1比對文法2.2優先級判斷2.3練習3.1處理邏輯如何執行3.2功能測試3.3流程解析

配置nginx.conf

在nginx的根目錄的conf檔案夾下,找到nginx.conf

http{ 目前nginx的所有http服務的功能

server{} 每一個server都代表一個虛拟伺服器,每個server都能處理不同請求

server{}

server{}

server{}

….

}

3 編寫一個server結構

#一個server表示一個虛拟伺服器 一個server跟一個獨立tomcat類似
server {
#目前虛拟伺服器監聽的端口 多個nginx server可以監聽同一個端口
listen 80;
#虛拟伺服器的域名 不可以多個server重複
server_name www.ou.com;
#處理請求的通路邏輯,請求應該怎麼交給後端的tomcat處理在location決定,一個server下可以有若幹個location location url-pattern www.ou.com/hello;www.ou.com/a/b/c/d
location / {
#/表示通配 當别的比對url-pattern 的location全部不滿足時,/必定滿足
proxy_pass http://localhost:8090/;
}
}
 
           

nginx作為一個http伺服器,會在啟動時加載nginx.conf配置檔案

加載到http下的多個server的内容,每一個server會被nginx啟動為一個線程實作http伺服器功能–接收,發送請求

通路nginx的請求非常多,多個server,某一次請求到底誰來處理.

server内容的配置決定的某次請求交給哪個虛拟伺服器server

listen :目前server在nginx伺服器中監聽的端口号,隻要有一個server配置了這個端口号的監聽,nginx将這個端口占用使用.

niginx的location的location詳細規則和優先級關系以及測試案例2.1比對文法2.2優先級判斷2.3練習3.1處理邏輯如何執行3.2功能測試3.3流程解析

是否請求到達nginx之後,隻要滿足端口号的監聽,就能确定目前請求是哪個server處理嗎?

server_name 通過它來判斷這次請求的域名攜帶的是誰

計算機生成了可選文字:www.test1.comwww.test2.comwww.test3.com0818080serverlisten80

servername域名1serverlisten80servername域名2

niginx的location的location詳細規則和優先級關系以及測試案例2.1比對文法2.2優先級判斷2.3練習3.1處理邏輯如何執行3.2功能測試3.3流程解析

server中的 listen和server_name來決定某一個請求到nginx的通路是否交給該虛拟伺服器server處理,多個server不能有相同的端口同時還有相同的域名

3.1處理邏輯如何執行

location 用來比對目前這個請求uri位址,可以在同一個server中配置多個location比對uri的結構,滿足結構的,優先級最高的location負責處理這次請求具體邏輯

uri位址: /a/b/c

url位址: http://www.ou.com/a/b/c

location / 表示隻要uri位址字元串是以 “/” 開頭的,就比對上了這個location.看成是個通配,因為任何uri位址都會以"/"開始

proxy_pass 處理動态資料的轉發 (靜态資料轉發 root)

測試案例

server{

listen 80;

server_name www.ou.com;

location / {

proxy_pass http://127.0.0.1:8090/;

}

}

nginx啟動後會加載這個server,server來監聽80端口,到達80端口請求判斷域名是否是www.ou.com,滿足則開始判斷location ,轉發到proxy_pass 8091工程

3.2功能測試

保證一個啟動在8090的springboot運作

啟動工程

保證www.ou.com能夠通路到nginx 配置hosts檔案

127.0.0.1 表示的是nginx的伺服器ip

127.0.0.1 www.ou.com

nginx正常啟動

niginx的location的location詳細規則和優先級關系以及測試案例2.1比對文法2.2優先級判斷2.3練習3.1處理邏輯如何執行3.2功能測試3.3流程解析

3.3流程解析

用戶端發起位址:http://www.ou.com/hello

|域名的ip位址映射 127.0.0.1:80 進入nginx伺服器

進nginx**

|多個server 判斷請求端口和請求域名 www.ou.com

|交給一個虛拟伺服器server處理

|比對location的url-pattern /hello 比對 / 比對成功

|進入location 内部 交給proxy_pass 定位真正的後端伺服器

|/hello 拼接到 http://localhost:8090/hello

出nginx**

最終響應的接口:http://localhost:8090/hello

課堂案例:流程解析

用戶端發起位址:http://www.ou.com/get/user

|進入nginx 域名 ip映射,ip位址nginx伺服器ip

|server 比對location /get/user 比對 /

|proxy_pass 拼接請求 http://localhost:8090/get/user

最終響應的接口:http://localhost:8090/get/user