一、nginx如何選擇適當的虛擬服務器來處理請求?(server匹配)
(1)基於主機名匹配來選擇合適的虛擬服務器
對比請求頭中的host字段與server中的server_name,選擇匹配的服務器。如果都不匹配,則選擇該端口所對應默認的服務器。如果沒有指定默認服務器,默默爲服務器列表中的第一個,可以通過listen port default_server來顯示指定。值得注意的是,默認服務器是與監聽端口相關的,即每個端口都可以指定一個默認服務器。
server {
listen 80;
server_name example.org www.example.org;
...
}
}
如果希望不處理沒有指定host字段的請求,可以通過如下方式來實現:
server {
listen 80;
server_name "";
return 444;
}
server_name也可以不指定,默認就是爲“”,匹配沒有指定host的請求。
(2)基於IP 和 主機名來選擇合適的虛擬服務器
首先按照IP、端口進行匹配,匹配通過的server,再按照主機名進行匹配。如果主機名不匹配,則由默認匹配該IP、端口的默認服務器來進行處理。
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
...
}
}
server {
listen 192.168.2.1:80 ;
server_name example.net www.example.net;
...
}
}
二、nginx如何選擇合適的location來處理請求(location匹配)
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;
}
}
}
location的匹配方式分兩種:a.根據路徑前綴來匹配 b.根據正則表達式來匹配
匹配的原則是:首先檢測前綴匹配的location,選擇有最大前綴的location作爲備用選項(備胎)。然後檢測正則表達式匹配的location,檢測順序與location排列順序一致,如果某項location匹配,則後續不再檢測。如果均不匹配,則使用最大前綴匹配的location。
處理方式:對於靜態資源,比如/logo.jpg,則加上root指定的目錄,得到logo.jpg在文件系統的位置 如/data/www/logo.jpg,返回客戶端。
對於腳本index.php,請求會被傳遞給localhost:9090進行處理,傳遞的參數就是腳本的位置 /data/www/index.php,執行完成後返回結果。