我們可以指定多個虛擬服務器,每個服務器由一個server {}上下文描述。
server { listen *:80 default_server; server_name cainiaoplus.com; return 200 "Hello from javatpoint.co"; } server { listen *:80; server_name nikita.co; return 200 "Hello from nikita.co"; } server { listen *:81; server_name deep.co; return 200 "Hello from deep.co"; }
上面的例子中,nginx 將檢查 listen 指令以測試哪個虛擬服務器正在偵聽給定的 IP: port組合,然后檢查Host 標頭中的域名匹配 server_name 指令的值。
Nginx 按以下順序選擇虛擬服務器:
從上面的例子中,輸出將是:
Request to nikita.co:80 => "Hello from nikita.co" Request to www.nikita.co:80 => "Hello from cainiaoplus.co" Request to deep.co:80 => "Hello from cainiaoplus.co" Request to deep.co:81 => "Hello from nikita.co" Request to nikita.co:81 => "Hello from deep.co"
server_name 指令用于接受多個值;它還用于處理通配符匹配和正則表達式。
server_name cainiaoplus.com; # 完全符合 server_name *.cainiaoplus.com; # 通配符匹配 server_name cainiaoplus.*; # 通配符匹配 server_name ~^[ 0 - 9 ]*\.cainiaoplus\.com$; # 正則匹配
如果有任何歧義,那么 nginx 使用以下順序:
Nginx 將存儲三個哈希表:確切名稱、以星號開頭的通配符和以星號結尾的通配符。如果結果不在上面聲明的表中,則將按順序測試正則表達式。
server_name .cainiaoplus.com;
它是以下的縮寫:
server_name cainiaoplus.co www.cainiaoplus.co *.cainiaoplus.co;
只有一個區(qū)別:.cainiaoplus.co 存儲在第二個表中,這意味著它比顯式聲明慢一點。
在大多數(shù)情況下,我們會看到 listen 指令接受 IP: 端口值。
listen 127.0.0.1:80; listen 127.0.0.1; # port :80 is used by default listen *:81; listen 81; # all ips are used by default listen [::]:80; # IPv6 addresses listen [::1]; # IPv6 addresses
但是,也可以指定 UNIX 域的套接字:
listen unix:/var/run/nginx.sock;
甚至我們可以使用主機名:
listen localhost:80; listen netguru.co:80;
如果指令不存在,則使用*:80。