真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

nginx是如何處理訪問請(qǐng)求的

nginx 是如何處理訪問請(qǐng)求的
=========================

目錄:
name-based 虛擬主機(jī)
對(duì)于未定義 server name 的訪問請(qǐng)求,如何防止其被處理
混合使用 name-based 虛擬主機(jī)和 IP-based 虛擬主機(jī)
一個(gè)簡單的 PHP 站點(diǎn)配置示例

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的納溪網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!name-based 虛擬主機(jī)
-----------------------

當(dāng)一個(gè)訪問請(qǐng)求到達(dá) nginx,nginx 會(huì)考慮選擇某一個(gè) server 處理訪問請(qǐng)求。
我們以一個(gè)包含三個(gè) server 區(qū)塊的配置來講解:

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è)虛擬主機(jī)均監(jiān)聽于 *:80 端口。根據(jù)上面的配置,nginx 僅通過檢查請(qǐng)求首部中的
“HOST” 字段來決定讓哪個(gè)虛擬主機(jī)處理訪問請(qǐng)求。如果該字段的值沒有匹配任何虛擬主機(jī),
或者請(qǐng)求首部中沒有 “HOST” 字段,nginx 會(huì)將該請(qǐng)求路由到 *:80 端口的默認(rèn) server。
在上面的配置中,默認(rèn) server 是第一個(gè) server —— 這是 nginx 的標(biāo)準(zhǔn)默認(rèn)行為。
我們也可以顯式指定一個(gè)默認(rèn) server,使用 listen 指令的 default_server 參數(shù)來指定,
例如:

server { listen 80 default_server; server_name example.net www.example.net; ... }

Note:
default_server 參數(shù)從 0.8.21 之后開始使用,之前是 default 參數(shù)。

要注意,默認(rèn) server 是監(jiān)聽端口的一個(gè)屬性,不是 server name 的屬性。稍后將進(jìn)一步描述這個(gè)問題。

對(duì)于未定義 server name 的訪問請(qǐng)求,如何防止其被處理
--------------------------------------------

如果希望禁止未定義“Host” 請(qǐng)求首部的訪問請(qǐng)求,可設(shè)置一個(gè) server 用于丟棄這樣的請(qǐng)求:

server { listen 80; server_name ""; return 444; }

我們?cè)谶@里將 server name 設(shè)置為一個(gè)空字符串,它能匹配未攜帶 “Host” 請(qǐng)求首部的訪問請(qǐng)求,并且返回一個(gè)特殊的狀態(tài)碼 444 以關(guān)閉連接,444 不是標(biāo)準(zhǔn)的 nginx 狀態(tài)碼。

Note:
從 0.8.48 版開始,這個(gè)設(shè)置變成了 nginx 的默認(rèn)設(shè)置,所以 server_name "" 可被刪去。
在更早的版本中,物理主機(jī)的主機(jī)名被設(shè)置為 default server name。


混合使用 name-based 虛擬主機(jī)和 IP-based 虛擬主機(jī)
------------------------------------------

現(xiàn)在我們看一個(gè)更復(fù)雜的配置案例,這里有多個(gè)虛擬主機(jī)監(jiān)聽于不同的地址:

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; ... }

根據(jù)這份配置,nginx 首先檢查訪問請(qǐng)求的 IP 地址和端口號(hào),將它與 server 區(qū)塊的 listen 指令
的參數(shù)進(jìn)行對(duì)比,過濾掉不匹配的 server。然后 nginx 檢查訪問請(qǐng)求的 “Host” 請(qǐng)求首部,將它與剩下的 server 區(qū)塊中的 server_name 進(jìn)行對(duì)比,看能否匹配。如果沒有匹配的 server,該請(qǐng)求將交給default server 處理。

例如,nginx 在 192.168.1.1:80 端口接收到對(duì)于 www.example.com 的訪問請(qǐng)求,因?yàn)樵?192.168.1.1:80端口沒有匹配的 server name,這個(gè)請(qǐng)求最后將被交給 192.168.1.1:80 端口的 default server 處理,也就是第一個(gè)server。

正如前面提到過,default server 是監(jiān)聽端口的屬性,所以對(duì)于不同的監(jiān)聽端口,可以分別為其定義不同的default server。

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; ... }

