nginx是如何處理請求的

一、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,執行完成後返回結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章