Nginx首先選定由哪一個虛擬主機來處理請求?
讓我們從一個簡單的配置(其中全部3個虛擬主機都在端口*:80上監(jiān)聽)開始:
server {
listen 80;
server_name example.org www.example.org;
...
}
server {
listen 80;
server_name example.net www.example.net;
...
}
server {
listen 80;
server_name example.com www.example.com;
...
}
在這個配置中房维,nginx僅僅檢查請求的“Host”頭以決定該請求應由哪個虛擬主機來處理捉片。如果Host頭沒有匹配任意一個虛擬主機,或者請求中根本沒有包含Host頭单匣,那nginx會將請求分發(fā)到定義在此端口上的默認虛擬主機蚁阳。在以上配置中,第一個被列出的虛擬主機即nginx的默認虛擬主機——這是nginx的默認行為鸽照。而且螺捐,可以顯式地設置某個主機為默認虛擬主機,即在"listen"指令中設置"default_server"參數(shù):
server {
listen 80 default_server;
server_name example.net www.example.net;
...
}
"default_server"參數(shù)從0.8.21版開始可用。在之前的版本中定血,應該使用"default"參數(shù)代替赔癌。
請注意"default_server"是監(jiān)聽端口的屬性,而不是主機名的屬性澜沟。
一個簡單PHP站點配置
server {
listen 80;
server_name example.org www.example.org;
root /data/www;
location / {
index index.html index.php;
}
location ~* .(gif|jpg|png)$ {
expires 30d;
}
location ~ .php$ {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}
}
首先灾票,nginx使用前綴匹配找出最準確的location,這一步nginx會忽略location在配置文件出現(xiàn)的順序茫虽。上面的配置中刊苍,唯一的前綴匹配location是"/",而且因為它可以匹配任意的請求濒析,所以被作為最后一個選擇正什。接著,nginx繼續(xù)按照配置中的順序依次匹配正則表達式的location号杏,匹配到第一個正則表達式后停止搜索舰讹。匹配到的location將被使用丹墨。如果沒有匹配到正則表達式的location,則使用剛剛找到的最準確的前綴匹配的location,現(xiàn)在讓我們來看使用上面的配置头遭,請求是怎樣被處理的:
- 請求"
/logo.gif
"首先匹配上location "/
",然后匹配上正則表達式"\.(gif|jpg|png)$
"这揣。因此析珊,它將被后者處理。根據(jù)"root /data/www
"指令蜈块,nginx將請求映射到文件/data/www/logo.gif
"鉴腻,并發(fā)送這個文件到客戶端。 - 請求"
/index.php
"首先也匹配上location "/
"百揭,然后匹配上正則表達式"\.(php)$
"爽哎。 因此,它將被后者處理器一,進而被發(fā)送到監(jiān)聽在localhost:9000的FastCGI服務器课锌。fastcgi_param指令將FastCGI的參數(shù)SCRIPT_FILENAME
的值設置為"/data/www/index.php
",接著FastCGI服務器執(zhí)行這個文件祈秕。變量$document_root
等于root指令設置的值渺贤,變量$fastcgi_script_name
的值是請求的uri,"/index.php
"请毛。 - 請求"
/about.html
"僅能匹配上location "/
"志鞍,因此,它將使用此location進行處理方仿。根據(jù)"root /data/www
"指令固棚,nginx將請求映射到文件"/data/www/about.html
"统翩,并發(fā)送這個文件到客戶端。 - 請求"
/
"的處理更為復雜此洲。它僅能匹配上location "/
"厂汗,因此,它將使用此location進行處理呜师。然后娶桦,index指令使用它的參數(shù)和"root /data/www
"指令所組成的文件路徑來檢測對應的文件是否存在。如果文件/data/www/index.html
不存在汁汗,而/data/www/index.php
存在衷畦,此指令將執(zhí)行一次內部重定向到"/index.php
",接著nginx將重新尋找匹配"/index.php
"的location碰酝,就好像這次請求是從客戶端發(fā)過來一樣霎匈。正如我們之前看到的那樣,這個重定向的請求最終交給FastCGI服務器來處理送爸。