看了下nginx的官方文檔,其中nginx如何處理一個請求講解的很好,現在貼出來分享下。Nginx首先選定由哪一個虛擬主機來處理請求。讓我們從一個簡單的配置(其中全部3個虛擬主機都在端口*:80上監聽)開始:
1 server { 2 listen 80; 3 server_name example.org www.example.org; 4 ... 5 } 6 7 server { 8 listen 80; 9 server_name example.net www.example.net; 10 ... 11 } 12 13 server { 14 listen 80; 15 server_name example.com www.example.com; 16 ... 17 }
在這個配置中,nginx僅僅檢查請求的“Host”頭以決定該請求應由哪個虛擬主機來處理。如果Host頭沒有匹配任意一個虛擬主機,或者請求中根本沒有包含Host頭,那nginx會將請求分發到定義在此端口上的默認虛擬主機。在以上配置中,第一個被列出的虛擬主機即nginx的默認虛擬主機——這是nginx的默認行為。而且,可以顯式地設置某個主機為默認虛擬主機,即在"listen
"指令中設置"default_server
"參數:
1 server { 2 listen 80 default_server; 3 server_name example.net www.example.net; 4 ... 5 }
下面讓我們來看一個復雜點的配置,在這個配置里,有幾個虛擬主機在不同的地址上監聽:
server { listen 192.168.1.1:80; server_name example.org www.example.org; ... } server { listen 192.168.1.1:80; server_name example.net www.example.net; ... } server { listen 192.168.1.2:80; server_name example.com www.example.com; ... }
這個配置中,nginx首先測試請求的IP地址和端口是否匹配某個server配置塊中的listen指令配置。接着nginx繼續測試請求的Host頭是否匹配這個server塊中的某個server_name的值。如果主機名沒有找到,nginx將把這個請求交給默認虛擬主機處理。例如,一個從192.168.1.1:80端口收到的訪問www.example.com的請求將被監聽192.168.1.1:80端口的默認虛擬主機處理,本例中就是第一個服務器,因為這個端口上沒有定義名為www.example.com的虛擬主機。