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将請求轉發到後端伺服器
配置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将這個端口占用使用.
是否請求到達nginx之後,隻要滿足端口号的監聽,就能确定目前請求是哪個server處理嗎?
server_name 通過它來判斷這次請求的域名攜帶的是誰
計算機生成了可選文字:www.test1.comwww.test2.comwww.test3.com0818080serverlisten80
servername域名1serverlisten80servername域名2
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正常啟動
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