溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Ngnix如何處理http請求

發(fā)布時間:2022-02-19 10:50:47 來源:億速云 閱讀:165 作者:小新 欄目:開發(fā)技術

這篇文章主要為大家展示了“Ngnix如何處理http請求”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Ngnix如何處理http請求”這篇文章吧。

nginx處理http的請求是nginx最重要的職能,也是最復雜的一部分。

Ngnix如何處理http請求

一、基于名稱的虛擬服務器

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參數(shù)來顯式設置哪個服務器應為默認服務器:

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

自0.8.21版以后的版本,default_server參數(shù)已可用。在早期版本中,應改用默認參數(shù)。

請注意,默認服務器是偵聽端口的屬性,而不是服務器名稱的屬性。稍后再詳細介紹。

二、如何阻止使用未定義的服務器名稱的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首先根據(jù)服務器塊的偵聽指令測試請求的IP地址和端口。然后,它根據(jù)與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站點配置

現(xiàn)在,讓我們看看nginx如何選擇一個位置來處理典型的簡單PHP網(wǎ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首先搜索文字字符串給定的最特定的前綴位置。在上面的配置中,唯一的前綴位置是“/”,并且由于它匹配任何請求,因此將被用作最后的手段。然后,nginx按照配置文件中列出的順序檢查由正則表達式指定的位置。第一個匹配的表達式將停止搜索,nginx將使用此位置。如果沒有正則表達式與請求匹配,則nginx使用較早發(fā)現(xiàn)的最特定的前綴位置。

請注意,所有類型的位置僅測試沒有參數(shù)的請求行的URI部分。這樣做是因為查詢字符串中的參數(shù)可以通過幾種方式給出,例如:

/index.php?user=john&page=1
/index.php?page=1&user=john

此外,任何人都可以在查詢字符串中請求任何內容:

/index.php?page=1&something+else&user=john

現(xiàn)在,讓我們看一下在以上配置中如何處理請求:

請求“/logo.gif”, 首先與前綴位置“/”匹配,然后與正則表達式“.(gif | jpg | png)$”匹配,因此由后一個位置處理。使用指令“root /data/www”將請求映射到文件/data/www/logo.gif,然后將文件發(fā)送給客戶端。

請求“/index.php”, 也首先與前綴位置“/”匹配,然后與正則表達式“.(php)匹配。因此,它由后一個位置處理,并將請求傳遞到在:上偵聽的服務器。指令將參數(shù)設置為,然后服務器執(zhí)行該文件。變量document_root等于root指令的值,變量$fastcgi_script_name等于請求URI,即“/index.php”。

請求“/about.html”僅與前綴位置“/”匹配,因此在該位置進行處理。使用指令“root /data/www”將請求映射到文件/data/www/about.html,然后將文件發(fā)送給客戶端。

處理請求“/”更為復雜。它僅與前綴位置“/”匹配,因此由該位置處理。然后,index指令根據(jù)其參數(shù)和“root /data/www”指令對索引文件的存在進行測試。如果文件/data/www/index.html不存在,文件/data/www/index.php存在,則該指令將內部重定向到“/index.php”,并且nginx再次搜索位置如果請求是由客戶端發(fā)送的。如前所述,重定向的請求最終將由FastCGI服務器處理。

以上是“Ngnix如何處理http請求”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI