Nginx是如何處理Request的?

2022-07-03 12:42:10 字數 3090 閱讀 9069

nginx是如何匹配過來的請求,然後做處理的呢?這個匹配的過程可以分為兩步:

1.選擇server

2.選擇location 

選擇server

僅僅匹配server name

加入nginx的配置檔案有這麼幾項:

server

server

server

在上面配置檔案中,nginx僅僅匹配server_name指令。根據request請求頭的"host"引數,去匹配server_name的指令引數,從而決定路由到哪個虛擬伺服器。如果host 請求頭引數找不到對應的server,或者壓根沒有這個請求頭,那麼nginx將會選擇預設的——往往是第乙個,這裡是 server_name example.org www.example.org;   但是你也可以直接指定:

server

在listen指令的後面,使用default_server引數就指定了預設的server。注意,這裡指令引數default_server是放在指令listen後面,不是server_name後面,是指定乙個具體的埠,不是指定乙個虛擬機器名稱,後面會說明原因。

如果請求頭header沒有host引數,在0.8.48之後的版本,此請求會被丟棄。在之前的版本中,你可以用下面的指令來完成丟棄的功能:

server

指令server_name 的引數設為空陣列將匹配不帶host請求頭的請求。

同時匹配server name和ip

來看看同時帶有ip和server name的server的配置情況:

server

server

server

在這種情況下,ngxin首先根據請求的ip和port匹配listen指令,然後再根據請求的host頭匹配server_name 指令。比如本機的ip是192.168.1.1,那麼所有過來的請求都不會到192.168.1.2上去。如果host沒有匹配上,再用預設的server來處理。

例如: 發往192.168.1.1:80埠的www.example.com請求,只會從前面兩個server中去找對應的server_name,發現沒有匹配上,那麼採用預設的(第乙個)server。

我看來看看在多個ip的配置檔案下,如何指定預設的server:

server

server

server

所以,server是針對某個ip,某個埠的,並不是針對某個網域名稱,因此default_server也是針對某個ip,某個埠的,是listen的屬性而不是server_name 的屬性。

選擇 location 

location指令都是針對請求的uri部分進行匹配,不是整個url,也不包含任何請求引數,比如:

/index.php

/user/index/get

nginx的locating指令可以分為兩種,即"prefix location"和"regular expression location",即「字首location」和「正則location」。

字首location形如下面:

location /

location /path/to

location /index.php

正則location location後面需要匹配正規表示式,比如:

以乙個php**的配置為例,看看nginx如果選擇location來處理請求的。

server

location /comment

location ~ \.php$

}nginx首先在字首location中進行匹配,而且首先搜尋匹配的最為"精確"的那一項:比如請求/comment,即匹配location /comment 和location / 但是location /comment 更為「精確」因此被匹配上。location / 因為是匹配所有的請求所以被「最後考慮」。這一步匹配是無關字首location的羅列順序的。

接著,nginx繼續匹配正則location,這一步跟正則location的順序就有關係了。nginx是依次匹配,第乙個匹配的到location時。nginx會終止匹配,然後用這個location來處理請求。如果正則location部分沒有匹配到任何一項,則採用上一步字首location匹配到的來處理請求。

在匹配到location,處理request時,還需要加上root指令,即root   /data/www;

舉例說明下:

"/logo.gif"——首先被字首location的location /匹配上了,然後也被正則location的location ~* \.(gif|jpg|png)$ 匹配上了,因此會被後面的location處理。此外,在處理請求是還要加上root   /data/www ,最為請求就被定為到了 /data/www/logo.gif,最後次檔案會被傳送到瀏覽器

"/index.php"——同樣首先被字首location的location /匹配上,但後面正則location也匹配上了location ~ \.php$,因此由後者來處理:交給執行在localhost:9000的fastcgi程式來處理,

fastcgi_param 指令用來設定fastcgi的引數script_filename,$document_root和$fastcgi_script_name是nginx引數,分別為root指令引數(/data/www)和uri(/index.php)

"/about.html"——僅僅能被location /匹配,因此便由它處理,最後請求定位到/data/www/about.html

"/"——這種情況稍微複雜點。它僅能被字首location"location /"匹配上,因此它將被這個location處理。然後location中的指令index將被執行,nginx會依次嘗試index檔案(俗稱入口檔案)是否存在,在此例中就是/data/www/index.html /data/www/index.php,如果前者不存在就繼續往後找。此例中,/data/www/index.html不存在因此由/data/www/index.php處理。然後nginx會做個內部跳轉到/index.php,然後,就處理好像乙個從瀏覽器反過來的全新請求一樣,重新搜尋location,就像前面分析的一樣,最終交由fastcgi程式來處理。

Nginx是如何處理請求的

基於命名的虛擬伺服器 name based virtual servers nginx首先要確定由哪個伺服器 server 來處理這個請求,如下面的簡單的例子中,一共有3個虛擬主機,分別是 server 其中 是區分大小寫的正規表示式 為不區分大小寫的正規表示式 為了提高效率,實行嚴格匹配,如果找到...

nginx是如何處理請求的

一 nginx如何選擇適當的虛擬伺服器來處理請求?server匹配 1 基於主機名匹配來選擇合適的虛擬伺服器 對比請求頭中的host欄位與server中的server name,選擇匹配的伺服器。如果都不匹配,則選擇該埠所對應預設的伺服器。如果沒有指定預設伺服器,默默為伺服器列表中的第乙個,可以通過...

Tomcat Server是如何處理http請求的

下面就讓我們簡單了解一下 tomcat server處理乙個http請求的過程 假設來自客戶的請求為 jsp1 請求被傳送到本機埠8080,被在那裡偵聽的coyote http 1.1 connector獲得 2 connector把該請求交給它所在的service的engine來處理,並等待來自e...