高效能Web伺服器Nginx的配置與部署研究(3)Nginx的請求處理機制
高效能Web伺服器Nginx的配置與部署研究(3)Nginx的請求處理機制
- Author: Igor Sysoev
- Translator: Poechant
- Blog: blog.CSDN.net/Poechant
- Email: zhongchao.ustc#gmail.com (#->@)
- Date: December 7th, 2011
- Update: February 26th>, 2012
- Column: 《Nginx 高效能 Web 伺服器》
本文為您解讀,Nginx是如何處理請求的,讓你從邏輯上有一個清晰的認識。
1. 處理什麼樣的請求
處理訪問到 Nginx 所在 IP 地址的請求,並且這些請求的 HTTP 頭資訊中的 Host 為所要處理的域名(如下以80埠為例),如下幾個 server 就對應響應的請求:
server {
listen 80;
server_name nginx.org www.nginx.org;
...
}
server {
listen 80;
server_name nginx.net www.nginx.net;
...
}
server {
listen 80;
server_name nginx.com www.nginx.com;
...
}
2. 預設 server
如果不主動設定預設server
,那麼第一個server
就會被當做預設server
。若要主動設定,應該如下配置:
server {
listen 80 default_server;
server_name nginx.net www.nginx.net;
...
}
此項的版本注意事項:
- 0.8.21 版本之前,使用
default
關鍵詞; - 從 0.8.21 版本開始,使用
default_server
關鍵詞。
另外注意,default_server
是埠的一個屬性,不是server_name
的一個屬性。
3. 如何處理未定義 host 為 server_name 的請求
比如,如果不想處理 HTTP 請求中沒有 HOST 欄位的頭資訊的情況,那麼可以如下:
server {
listen 80;
server_name "";
return 444;
}
此項的版本注意事項:
- 0.8.48 之前的版本,如果沒有設定
server_name
的話,那麼會把server_name
設定為本機的 hostname。 - 0.8.48 開始的版本,如果沒有設定
server_name
的話,那麼會把server_name
設定為""
,所以如果要達到上述程式碼的效果,在此版本開始可以不設定server_name
。
4. Nginx 的虛擬主機監聽
請先看如下配置:
server {
listen 192.168.1.1:80;
server_name nginx.org www.nginx.org;
...
}
server {
listen 192.168.1.1:80;
server_name nginx.net www.nginx.net;
...
}
server {
listen 192.168.1.2:80;
server_name nginx.com www.nginx.com;
...
}
這個應該很好理解,如果listen
的 IP 地址和埠號都吻合了,就看 HTTP 請求中的 HOST 頭資訊與某個server_name
中的 name 是否吻合。如果server_name
不吻合,就到該埠對應的default_server
那裡處理請求,如果default_server
的server_name
也沒有與 HOST 頭資訊吻合,那麼就放棄該請求。
特別再次強調,default_server
是埠的屬性,而非server_name
的屬性。所以可以有如下配置:
server {
listen 192.168.1.1:80;
server_name nginx.org www.nginx.org;
...
}
server {
listen 192.168.1.1:80 default_server;
server_name nginx.net www.nginx.net;
...
}
server {
listen 192.168.1.2:80 default_server;
server_name nginx.com www.nginx.com;
...
}
5. 一個簡單的 PHP 站點的 Nginx 配置
server {
listen 80;
server_name nginx.org www.nginx.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
的時候,不是按照配置程式碼給出的順序進行匹配的,而是先按照匹配表示式中的文字字串(literal string)的明確程度,從最明確的開始匹配。這麼說可能有點含混不清,簡單說,沒有正則規則的匹配表示式,是最明確的。比如如果這個匹配表示式就是一個“/”
或者“/abc”
,那麼這就是最明確的。上例中的"/"
就是這個最明確的蚊子字串(the most specific literal string),其實也是該例中唯一的。所以先從這個location
開始,然後再按照location
的列出順序,依次匹配,直到出現第一個匹配的location
後停止。如果所有的location
都不匹配,就用第一個找到的最明確的文字字串來匹配(the most specific literal string)。
6. 待查詢的 HTTP 請求
Nginx只處理無查詢的HTTP請求,因為查詢請求的查詢欄位的順序不確定,比如:
/index.php?user=john&page=1
/index.php?page=1&user=john
再比如:
/index.php?page=1&something+else&user=john
7. 幾個location的例子
例1:
/logo.gif
“/”
先被找到,然後匹配"\.(gif|jpg|png)$"
,再根據 redirective 找到root
是/data/www
,然後這個請求就被對映到"/data/www/logo.gif"
了,最後檔案就被髮送給到了客戶端。
例2:
/index.php
"/"
先被找到,然後匹配"\.(php)$"
,然後 request 就被傳遞給在 9000 埠上監聽的 FastCGI 伺服器,"fastcgi_param"
directive 設定 FastCGI 的引數SCRIPT_FILENAME
為"/data/www/index.php"
,然後FastCGI伺服器就執行這個檔案。(注意其中document_root
是/data/www
,fastcgi_script_name
是/index.php
。)
例3:
/about.html
"/"
先被找到,且只有這一個匹配的。然後根據root
值/data/www
,就找到了檔案/data/www/about.html
,然後傳送給客戶端。
例4:
/
"/"
是很複雜的,先找到"/"
這個location
,然後根據root
值/data/www
,看/data/www/index.php
是否存在,如果存在 directive 就在內部重定向到/index.php
,然後 Nginx 根據這個再次搜尋location
,重複上面第二個例子。
-
更多 Nginx 技術博文請訪問 CSDN 專欄 《Nginx 高效能Web伺服器》
轉載請註明來自“柳大的CSDN部落格”: blog.CSDN.net/Poechant
-
相關文章
- 高效能Web伺服器Nginx的配置與部署研究(3)Nginx請求處理機制Web伺服器Nginx
- 高效能Web伺服器Nginx的配置與部署研究(5)Nginx配置符號Web伺服器Nginx符號
- 高效能Web伺服器Nginx的配置與部署研究(4)Nginx常用命令Web伺服器Nginx
- 高效能Web伺服器Nginx的配置與部署研究(14)平滑升級你的NginxWeb伺服器Nginx
- 高效能Web伺服器Nginx的配置與部署研究(2)Nginx入門級配置與部署及“Hello World”...Web伺服器Nginx
- 高效能Web伺服器Nginx的配置與部署研究(1)Nginx簡介及入門示例Web伺服器Nginx
- 高效能Web伺服器Nginx的配置與部署研究(8)核心模組之事件模組Web伺服器Nginx事件
- 高效能Web伺服器Nginx的配置與部署研究(15)Upstream負載均衡模組Web伺服器Nginx負載
- 高效能Web伺服器Nginx的配置與部署研究(6)核心模組之主模組的測試常用指令...Web伺服器Nginx
- 高效能Web伺服器Nginx的配置與部署研究(9)核心模組之HTTP模組基本常用指令Web伺服器NginxHTTP
- nginx處理http請求流程NginxHTTP
- 高效能Web伺服器Nginx的配置與部署研究(7)核心模組之主模組的非測試常用指令...Web伺服器Nginx
- 高效能Web伺服器Nginx的配置與部署研究(16)小議location匹配模式優先順序Web伺服器Nginx模式
- 高效能Web伺服器Nginx的配置與部署研究(10)核心模組之HTTP模組Location相關指令...Web伺服器NginxHTTP
- nginx 如何處理一個請求Nginx
- Nginx 超時事件的處理機制Nginx事件
- 高效能Web伺服器Nginx的配置與部署研究(11)應用模組之Memcached模組的兩大應用場景...Web伺服器Nginx
- 理解 Nginx 在處理請求時的匹配規則Nginx
- nginx 處理客戶端請求的完整過程Nginx客戶端
- Nginx處理請求的11個階段(agentzh的Nginx 教程學習記錄)Nginx
- Nginx請求處理流程你瞭解嗎?Nginx
- 高效能Web伺服器Nginx的配置與部署研究(13)應用模組之Memcached模組+Proxy_Cache雙層快取模式...Web伺服器Nginx快取模式
- NGINX如何配置跨域請求Nginx跨域
- nginx 中配置請求重定向Nginx
- Nginx將不同IP的請求分發到不同的WEB伺服器NginxWeb伺服器
- 高效能Web伺服器Nginx的配置與部署研究(12)應用模組之Memcached做檔案快取時壓縮引起的問題...Web伺服器Nginx快取
- 圖解 Spring:HTTP 請求的處理流程與機制【1】圖解SpringHTTP
- 什麼是IO多路複用?Nginx的處理機制Nginx
- Nginx 與 PHP 的執行機制NginxPHP
- Nginx部署配置Nginx
- Nginx + Gunicorn 伺服器配置部署 DjangoNginx伺服器Django
- Go Web如何處理Web請求?GoWeb
- Nginx阻止對不明確主機名的請求Nginx
- Nginx+uWSGI+Django部署web伺服器NginxDjangoWeb伺服器
- ASP.Net請求處理機制初步探索之旅(3):管道ASP.NET
- 我眼中的 Nginx(五):Nginx — 子請求設計之道Nginx
- Python web伺服器怎麼處理請求PythonWeb伺服器
- php 與 nginx 的兩種處理方式PHPNginx