我们可以指定多个虚拟服务器,每个服务器由一个server {}上下文描述。
server {
listen *:80 default_server;
server_name runoops.lh;
return 200 "Hello from runoops.lh";
}
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 按以下顺序选择虚拟服务器:
- IP: port 上的服务器列表,带有匹配的指令,如 server_name。
- P: port 上的服务器列表,带有 default_server 标志;
- P: port 上的服务器列表,第一个已定义。
- 如果没有匹配项,则拒绝连接。
从上面的例子中,输出将是:
Request to nikita.co:80 => "Hello from nikita.co"
Request to www.nikita.co:80 => "Hello from cainiaojc.co"
Request to deep.co:80 => "Hello from cainiaojc.co"
Request to deep.co:81 => "Hello from nikita.co"
Request to nikita.co:81 => "Hello from deep.co"
server_name 指令
server_name 指令用于接受多个值;它还用于处理通配符匹配和正则表达式。
server_name cainiaojc.com; # 完全符合 server_name *.cainiaojc.com; # 通配符匹配 server_name cainiaojc.*; # 通配符匹配 server_name ~^[ 0 - 9 ]*\.cainiaojc\.com$; # 正则匹配
如果有任何歧义,那么 nginx 使用以下顺序:
- 完全匹配名称;
- 以星号开头的最长通配符名称,例如“*examples.org”,
- 以星号结尾的最长通配符名称,例如“mail.*”;
- 第一个匹配的正则表达式。
Nginx 将存储三个哈希表:确切名称、以星号开头的通配符和以星号结尾的通配符。如果结果不在上面声明的表中,则将按顺序测试正则表达式。
server_name .runoops.lh;
它是以下的缩写:
server_name runoops.lh www.runoops.lh *.runoops.lh;
只有一个区别:.runoops.lh 存储在第二个表中,这意味着它比显式声明慢一点。
listen 指令
在大多数情况下,我们会看到 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。
分享笔记