Nginx 处理请求

我们可以指定多个虚拟服务器,每个服务器由一个server {}上下文描述。

server {
  listen      *:80 default_server;
  server_name cainiaojc.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 按以下顺序选择虚拟服务器:

  • 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 .cainiaojc.com;

它是以下的缩写:

server_name  cainiaojc.co  www.cainiaojc.co  *.cainiaojc.co;  

只有一个区别:.cainiaojc.co 存储在第二个表中,这意味着它比显式声明慢一点。

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