Nginx如何處理一個請求 |
|
基於名字的虛擬主機Nginx首先選定由哪一個虛擬主機來處理請求。讓我們從一個簡單的配置(其中全部3個虛擬主機都在端口*: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僅僅檢查請求的“Host”頭以決定該請求應由哪個虛擬主機來處理。如果Host頭沒有匹配任意一個虛擬主機,或者請求中根本沒有包含Host頭,那nginx會將請求分發到定義在此端口上的默認虛擬主機。在以上配置中,第一個被列出的虛擬主機即nginx的默認虛擬主機——這是nginx的默認行爲。而且,可以顯式地設置某個主機爲默認虛擬主機,即在" server { listen 80 default_server; server_name example.net www.example.net; ... } " 請注意" 如何防止處理未定義主機名的請求如果不允許請求中缺少“Host”頭,可以定義如下主機,丟棄這些請求: server { listen 80; server_name ""; return 444; } 在這裏,我們設置主機名爲空字符串以匹配未定義“Host”頭的請求,而且返回了一個nginx特有的,非http標準的返回碼444,它可以用來關閉連接。 從0.8.48版本開始,這已成爲主機名的默認設置,所以可以省略
基於域名和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地址和端口是否匹配某個server配置塊中的listen指令配置。接着nginx繼續測試請求的Host頭是否匹配這個server塊中的某個server_name的值。如果主機名沒有找到,nginx將把這個請求交給默認虛擬主機處理。例如,一個從192.168.1.1:80端口收到的訪問 默認服務器是監聽端口的屬性,所以不同的監聽端口可以設置不同的默認服務器: 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站點配置現在我們來看在一個典型的,簡單的PHP站點中,nginx怎樣爲一個請求選擇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; } } 首先,nginx使用前綴匹配找出最準確的location,這一步nginx會忽略location在配置文件出現的順序。上面的配置中,唯一的前綴匹配location是" 請注意所有location匹配測試只使用請求的URI部分,而不使用參數部分。這是因爲寫參數的方法很多,比如: /index.php?user=john&page=1 /index.php?page=1&user=john 除此以外,任何人在請求串中都可以隨意添加字符串: /index.php?page=1&something+else&user=john 現在讓我們來看使用上面的配置,請求是怎樣被處理的:
|
Nginx中的默認主機及location設置(摘自淘寶)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.