Nginx 处理请求

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

server {
  listen      *:80 default_server;
  server_name codebaoku.co;
  return 200 "Hello from codebaoku.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 一些关于如何处理传入请求的见解。首先,Nginx 将检查 listen 指令以测试哪个虚拟服务器正在侦听给定的 IP: 端口组合。然后针对存储服务器域名的 Host 标头测试 server_name 指令 中的值。

Nginx 按以下顺序选择虚拟服务器:

  • IP 上的服务器列表: 端口,带有匹配指令,即 server_name。
  • IP 上的服务器列表: 端口,带有default_server 标志;
  • IP 上的服务器列表: 端口,已定义的第一个。
  • 如果没有匹配项,则拒绝连接。

从上面的例子,输出将是:

Request to nikita.co:80     => "Hello from nikita.co"
Request to www.nikita.co:80 => "Hello from codebaoku.co"
Request to deep.co:80     => "Hello from codebaoku.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 codebaoku.co www.codebaoku.co; # exact match
server_name *.codebaoku.co;              # wildcard matching
server_name codebaoku.*;                 # wildcard matching
server_name  ~^[0-9]*\.codebaoku\.co$;   # regexp matching

如果有歧义,那么Nginx使用如下顺序:

  • 确切名称;
  • 以星号开头的最长通配符名称,例如"*examples.org",
  • 以星号结尾的最长通配符名称,例如"mail.*";
  • 首先匹配正则表达式。

Nginx 将存储三个哈希表: 确切名称、以星号开头的通配符和以星号结尾的通配符。如果结果不在上面声明的表中,则将依次测试正则表达式。

注意: 

server_name .codebaoku.co;

是:

的缩写

server_name  codebaoku.co  www.codebaoku.co  *.codebaoku.co;

只有一个区别: .codebaoku.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。

在本节中,我们将讨论如何配置 Nginx Plus 和 Nginx 开源以服务静态内容。根目录和索引文件root 指令用于定义将用于搜索文件的根目录。为了获得请求文件的路径,Nginx 将请求的 URI 附加到由 ro ...