一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 主配置文件中定义了多个 server 块时默认选择哪一个

时间:2026-08-17 12:04:49 编辑:袖梨 来源:一聚教程网

Nginx按优先级选择server块:完全匹配>通配符前缀>通配符后缀>正则匹配(按配置顺序取首个成功),未命中时启用显式default_server,否则取同端口第一个server块。

Nginx 在多个 server 块中选择匹配项,不依赖定义顺序,也不默认选第一个,而是依据一套明确的匹配优先级规则。核心逻辑是:先筛选出所有可能匹配的 server 块,再从中选出最精确匹配的那个

server_name 匹配优先级决定最终选择

Nginx 会按以下顺序逐级比对 server_name 指令(注意:端口和协议也参与初始筛选,但 server_name 是关键区分字段):

  1. 完全匹配(如 server_name example.com; → 请求 Host: example.com
  2. 通配符前缀匹配(如 server_name *.example.com; → 匹配 www.example.com,但不匹配 example.comsub.www.example.com
  3. 通配符后缀匹配(如 server_name www.*; → 匹配 www.test,但不匹配 test.www
  4. 正则表达式匹配(以 ~~* 开头,区分大小写/不区分大小写)——正则匹配在所有文字匹配之后执行,且按配置文件中出现顺序取第一个成功匹配

如果以上都未命中,Nginx 会 fallback 到 默认 server

  1. 显式标记为 default_serverserver 块(在 listen 指令后加 default_server,例如 listen 80 default_server;
  2. 若无显式 default_server,则取同一监听地址+端口下第一个出现的 server(这是唯一依赖定义顺序的情形,仅用于兜底)

同一 listen 指令下的 server 块才参与竞争

不同 listen 配置(如 listen 80;listen 443 ssl;)互不影响。只有监听相同 IP:Port(及相同协议、ssl 标志等)的 server 块才会被纳入本次请求的匹配池。

例如:

server { listen 80; server_name a.com; }server { listen 80 default_server; server_name b.com; }server { listen 443 ssl; server_name a.com; }

→ HTTP 请求到 80 端口时,只在前两个 server 中选;HTTPS 请求则只看第三个。

如何确保预期 server 被选中

  1. 明确指定 default_server,避免隐式依赖顺序
  2. 避免多个 server_name 冲突(比如重复的完全匹配或重叠通配符)
  3. nginx -t 测试配置,再用 nginx -T 查看实际生效的 server 块解析顺序
  4. 对调试有用:临时添加 return 200 "Served by: $server_namen"; 辅助验证实际路由目标

不复杂但容易忽略

热门栏目