第三章Nginx如何處理乙個請求

2021-08-09 23:44:36 字數 3648 閱讀 6231

nginx伺服器在處理乙個請求時是按照兩部分進行的,第一部分ip、網域名稱,第二部分是uri

(一)、ip、網域名稱部分的處理

按照ip、網域名稱、埠以及default_server標誌來處理請求

1、基於名字的虛擬主機

在此配置中,nginx根據請求頭行中的host,決定將請求路由到哪個server。如果請求頭中的host不與任何伺服器匹配,或者請求頭中根本沒有包含host,那麼nginx將會把請求路由到預設的server上。在上面的配置中,預設的為第乙個server,也可以使用指令,明確哪乙個是預設的,設定方法為:在指令listen之後新增引數「default_server」

server

default_server這個引數是從0.8.21版本開始提供的,早起的版本使用的是「default」引數。

注意:預設的伺服器監聽是針對埠來設定的,而不是針對server的名字。

2、阻止處理對不明確主機名的處理

在客戶請求頭中,有可能會有host行不明確的情況,如果你不想處理這部分使用者的請求,那麼可以定義乙個預設的server來丟棄這列請求。

server

我們選擇乙個不存在的網域名稱「_」作為伺服器名字,並且將返回特殊的非標準**「444」,以便關閉這個連線

注意:應該為這個伺服器設定乙個名字,否則nginx將會使用它的hostname。

3、基於ip和網域名稱的虛擬網域名稱伺服器處理請求

server

server

server

在這個配置中,nginx首先測試與server段listen指令對應的ip和埠號,然後再測試與server區段server_name指令對應的請求頭中host行中的值,即ip優先,如果沒有找到對應的伺服器名字,那麼請求將會由預設的伺服器進行處理。

(二)、uri部分的處理

uri部分是通過location實現的,可以使用正規表示式。

在上面配置中,location「/」,由於它可以匹配任何請求,因此它將被作為最後使用(也可以說最後的一種補救方法),然後會按照配置檔案中的順序,nginx開始檢查通過正規表示式給定的location,第乙個匹配的表示式將會停止本次搜尋,nginx就會使用該location。如果沒有正規表示式匹配這個請求,那麼nginx會使用先前找到的最明確的字面字元的location。

(三)、伺服器的名稱

伺服器的名字是由指令server_name來定義的,並且也決定了使用哪乙個server段來提取對客戶端請求的響應。伺服器名字的定義可以使用準確名字、萬用字元名字或者是正規表示式。

這些名字的順序為: 

(1)、準確名字

(2)、以*號開始的萬用字元名字:*.spring.cc

(3)、以*號結尾的萬用字元名字:spring.*

(4)、按照正則表達列舉在配置檔案中的順序

1、萬用字元名字

萬用字元的名字僅可以再名字的開始或結尾包含乙個星號,星號僅在.號的邊緣。乙個特殊的萬用字元格式「.spring.cc」,不但能夠準確匹配名字「spring.cc」,還能匹配萬用字元名字「*.spring.cc」。

2、正規表示式名字

要使用nginx提供的正規表示式,需要在編譯安裝nginx的時候首先安裝perl程式語言表示式(pcre)。為了使用正規表示式,在伺服器名字開始之前使用乙個波浪號字元「~」:

server_name   "~^(?\w\d+)\.nginx\.net$";

否則,就會被作為準確的名字對待。或者如果在表示式中包含乙個星號(*),那麼會被作為乙個萬用字元名字。不要忘記設定錨點符號「^」、「$」,他們不需要在語法上,而是要在邏輯上。

注意:網域名稱中的.要是用反斜線進行轉義。乙個包含有「」的正規表示式要使用引號。

**獲的正規表示式以後可以作為變數

server

}3、其它不同種類的名字

如果你想通過不是預設的server區段來處理乙個請求頭行中卻沒有包含host的請求,那麼你應該指定乙個空的名字:

server_name  spring.cc  "";