192.168.1.1:80 端口的默認(rèn) server 是第二個(gè) server;
192.168.1.2:80 端口的默認(rèn) server 是第三個(gè) server。

一個(gè)簡單的 PHP 站點(diǎn)配置示例
-------------------------------

最后我們來看一個(gè) PHP 站點(diǎn)的例子,看看 nginx 是如何選擇 location 處理請(qǐng)求的:

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 首先根據(jù)訪問請(qǐng)求的 URI 查找匹配的定義了 prefix 前綴的 location,并記住其中匹配的最長的前綴。在上面的例子中,定義了前綴的 location 只有一個(gè),而且前綴為 “/”,它是最短的前綴,能匹配所有請(qǐng)求。因?yàn)?“/” 前綴最短,所以這個(gè) location 總是被作為最后的備選。然后 nginx 開始檢查指定了正則表達(dá)式的 location,依照配置文件中的順序依次檢查是否與訪問請(qǐng)求的 URI 匹配,當(dāng)找到第一個(gè)匹配的正則表達(dá)式,nginx不再繼續(xù)檢查后面的 location,nginx 將使用找到的第一個(gè)匹配正則表達(dá)式所對(duì)應(yīng)的 location。如果沒有匹配的 正則表達(dá)式,nginx 將使用之前記住的擁有最長匹配前綴的 location。

要注意的是,所有類型的 location 僅測試請(qǐng)求的 URI 部分,不帶參數(shù)。因?yàn)樵诓樵冏址械膮?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)在我們仔細(xì)研究一下根據(jù)上面的配置,nginx 將會(huì)如何處理訪問請(qǐng)求:

訪問請(qǐng)求為 “/logo.gif”。對(duì)于 “/logo.gif” 的請(qǐng)求首先被 prefix location “/” 所匹配,然后被正則表達(dá)式“.(gif|jpg|png)$” 所匹配,因此,這個(gè)請(qǐng)求將被交給后者處理。使用 “root /data/www”指令,該請(qǐng)求被映射為 /data/www/logo.gif,這個(gè)文件被發(fā)送給客戶端。

訪問請(qǐng)求為 “/index.php”。對(duì)于 “/index.php” 的請(qǐng)求同樣首先被 prefix location “/” 所匹配,然后被正則表達(dá)式 “.(php)$”所匹配。因此這個(gè)請(qǐng)求將被交給后者處理。該請(qǐng)求被轉(zhuǎn)發(fā)給一個(gè) FastCGI 服務(wù)器,該服務(wù)器監(jiān)聽于:localhost:9000。fastcgi_param 指令用于設(shè)置 FastCGI 參數(shù) SCRIPT_FILENAME,這里設(shè)置為:“/data/www/index.php”,之后 FastCGI 服務(wù)器會(huì)執(zhí)行該文件。$document_root 變量的值等同于root 指令的參數(shù)值,$fastcgi_script_name 變量的值等于請(qǐng)求 URI,即 “/index.php”。

訪問請(qǐng)求為 “/about.html”。對(duì)于 “/about.html” 的請(qǐng)求只能被 prefix location “/” 所匹配。因此該 location 會(huì)處理這個(gè)請(qǐng)求。使用 “root /data/www” 指令,這個(gè)請(qǐng)求被映射到 /data/www/about.html 文件,該文件將被發(fā)送給客戶端。

訪問請(qǐng)求為 “/”。對(duì)于 “/” 的訪問請(qǐng)求的處理更為復(fù)雜。它只能被 prefix location “/” 所匹配,因此該 location會(huì)處理這個(gè)請(qǐng)求。然后 index 指令根據(jù)自己的參數(shù)以及 “root /data/www” 指令,開始測試是否存在index 文件。如果 /data/www/index.html 文件不存在,而 /data/www/index.php 文件存在,index 指令會(huì)將請(qǐng)求通過內(nèi)部重定向,重定向至 “/index.php”,然后 nginx 如同接收到客戶端發(fā)來對(duì)“/index.php” 的請(qǐng)求開始進(jìn)行處理。這個(gè)處理過程剛才已經(jīng)講解過,被重定向的請(qǐng)求最后會(huì)被轉(zhuǎn)發(fā)給FastCGI 服務(wù)器進(jìn)行處理。

當(dāng)前文章:nginx是如何處理訪問請(qǐng)求的
分享路徑:http://weahome.cn/article/cggodj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部