nginx收到請求時第一步是決定由哪個伺服器來處理。以乙個配置了三個虛擬伺服器的例子為例,三個虛擬伺服器軍監聽80埠。
server
server
server
根據以上配置,nginx只對請求的「host」頭域檢查,並根據其值決定將請求路由給哪個伺服器。如果和任何乙個伺服器都不匹配,或者請求不包含乙個「host」頭域,那麼nginx會將請求路由給監聽在該埠上的預設伺服器。上述配置中,預設伺服器為第乙個,nginx預設第一項為預設伺服器。通過default_server可以顯示的指定預設伺服器:
server
(注意:預設伺服器屬性在0.8.21以後的版本才有)
如果收到乙個沒有攜帶host頭域的請求,那麼該請求應該不處理而直接拋棄掉。通過如下配置即可:
server
伺服器名設定為空字串,這樣就可以配未攜帶host頭域的請求,然後返回乙個nginx的非標準444響應並關閉連線。
server
server
server
在該例子中,nginx首先檢查各個虛擬伺服器配置塊內的ip和埠是否匹配請求中攜帶的ip和埠是否,然後再檢查上一步各匹配項中的server_name是否存在匹配請求的host頭域的。如果不存在,那麼請求將被路由給預設伺服器處理。
例如,乙個從192.168.1.1:80接收並發給www.example.com的請求將被監聽在192.168.1.1:80的預設伺服器處理,即上面配置中的第乙個伺服器,因為該埠上沒有名為www.example.com的伺服器。如上所述,預設伺服器是乙個監聽埠的屬性,那麼不同的埠可以有不同的預設伺服器:
server
server
server
現在,看看nginx怎樣為選擇乙個location為典型、簡單的php站點處理請求:
}nginx首先選擇字首匹配最明確的location。在上述的配置中,唯一的字首匹配location是」/」,因為它匹配任何請求,因此它是所有請求的最後選擇。nginx檢查配置檔案中順序列出的location中的正規表示式,遇到第乙個匹配項(此處為全匹配而不是字首匹配)時即停止然後使用該項。如果沒有找到,nginx將使用此前找到的匹配字首最明確的location。注意所有型別的locations(字首、全部)只和請求的uri組成部分對比,而不包括引數。這是因為查詢字串中的引數可能以多種方式出現,如:
/index.php?user=john&page=1
/index.php?page=1&user=john
同時,任何人都可以再請求字串中請求任何東西:
/index.php?page=1&something+else&user=john
現在,我們來看一下在以上配置下,請求將會被怎麼處理:
1、請求」/logo.gif」 匹配字首location 「/」,其次匹配正規表示式」.(gif|jpg|png)$」.因此,該請求將被後面的location處理。因為」root /data/www」,該請求被影射到檔案/data/www/logo.gif,該檔案將被傳送到客戶端
2、請求」/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"
3、請求」/about.html」之和字首匹location」/」匹配,因此,它將被該location處理。根據配置」root /data/www」,該請求被對映到檔案 /data/www/about.html,並且該檔案將被傳送到客戶端
4、處理請求」/」相對而言更加複雜。它只和字首location 「/」 匹配,因此將被該location處理。」index」配置項根據配置」root /data/www」 檢查index檔案是否存在。若果檔案/data/www/index.html不存在,而檔案/data/www/index.php存在,那麼該請求將被在nginx內部被重定向為index.php,然後nginx好像從客戶端收到該請求一樣重新搜尋location。如前所述,該重定向請求將被fastcgi伺服器處理。
Nginx如何處理乙個請求
基於名字的虛擬主機 nginx首先選定由哪乙個虛擬主機來處理請求。讓我們從乙個簡單的配置 其中全部3個虛擬主機都在埠 80上監聽 開始 server server server 在這個配置中,nginx僅僅檢查請求的 host 頭以決定該請求應由哪個虛擬主機來處理。如果host頭沒有匹配任意乙個虛擬...
Nginx如何處理乙個請求
nginx是什麼?nginx是俄羅斯人編寫的十分輕量級的http伺服器,nginx,它的發音為 engine x 是乙個高效能的http和反向 伺服器,同時也是乙個imap pop3 smtp 伺服器 nginx是由俄羅斯人 sysoev為俄羅斯訪問量第二的 rambler.ru站點開發的,它已經在...
Nginx如何處理乙個請求
基於名字的虛擬主機 nginx首先選定由哪乙個虛擬主機來處理請求。讓我們從乙個簡單的配置 其中全部3個虛擬主機都在埠 80上監聽 開始 server server server 在這個配置中,nginx僅僅檢查請求的 host 頭以決定該請求應由哪個虛擬主機來處理。如果host頭沒有匹配任意乙個虛擬...