Nginx 虚拟主机:server_name 匹配规则与实战

一、前言

虚拟主机是 Nginx 最基础也最常用的功能------它允许一台 Nginx 服务器在同一个端口上处理多个域名的请求。本文将完整演示 5 种 server_name 匹配规则及其优先级,并附上完整的验证方法。


二、为什么需要虚拟主机?

生产场景

你在工作中会遇到以下场景:

场景 说明
多域名接入 一台 Nginx 同时接入 www.example.comapi.example.comm.example.com
PC 端 vs 手机端 根据域名 pc.example.comm.example.com 分发到不同后端
默认兜底 防止恶意 IP 扫描,不认识域名直接断开
SSL 证书分离 不同域名使用不同证书(SNI)

工作原理

Nginx 根据 HTTP 请求头中的 Host 字段来匹配 server_name

复制代码
用户请求 http://www.example.com
  → 请求头中包含 Host: www.example.com
  → Nginx 遍历所有 server block,匹配 server_name
  → 匹配到对应的 server block → 处理请求

三、5 种 server_name 匹配规则

优先级排序

复制代码
① 精确匹配(最高优先级)
    ↓
② 通配符前缀(* 开头)
    ↓
③ 通配符后缀(* 结尾)
    ↓
④ 正则匹配(~ 开头)
    ↓
⑤ 默认兜底(最低优先级)

完整配置

nginx 复制代码
# ① 精确匹配(最高优先级)
server {
    listen 8080;
    server_name site1.nginx.demo;
    # 仅当 Host = site1.nginx.demo 时匹配
}

# ② 通配符前缀(第二优先级)
server {
    listen 8080;
    server_name *.nginx.demo;
    # 匹配任何以 .nginx.demo 结尾的域名
    # 如 api.nginx.demo、www.nginx.demo
}

# ③ 通配符后缀(第三优先级)
server {
    listen 8080;
    server_name site1.*;
    # 匹配任何以 site1. 开头的域名
    # 如 site1.abc.com、site1.xyz.com
}

# ④ 正则匹配(第四优先级)
server {
    listen 8080;
    server_name ~^www\.(?!nginx\.demo$).+\.demo$;
    # 以 ~ 开头表示正则
    # 匹配 www.xxx.demo 但不匹配 www.nginx.demo
}

# ⑤ 默认兜底(最低优先级)
server {
    listen 8080 default_server;
    server_name _;
    # 所有未匹配的域名都走这里
    # _ 只是一个占位符,不代表任何实际域名
}

匹配规则流程图

复制代码
收到请求,Host = www.nginx.demo
        │
        ▼
是否有精确匹配(server_name 完全一致)?
   ├── 是 → 使用该 server block
   └── 否 → 继续
        │
        ▼
是否有通配符前缀(*.nginx.demo)?
   ├── 是 → 使用该 server block
   └── 否 → 继续
        │
        ▼
是否有通配符后缀(site1.*)?
   ├── 是 → 使用该 server block
   └── 否 → 继续
        │
        ▼
是否有正则匹配(~^www\\....)?
   ├── 是 → 使用该 server block
   └── 否 → 继续
        │
        ▼
使用 default_server

四、实操验证

环境准备

bash 复制代码
# 创建各虚拟主机的根目录
mkdir -p /var/www/nginx-review/vhost-{exact,wildcard-prefix,wildcard-suffix,regex}

# 写入标记文件,用于验证匹配结果
echo "Exact Match: site1.nginx.demo" > /var/www/nginx-review/vhost-exact/index.html
echo "Wildcard Prefix: *.nginx.demo" > /var/www/nginx-review/vhost-wildcard-prefix/index.html
echo "Wildcard Suffix: site1.*" > /var/www/nginx-review/vhost-wildcard-suffix/index.html
echo "Regex Match" > /var/www/nginx-review/vhost-regex/index.html

测试命令

bash 复制代码
# 测试 1:精确匹配
curl -sI -H "Host: site1.nginx.demo" http://localhost:8080/ | grep X-Match-Rule
# 输出:X-Match-Rule: exact: site1.nginx.demo

# 测试 2:通配符前缀
curl -sI -H "Host: api.nginx.demo" http://localhost:8080/ | grep X-Match-Rule
# 输出:X-Match-Rule: wildcard-prefix: *.nginx.demo

# 测试 3:通配符后缀
curl -sI -H "Host: site1.abc.com" http://localhost:8080/ | grep X-Match-Rule
# 输出:X-Match-Rule: wildcard-suffix: site1.*

# 测试 4:正则匹配
curl -sI -H "Host: www.test.demo" http://localhost:8080/ | grep X-Match-Rule
# 输出:X-Match-Rule: regex match

# 测试 5:默认兜底
curl -sI -H "Host: unknown.xxx" http://localhost:8080/ | grep X-Match-Rule
# 输出:X-Match-Rule: default: _

测试结果汇总

请求 Host 匹配规则 结果
site1.nginx.demo 精确匹配 ✅ 匹配 exact
api.nginx.demo 通配符前缀 *.nginx.demo ✅ 匹配 wildcard-prefix
www.nginx.demo 通配符前缀 *.nginx.demo ✅ 匹配 wildcard-prefix
site1.abc.com 通配符后缀 site1.* ✅ 匹配 wildcard-suffix
www.test.demo 正则 ~^www\\.(?!nginx\\.demo$).+\\.demo$ ✅ 匹配 regex
unknown.xxx 无匹配 → 默认 ✅ 匹配 default

五、F5 工程师看虚拟主机

复制代码
F5 概念                Nginx 对应
────────────────────────────────────
Virtual Server          server block
Destination IP:Port     listen 80
Destination Domain      server_name
Pool                    upstream
SNAT                    proxy_set_header
iRule                   location / rewrite

关键区别: F5 的 Virtual Server 绑定 IP:Port,不同域名可以走不同 VS。Nginx 的 server block 绑定的是 listen + server_name,多个域名共享同一个 IP:Port。


六、生产建议

  1. 精确匹配优先于通配符,性能最好的匹配方式
  2. 通配符不能跨级*.example.com 不匹配 www.api.example.com
  3. 正则匹配性能最低,生产环境尽量少用
  4. default_server 必须配置,防止恶意 IP 扫描
  5. 多个 server_name 可以写在一起server_name site1.nginx.demo site2.nginx.demo;

下一篇: Nginx 反向代理与 5 种负载均衡策略详解

相关推荐
虎头金猫3 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
还是大剑师兰特3 小时前
解决nginx错误:http://localhost:7000正常,http://localhost:7000/map 报错404
nginx·大剑师
AI职业加油站5 小时前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏5 小时前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
xing-xing6 小时前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅6 小时前
linux(8) 软硬链接
linux·运维·服务器
张洛闻Eren6 小时前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
其实防守也摸鱼7 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
布裘7 小时前
【银河麒麟】V4桌面图标消失,右击鼠标没反应排查
运维·银河麒麟·桌面环境
懂软件的胡子个哥8 小时前
微信机器人为什么需要“回复候选”而不是所有 AI 内容直接发送
运维·微信·自动化·wechatapi·个人微信号二次开发