如果客戶端使用了乙個沒有在server區段通過server_name指定的名字,那麼nginx會使用乙個空的名字作為伺服器的名字

如果乙個客戶端請求使用了ip,那麼在請求頭行中,host包含的不是伺服器的名字,而是ip位址,那麼在這種情況下,如果想讓客戶端通過ip訪問到某個server區段,那麼可以再nginx配置檔案中指定適當的ip位址。

在捕獲所有伺服器的例子中,你可能會看到乙個奇怪的名字「_」

server_name  _;

這裡指定的不是什麼特別的名字,它只是乙個無效的網域名稱,從來不會與任何真實名字相匹配。也可以使用類似於「--」、「!@#」等符號。

4、名字優化

準確的名字和萬用字元名字作為雜湊值被儲存在雜湊表中,這些雜湊值被繫結到監聽埠上,每乙個監聽的埠有三個雜湊值:

(1)、乙個準確名字的雜湊值

(2)、乙個星號開始名字的雜湊值

(3)、乙個星號結尾名字的雜湊值

該雜湊值大小大小的優化配置 分階段進行。因此,在cpu的快取中在最少失誤的情況下找到該名字。

準確名字的雜湊值最先被搜尋到。如果乙個雜湊值沒有通過準確名字被找到,將會使用星號開始的雜湊值開始搜尋,如果還沒找到將會使用星號結束的雜湊值進行搜尋——搜尋萬用字元名字雜湊值要慢於搜尋準確名字雜湊值,只是由於名字是通過網域名稱部分搜尋所致。

「.spring.cc」是被儲存在萬用字元號雜湊表裡。

5、相容性

從0.8.48版本開始,可以使用空名字來表示預設伺服器

從0.8.25版本開始,可以使用命名正規表示式來捕獲伺服器名字

從0.7.40版本開始,支援正規表示式伺服器名字**

從0.7.12版本開始,支援「」伺服器名稱

從0.6.25版本開始,萬用字元伺服器名字或正規表示式名字被作為首選伺服器名字來使用

從0.6.7版本開始,支援正規表示式

從0.6.0版本開始,支援統配符格式「nginx.*」

從0.3.18版本開始,支援特殊格式「.nginx.org」

從0.1.13版本開始,支援萬用字元格式「*.nginx.org」

6、基於目錄名的網域名稱訪問

(1)、正規表示式處於主機名字的位置上

server   

}  在這裡我們使用了正規表示式網域名稱,網域名稱已定,主機名可以隨便,但是主機名不要太長,否則也會出現其他的問題。在這裡從理論上來說可以訪問***.t1.com,其中***為目錄/usr/local/nginx0.8/html/t1.com下的任何目錄名

(2)、正規表示式處於網域名稱的位置上

server   

}  

7、關於$1、$2…的使用

server_name  ~^(www\.)?(.+)$; 

root  /usr/local/nginx0.8/html/www/$2; 

"www."作為變數$1的值了,而其餘的部分作為了$2的值。

Python第三章 異常處理

章節練習 try 檢測範圍 except exception as reason 出現異常後的處理 try f open test.txt print f.read f.close except oserror print 開啟檔案出錯 開啟檔案出錯 try f open test.txt prin...

第三章 OSPF(一)

3.1 ospf的基本概念 ospf open shortest path first 開放式最短路徑優先協議是典型的鏈路狀態協議,支援vlsm 可變長子網掩碼 支援路由彙總等,另外區域 area 的引入使得ospf能夠支援更大規模的網路。ospf現在主要有兩個版本,乙個是面向ipv4的ospfv2...

Nginx如何處理乙個請求

基於名字的虛擬主機 nginx首先選定由哪乙個虛擬主機來處理請求。讓我們從乙個簡單的配置 其中全部3個虛擬主機都在埠 80上監聽 開始 server server server 在這個配置中,nginx僅僅檢查請求的 host 頭以決定該請求應由哪個虛擬主機來處理。如果host頭沒有匹配任意乙個虛擬...