定義
任何由關鍵字server開始的部分都被稱爲“虛擬主機”部分。描述的是一組根據不同的server_name指令邏輯分割的資源,這些虛擬主機響應HTTP請求,都包含在http部分中。
一個虛擬主機由listen和server_name指令組合定義。
listen指令定義一個IP/端口組合或者是Unix域套接字路徑:
listen address[:port]; listen port; listen unix:path;
server_name指令的默認值是“”,意味着server部分沒有server_name指令,對於沒有設置Host頭字段的請求,將會匹配該server處理。可用於丟棄不含Host頭的請求。
server { listen 80; return 444; # 444非標準代碼將會使得Nginx立即關閉一個連接。 }
Nginx接受通配符和正則表達式作爲server_name指令的參數:
通配符可以替代部分子域名:*.example.com 通配符可以替代部分頂級域:www.example.* 匹配子域或域本身:.example.com(匹配.example.com,也包括example.com) 在域名前加上波浪號(~)說明使用正則表達式: server_name ~^www\.example\.com$; server_name ~^www(d+)\.example\.(com)$;
特定請求匹配虛擬主機時遵循的邏輯
1、匹配IP地址和listen指令指定的端口;
2、將Host頭字段作爲一個字符串匹配server_name;
3、將Host頭字段與server_name字符串的開始部分做匹配;
4、將Host頭字段與server_name字符串的結尾部分做匹配;
5、將Host頭字段與server_name進行正則表達式匹配;
6、如果所有Host頭匹配失敗,將會轉向listen指令定義的default_server;
7、如果所有的Host頭匹配失敗,並且沒有default_server,那麼將會轉向第一個server的listen指令。
Locations
location指令可以用在虛擬主機server部分,提供來自客戶端的URI或者內部重定向訪問。location可以被嵌套使用。
location定義如下:
location [=|^~|~|~*] /uri { …… } 或者命名location: location @name { …… }
location修飾符:
= | 使用精確匹配並且終止搜索 |
~ | 使用區分大小寫的正則表達式匹配 |
~* | 使用不區分大小寫的正則表達式匹配 |
^~ | 如果該location是最佳匹配,那麼對於匹配這個location的字符串,不再進行正則表達式匹配。 這不是一個正則表達式,目的是優於正則表達式的匹配。 |
匹配規則:
1、沒有正則表達式的location被優先匹配,獨立於含有正則表達式的location順序;
2、在配置文件中按照順序進行正則表達式匹配。在查找到第一個正則表達式匹配之後結束查找。
try_files:
try_files指令將會按照給定它的參數順序進行嘗試,第一個匹配的將會使用。經常被用於從一個變量去匹配一個可能的文件,然後將剩餘請求傳遞到一個命名location:
location / { try_files $uri $uri/ @app; } location @app { proxy_pass http://appserver; }
location的嵌套使用,不適用於使用“=”修飾符做前綴和命令location:
location / { # 首先,匹配根路徑 location ^~ /css { # 然後,找到一個最佳匹配/css。注意,這裏不是正則表達式 location ~* /css/.*\.css$ { # 最後,通過正則表達式找到了最佳匹配 …… } } }
一個虛擬服務器的完整示例配置
server { listen 80; return 444; } server { listen 80; server_name localhost.myserver.com; location / { try_files $uri $uri/ @nginxserver; } location @nginxserver { proxy_pass http://127.0.0.1:8080; } }