一, 基于名稱的虛擬服務器
nginx首先確定哪個服務器應處理該請求,讓我們從一個簡單的配置開始,其中所有三個虛擬服務器都在埠*:80上偵聽:
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僅測驗請求的header欄位“host”以確定應將請求路由到哪個服務器,如果其值與任何服務器名稱都不匹配,或者請求根本不包含此header欄位,則nginx會將請求路由到該埠的默認服務器,在上面的配置中,默認服務器是第一個服務器-這是nginx的標準默認行為,還可以使用listen指令中的default_server引數來顯式設定哪個服務器應為默認服務器:
server {
listen 80 default_server;
server_name example.net www.example.net;
...
}
自0.8.21版以后的版本,default_server引數已可用,在早期版本中,應改用默認引數,
請注意,默認服務器是偵聽埠的屬性,而不是服務器名稱的屬性,稍后再詳細介紹,
二, 如何阻止使用未定義的服務器名稱的http請求
如果不允許不帶“主機”header欄位的請求,則可以定義僅丟棄請求的服務器:
server {
listen 80
server_name ””;
return 444;
}
在這里,服務器名稱設定為空字串,該字串將與沒有“ Host”header欄位的請求進行匹配,并回傳特殊的nginx的非標準代碼444,以關閉連接,
從版本0.8.48開始,這是服務器名稱的默認設定,因此可以省略server_name“”,在早期版本中,計算機的主機名用作默認服務器名,
三, 基于名稱和IP地址混合的虛擬服務器
讓我們看一個更復雜的配置,其中一些虛擬服務器偵聽不同的地址:
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地址和埠,然后,它根據與IP地址和埠匹配的服務器塊的server_name條目測驗請求的“主機”header欄位,如果找不到服務器名稱,則默認服務器將處理該請求,例如,在192.168.1.1:80埠上收到的對www.example.com的請求將由192.168.1.1:80埠的默認服務器(即第一臺服務器)處理,因為沒有www.example.com為此埠定義,
如前所述,默認服務器是偵聽埠的屬性,并且可以為不同的埠定義不同的默認服務器:
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
...
}
server {
listen 192.168.1.1:80 default_server;
server_name example.net www.example.net;
...
}
server {
listen 192.168.1.2:80 default_server;
server_name example.com www.example.com;
...
}
四, 一個簡單的PHP站點配置
現在,讓我們看看nginx如何選擇一個位置來處理典型的簡單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首先搜索文字字串給定的最特定的前綴位置,在上面的配置中,唯一的前綴位置是“/”,并且由于它匹配任何請求,因此將被用作最后的手段,然后,nginx按照組態檔中列出的順序檢查由正則運算式指定的位置,第一個匹配的運算式將停止搜索,nginx將使用此位置,如果沒有正則運算式與請求匹配,則nginx使用較早發現的最特定的前綴位置,
請注意,所有型別的位置僅測驗沒有引數的請求行的URI部分,這樣做是因為查詢字串中的引數可以通過幾種方式給出,例如:
/index.php?user=john&page=1
/index.php?page=1&user=john
此外,任何人都可以在查詢字串中請求任何內容:
/index.php?page=1&something+else&user=john
現在,讓我們看一下在以上配置中如何處理請求:
請求“/logo.gif”, 首先與前綴位置“/”匹配,然后與正則運算式“\.(gif | jpg | png)$”匹配,因此由后一個位置處理,使用指令“root /data/www”將請求映射到檔案/data/www/logo.gif,然后將檔案發送給客戶端,
請求“/index.php”, 也首先與前綴位置“/”匹配,然后與正則運算式“\.(php)$”匹配,因此,它由后一個位置處理,并將請求傳遞到在localhost:9000上偵聽的FastCGI服務器, fastcgi_param指令將FastCGI引數SCRIPT_FILENAME設定為“ /data/www/index.php”,然后FastCGI服務器執行該檔案,變數$document_root等于root指令的值,變數$fastcgi_script_name等于請求URI,即“/index.php”,
請求“/about.html”僅與前綴位置“/”匹配,因此在該位置進行處理,使用指令“root /data/www”將請求映射到檔案/data/www/about.html,然后將檔案發送給客戶端,
處理請求“/”更為復雜,它僅與前綴位置“/”匹配,因此由該位置處理,然后,index指令根據其引數和“root /data/www”指令對索引檔案的存在進行測驗,如果檔案/data/www/index.html不存在,檔案/data/www/index.php存在,則該指令將內部重定向到“/index.php”,并且nginx再次搜索位置如果請求是由客戶端發送的,如前所述,重定向的請求最終將由FastCGI服務器處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/110645.html
標籤:Linux
上一篇:jspgou商城部署時報錯:Could not open Hibernate Session for transaction; nested exception is org.hibernate.ex
下一篇:Linux 軟中斷
