看了下nginx的官方文檔,其中nginx如何處理一個請求講解的很好,如今貼出來分享下。Nginx首先選定由哪個虛擬主機來處理請求。讓咱們從一個簡單的配置(其中所有3個虛擬主機都在端口*:80上監聽)開始:nginx
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的虛擬主機。spa