Nginx的虛擬服務器域名配置
阿新 • • 發佈:2018-01-17
頭部 這一 配置 example article log perl 引號 點號 虛擬服務器名(server name)是通過指令server_name來指定的。在《 Nginx是如何處理Request的?》一節中,我們講到nginx分兩步來匹配過來的Request請求:
1.選擇server
2.選擇location
在第1步中,其實也分兩步:
1).匹配port
2).匹配server_name
這一節就來聊聊nginx是如何具體匹配server_name的。
server_name指令 server_name的形式有三種: 1.精確域名形式(exact names) 2.通配符(*)形式 3.正則表達式形式 如下: server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name *.example.org; ... } server { listen 80; server_name mail.*; ... } server { listen 80; server_name ~^(?<user>.+)\.example\.net$; ... } 通配符形式,其實又分為前向通配符 和後向通配符(分別如第二,第三個例子),通配符不能位於字符串的中間位置。
當然,完全存在這麽一種情況,一個host同時匹配上面三種的一種或者多種形式,比如host 為www.example.com可以同時匹配;
server_name *.example.com *.com www.example.com www.example.* www.* ~^(.+)\.example\.com$
server_name 有6個指令參數,www.example.com都是匹配的,那麽最後選擇哪一個呢?有一定的順序:
正則表達式
nginx的正則表達式語法使用的是Perl語言(PCRE)的正則語法。基本形式為
server_name ~^www\d+\.example\.net$;
這則表達式需要註意的幾點
could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 32 這種情況下,先設置server_names_hash_max_size為一個接近你域名總數的一個合理值,如果這個還不管用,那麽再調大server_names_hash_bucket_size的值(例如將2^N調整到2^(N+1)) http { server_names_hash_max_size:600 server_names_hash_bucket_size 32; ...
如果一個域名是某個監聽端口下的唯一域名,那麽nginx就不會建立Hash匹配表,也不會有上面介紹的那些匹配流程,然而,如果這個唯一的域名是一個捕獲組正則表達式,那麽nginx還是去嘗試去解析正則表達式以提取這個字段。
server_name指令 server_name的形式有三種: 1.精確域名形式(exact names) 2.通配符(*)形式 3.正則表達式形式 如下: server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name *.example.org; ... } server { listen 80; server_name mail.*; ... } server { listen 80; server_name ~^(?<user>.+)\.example\.net$; ... } 通配符形式,其實又分為前向通配符
- 精確域名匹配,www.example.com
- 以通配符*開始的,最長的那個域名
- 以通配符*結束的,最長的那個域名,www.example.*
- 最後是正則表達式形式的,按照在配置文件中出現的順序,依次嘗試進行匹配,選取第一個被匹配到的域名,~^(.+)\.example\.com$
- 必須以~開始,沒有~符號的要麽被視作完全匹配或者通配符匹配
- ~和正則表達式主體之間沒有空格
- 正則表達式主體通常以^開始以$結束(雖說語法上不一定要求如此,但是從邏輯意義上強烈要求這麽做)。
- 正則表達式中,點號"."必須轉義,寫作"\.";正則表達式可以不用引號包住,但是,如果其中包含"{"和"}"則必須用雙引號包裹
could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 32 這種情況下,先設置server_names_hash_max_size為一個接近你域名總數的一個合理值,如果這個還不管用,那麽再調大server_names_hash_bucket_size的值(例如將2^N調整到2^(N+1)) http { server_names_hash_max_size:600 server_names_hash_bucket_size 32; ...
如果一個域名是某個監聽端口下的唯一域名,那麽nginx就不會建立Hash匹配表,也不會有上面介紹的那些匹配流程,然而,如果這個唯一的域名是一個捕獲組正則表達式,那麽nginx還是去嘗試去解析正則表達式以提取這個字段。
Nginx的虛擬服務器域名配置