nginx理解 如何處理乙個請求

2022-07-13 08:27:09 字數 3117 閱讀 9769

最好的方法是看官方文件,以下內容都是來自官方文件

如何防止處理未定義主機名的請求

基於網域名稱和ip混合的虛擬主機

乙個簡單php站點配

1、基於名字的虛擬主機

nginx首先選定由哪乙個虛擬主機來處理請求。讓我們從乙個簡單的配置(其中全部3個虛擬主機都在埠*:80上監聽)開始:

server

server

server

在這個配置中,nginx僅僅檢查請求的「host」頭以決定該請求應由哪個虛擬主機來處理。如果host頭沒有匹配任意乙個虛擬主機,或者請求中根本沒有包含host頭,那nginx會將請求分發到定義在此埠上的預設虛擬主機。在以上配置中,第乙個被列出的虛擬主機即nginx的預設虛擬主機——這是nginx的預設行為。而且,可以顯式地設定某個主機為預設虛擬主機,即在"listen"指令中設定"default_server"引數:

server

"default_server"引數從0.8.21版開始可用。在之前的版本中,應該使用"default"引數代替。請注意"default_server"是監聽埠的屬性,而不是主機名的屬性。後面會對此有更多介紹。

總結來說,監聽80埠時沒有指定ip,那就根據你請求的主機名來進行匹配,也就是server name裡面的網域名稱,匹配成功則選擇這個server,如果不成功就採用預設的server

如果不允許請求中缺少「host」頭,可以定義如下主機,丟棄這些請求:

server

在這裡,我們設定主機名為空字串以匹配未定義「host」頭的請求,而且返回了乙個nginx特有的,非http標準的返回碼444,它可以用來關閉連線。

從0.8.48版本開始,這已成為主機名的預設設定,所以可以省略server_name ""。而之前的版本使用機器的hostname作為主機名的預設值。

下面讓我們來看乙個複雜點的配置,在這個配置裡,有幾個虛擬主機在不同的位址上監聽:

server

server

server

這個配置中,nginx首先測試請求的ip位址和埠是否匹配某個server配置塊中的listen指令配置。(就是如果存在ip和埠,則優先指定對應的ip和埠,選擇對應的server配置)

接著nginx繼續測試請求的host頭是否匹配這個server塊中的某個server_name的值。如果主機名沒有找到,nginx將把這個請求交給預設虛擬主機處理。

例如,乙個從192.168.1.1:80埠收到的訪問www.example.com的請求將被監聽192.168.1.1:80埠的預設虛擬主機處理,本例中就是第乙個伺服器,因為這個埠上沒有定義名為www.example.com的虛擬主機。

預設伺服器是監聽埠的屬性,所以不同的監聽埠可以設定不同的預設伺服器:

server

server

server

乙個簡單php站點配置

現在我們來看在乙個典型的,簡單的php站點中,nginx怎樣為乙個請求選擇location來處理:

}個人理解:

1、### location /是匹配任何的,排在最後

2、~* \.(gif|jpg|png)$,意思是 ~是匹配符號, *(乙個或者多個字元) ,\.(對.進行轉義) ,(gif|jpg|png)$ (以.git,.jpg,.png結尾的)

3、~ \.php$,同理,就是請求中以.php結尾的,然後執行fastcgi來解釋php言語

首先,nginx使用字首匹配找出最準確的location,這一步nginx會忽略location在配置檔案出現的順序。上面的配置中,唯一的字首匹配location是"/",而且因為它可以匹配任意的請求,所以被作為最後乙個選擇。接著,nginx繼續按照配置中的順序依次匹配正規表示式的location,匹配到第乙個正規表示式後停止搜尋。匹配到的location將被使用。如果沒有匹配到正規表示式的location,則使用剛剛找到的最準確的字首匹配的location。

請注意所有location匹配測試只使用請求的uri部分,而不使用引數部分。這是因為寫引數的方法很多,比如:

/index.php?user=john&page=1

/index.php?page=1&user=john

除此以外,任何人在請求串中都可以隨意新增字串:

/index.php?page=1&something+else&user=john

現在讓我們來看使用上面的配置,請求是怎樣被處理的:

• 請求"/logo.gif"首先匹配上location "/",然後匹配上正規表示式"\.(gif|jpg|png)$"。因此,它將被後者處理。根據"root /data/www"指令,nginx將請求對映到檔案/data/www/logo.gif",並傳送這個檔案到客戶端。

• 請求"/index.php"首先也匹配上location "/",然後匹配上正規表示式"\.(php)$"。 因此,它將被後者處理,進而被傳送到監聽在localhost:9000的fastcgi伺服器。fastcgi_param

指令將fastcgi的引數script_filename的值設定為"/data/www/index.php",接著fastcgi伺服器執行這個檔案。變數$document_root等於root

指令設定的值,變數$fastcgi_script_name的值是請求的uri,"/index.php"。

• 請求"/about.html"僅能匹配上location "/",因此,它將使用此location進行處理。根據"root /data/www"指令,nginx將請求對映到檔案"/data/www/about.html",並傳送這個檔案到客戶端。

• 請求"/"的處理更為複雜。它僅能匹配上location "/",因此,它將使用此location進行處理。然後,index指令使用它的引數和"root /data/www"指令所組成的檔案路徑來檢測對應的檔案是否存在。如果檔案/data/www/index.html不存在,而/data/www/index.php存在,此指令將執行一次內部重定向到"/index.php",接著nginx將重新尋找匹配"/index.php"的location,就好像這次請求是從客戶端發過來一樣。正如我們之前看到的那樣,這個重定向的請求最終交給fastcgi伺服器來處理。

Nginx如何處理乙個請求

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

nginx如何處理乙個請求

nginx收到請求時第一步是決定由哪個伺服器來處理。以乙個配置了三個虛擬伺服器的例子為例,三個虛擬伺服器軍監聽80埠。server server server根據以上配置,nginx只對請求的 host 頭域檢查,並根據其值決定將請求路由給哪個伺服器。如果和任何乙個伺服器都不匹配,或者請求不包含乙個...

Nginx如何處理乙個請求

nginx是什麼?nginx是俄羅斯人編寫的十分輕量級的http伺服器,nginx,它的發音為 engine x 是乙個高效能的http和反向 伺服器,同時也是乙個imap pop3 smtp 伺服器 nginx是由俄羅斯人 sysoev為俄羅斯訪問量第二的 rambler.ru站點開發的,它已經在...