nginx学习笔记(7)Nginx如何处理一个请求---转载
| 如何防止處理未定義主機(jī)名的請(qǐng)求 基于域名和IP混合的虛擬主機(jī) 一個(gè)簡(jiǎn)單PHP站點(diǎn)配置 |
基于名字的虛擬主機(jī)
Nginx首先選定由哪一個(gè)虛擬主機(jī)來(lái)處理請(qǐng)求。讓我們從一個(gè)簡(jiǎn)單的配置(其中全部3個(gè)虛擬主機(jī)都在端口*:80上監(jiān)聽(tīng))開(kāi)始:
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;... }在這個(gè)配置中,nginx僅僅檢查請(qǐng)求的“Host”頭以決定該請(qǐng)求應(yīng)由哪個(gè)虛擬主機(jī)來(lái)處理。如果Host頭沒(méi)有匹配任意一個(gè)虛擬主機(jī),或者請(qǐng)求中根本沒(méi)有包含Host頭,那nginx會(huì)將請(qǐng)求分發(fā)到定義在此端口上的默認(rèn)虛擬主機(jī)。在以上配置中,第一個(gè)被列出的虛擬主機(jī)即nginx的默認(rèn)虛擬主機(jī)——這是nginx的默認(rèn)行為。而且,可以顯式地設(shè)置某個(gè)主機(jī)為默認(rèn)虛擬主機(jī),即在"listen"指令中設(shè)置"default_server"參數(shù):
server {listen 80 default_server;server_name example.net www.example.net;... } "default_server"參數(shù)從0.8.21版開(kāi)始可用。在之前的版本中,應(yīng)該使用"default"參數(shù)代替。請(qǐng)注意"default_server"是監(jiān)聽(tīng)端口的屬性,而不是主機(jī)名的屬性。后面會(huì)對(duì)此有更多介紹。
如何防止處理未定義主機(jī)名的請(qǐng)求
如果不允許請(qǐng)求中缺少“Host”頭,可以定義如下主機(jī),丟棄這些請(qǐng)求:
server {listen 80;server_name "";return 444; }在這里,我們?cè)O(shè)置主機(jī)名為空字符串以匹配未定義“Host”頭的請(qǐng)求,而且返回了一個(gè)nginx特有的,非http標(biāo)準(zhǔn)的返回碼444,它可以用來(lái)關(guān)閉連接。
從0.8.48版本開(kāi)始,這已成為主機(jī)名的默認(rèn)設(shè)置,所以可以省略server_name ""。而之前的版本使用機(jī)器的hostname作為主機(jī)名的默認(rèn)值。基于域名和IP混合的虛擬主機(jī)
下面讓我們來(lái)看一個(gè)復(fù)雜點(diǎn)的配置,在這個(gè)配置里,有幾個(gè)虛擬主機(jī)在不同的地址上監(jiān)聽(tīng):
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;... }這個(gè)配置中,nginx首先測(cè)試請(qǐng)求的IP地址和端口是否匹配某個(gè)server配置塊中的listen指令配置。接著nginx繼續(xù)測(cè)試請(qǐng)求的Host頭是否匹配這個(gè)server塊中的某個(gè)server_name的值。如果主機(jī)名沒(méi)有找到,nginx將把這個(gè)請(qǐng)求交給默認(rèn)虛擬主機(jī)處理。例如,一個(gè)從192.168.1.1:80端口收到的訪問(wèn)www.example.com的請(qǐng)求將被監(jiān)聽(tīng)192.168.1.1:80端口的默認(rèn)虛擬主機(jī)處理,本例中就是第一個(gè)服務(wù)器,因?yàn)檫@個(gè)端口上沒(méi)有定義名為www.example.com的虛擬主機(jī)。
默認(rèn)服務(wù)器是監(jiān)聽(tīng)端口的屬性,所以不同的監(jiān)聽(tīng)端口可以設(shè)置不同的默認(rèn)服務(wù)器:
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;... }一個(gè)簡(jiǎn)單PHP站點(diǎn)配置
現(xiàn)在我們來(lái)看在一個(gè)典型的,簡(jiǎn)單的PHP站點(diǎn)中,nginx怎樣為一個(gè)請(qǐng)求選擇location來(lái)處理:
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使用前綴匹配找出最準(zhǔn)確的location,這一步nginx會(huì)忽略location在配置文件出現(xiàn)的順序。上面的配置中,唯一的前綴匹配location是"/",而且因?yàn)樗梢云ヅ淙我獾恼?qǐng)求,所以被作為最后一個(gè)選擇。接著,nginx繼續(xù)按照配置中的順序依次匹配正則表達(dá)式的location,匹配到第一個(gè)正則表達(dá)式后停止搜索。匹配到的location將被使用。如果沒(méi)有匹配到正則表達(dá)式的location,則使用剛剛找到的最準(zhǔn)確的前綴匹配的location。
請(qǐng)注意所有l(wèi)ocation匹配測(cè)試只使用請(qǐng)求的URI部分,而不使用參數(shù)部分。這是因?yàn)閷?xiě)參數(shù)的方法很多,比如:
/index.php?user=john&page=1 /index.php?page=1&user=john除此以外,任何人在請(qǐng)求串中都可以隨意添加字符串:
/index.php?page=1&something+else&user=john現(xiàn)在讓我們來(lái)看使用上面的配置,請(qǐng)求是怎樣被處理的:
- 請(qǐng)求"/logo.gif"首先匹配上location "/",然后匹配上正則表達(dá)式"\.(gif|jpg|png)$"。因此,它將被后者處理。根據(jù)"root /data/www"指令,nginx將請(qǐng)求映射到文件/data/www/logo.gif",并發(fā)送這個(gè)文件到客戶端。
- 請(qǐng)求"/index.php"首先也匹配上location "/",然后匹配上正則表達(dá)式"\.(php)$"。 因此,它將被后者處理,進(jìn)而被發(fā)送到監(jiān)聽(tīng)在localhost:9000的FastCGI服務(wù)器。fastcgi_param指令將FastCGI的參數(shù)SCRIPT_FILENAME的值設(shè)置為"/data/www/index.php",接著FastCGI服務(wù)器執(zhí)行這個(gè)文件。變量$document_root等于root指令設(shè)置的值,變量$fastcgi_script_name的值是請(qǐng)求的uri,"/index.php"。
- 請(qǐng)求"/about.html"僅能匹配上location "/",因此,它將使用此location進(jìn)行處理。根據(jù)"root /data/www"指令,nginx將請(qǐng)求映射到文件"/data/www/about.html",并發(fā)送這個(gè)文件到客戶端。
- 請(qǐng)求"/"的處理更為復(fù)雜。它僅能匹配上location "/",因此,它將使用此location進(jìn)行處理。然后,index指令使用它的參數(shù)和"root /data/www"指令所組成的文件路徑來(lái)檢測(cè)對(duì)應(yīng)的文件是否存在。如果文件/data/www/index.html不存在,而/data/www/index.php存在,此指令將執(zhí)行一次內(nèi)部重定向到"/index.php",接著nginx將重新尋找匹配"/index.php"的location,就好像這次請(qǐng)求是從客戶端發(fā)過(guò)來(lái)一樣。正如我們之前看到的那樣,這個(gè)重定向的請(qǐng)求最終交給FastCGI服務(wù)器來(lái)處理。
| 作者: Igor Sysoev 編輯: Brian Mercer 翻譯: Jinglong & cfsego |
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3428243.html
總結(jié)
以上是生活随笔為你收集整理的nginx学习笔记(7)Nginx如何处理一个请求---转载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: nginx 学习笔记(6) nginx配
- 下一篇: Nginx vs Apache--ref