圖文解說nginx中server的匹配順序

在開始處理一個http請求時,nginx會取出header頭中的host,與nginx.conf中每個server的server_name進行匹配,以此決定到底由哪一個server塊來處理這個請求。

server_name與host匹配優先級如下:

  • 1、完全匹配

  • 2、通配符在前的,如*.test.com

  • 3、在後的,如www.test.*

  • 4、正則匹配,如~^.www.test.com$

如果都不匹配

  • 1、優先選擇listen配置項後有default或default_server的

  • 2、找到匹配listen端口的第一個server塊

空口無憑,驗證一下:

1、最高優先級:完全匹配

首先,在nginx.conf中創建2個server,1個完全匹配,1個通配符匹配

通配符server放在最前,以證明完全匹配的優先級與配置順序無關

img

接下來配置域名映射

vim /etv/hosts

img

訪問測試:

img

結論:完全匹配的優先級高於通配符匹配

2、第二優先級:通配符在前

修改server配置,還是2個server,通配符在後的server放到前面,同樣是爲了消除配置順序給測試帶來的影響

img

訪問測試

img

結論:通配符在前的優先級高於在後的

3、第三優先級:通配符在後

修改server配置,還是2個server,通配符在後的server放到前面,同樣是爲了消除配置順序給測試帶來的影響

img

訪問測試

img

結論:通配符在後的優先級高於正則匹配的server

到此,第一部分的匹配規則已經驗證完畢。接下來驗證都不匹配的情況

4、listen配置項中default的影響

配置3個server

img

訪問測試

img

結論:正則匹配雖然優先級較低,但是仍然高於default;在都匹配不到的情況下,default開始起作用。

5、驗證default的作用域,default在匹配成功的情況下是否會影響優先級

2個server,給優先級低的server配置default屬性

img

訪問測試

img

結論:default只能作用於匹配不到的情況下,而且nginx.conf不可以配多個default,否則nginx重啓時候會提示錯誤

img

6、驗證沒有匹配成功,且沒有default的情況

2個server

img

訪問測試

img

結論:在server_name都匹配失敗的前提下,並且listen沒有default屬性,那麼端口號和server的順序將發揮作用,它會去找端口匹配的位置最靠前的server。

最終的結論就是開頭的這段話:

  • 1、完全匹配

  • 2、通配符在前的,如*.test.com

  • 3、在後的,如www.test.*

  • 4、正則匹配,如~^.www.test.com$

如果都不匹配

  • 1、優先選擇listen配置項後有default或default_server的

  • 2、找到匹配listen端口的第一個server塊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章