nginx 处理请求
基于名称的虚拟服务器
-
基于名称(指 HTTP 请求头 Host 字段)的虚拟服务器指通过 HTTP 请求头的 Host 来决定客户端请求由哪个 server 进行处理。
ser -
配置三个虚拟服务器,均侦听80端口
ver { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name example.net www.example.net; ... } server { listen 80; server_name example.com www.example.com; ... }
-
上面配置中,nginx 仅测试请求的头字段“Host”以确定应将请求路由到哪个 server
-
如果“Host”的值与任何 server 名称都不匹配,或者请求根本不包含“Host”头字段,则 nginx 会将请求路由到此端口的默认 server
-
默认 server 是第一个server ,这是 nginx 的标准默认行为
-
还可以使用 listen 指令中的 default_server 参数明确设置哪个 server 应该是默认 server:
server { listen 80 default_server; server_name example.net www.example.net; ... }
防止处理具有未定义 server 名称的请求
-
如果不允许处理没有“Host”头字段的客户端请求(反过来说,只处理带有 Host 头字段的客户端请求),可以定义一个只丢弃请求的 server:
server { listen 80; server_name ""; return 444; }
-
server_name 设置为一个空字符串,它将匹配没有“Host”头字段的请求,并返回一个特殊的 nginx 非标准代码 444 来关闭连接。
混合基于名称和基于 IP 的虚拟服务器
-
不同的虚拟服务器侦听不同的地址:
server { listen 192.168.1.1:80; server_name example.org www.example.org; ... } server { listen 192.168.1.1:80; server_name example.net www.example.net; ... } server { listen 192.168.1.2:80; server_name example.com www.example.com; ... }
-
上面配置中,nginx 首先根据 server 块的 listen 指令测试请求的 IP 地址和端口
-
nginx根据与 IP 地址和端口匹配的 server 块的 server_name 条目测试请求的“Host”标头字段。如果未找到服务器名称,则请求将由默认服务器处理
-
在 192.168.1.1:80 端口上收到的 www.example.com 请求将由 192.168.1.1:80 端口的默认服务器处理,即由第一个服务器处理,因为没有 www.example .com 为此端口定义。
-
为不同的端口定义不同的默认服务器:
server { listen 192.168.1.1:80; server_name example.org www.example.org; ... } server { # 定义默认服务器 listen 192.168.1.1:80 default_server; server_name example.net www.example.net; ... } server { # 定义默认服务器 listen 192.168.1.2:80 default_server; server_name example.com www.example.com; ... }
Nginx 服务器名称
-
服务器名称使用 server_name 指令定义,并确定给定客户端请求由哪个 server 块进行处理
-
服务器名称可以使用确切名称、通配符名称或正则表达式来定义
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$; ... }
-
按服务器名称搜索虚拟服务器时,如果名称与多个指定变体 server_name 匹配(例如通配符名称和正则表达式都匹配),将按以下优先顺序选择第一个匹配的变体 server_name:
- 确切名称,优先级最高
- 以星号开头的最长通配符名称,例如 “*.example.org”
- 以星号结尾的最长通配符名称,例如 “mail.*”
- 第一个匹配的正则表达式(按在配置文件中出现的顺序)