Nginx server_name 配置详解
Nginx server_name 配置详解:从域名到 IP 访问的完整解析
一、核心概念与作用
server_name 是 Nginx 实现基于域名的虚拟主机(Virtual Host)的核心指令,用于决定请求的路由规则。其核心作用包括:
- 域名匹配:根据客户端请求的
Host头字段匹配对应的server块 - 多站点托管:单台物理服务器可托管多个独立网站
- 动态路由:通过正则表达式实现灵活的子域名/路径路由
二、匹配规则与优先级
| 匹配类型 | 示例 | 说明 |
|---|---|---|
| 精确匹配 | server_name example.com; | 完全匹配域名,优先级最高 |
| 通配符前缀 | server_name *.example.com; | 匹配任意层级子域名(如 www.example.com、blog.example.com) |
| 通配符后缀 | server_name mail.*; | 需编译时启用 --with-http_v2_module 才能支持 |
| 正则匹配 | server_name ~^api\d+\.; | 支持 PCRE 语法,通过 ~ 启用,~* 表示不区分大小写 |
| 默认服务器 | listen 80 default_server; | 未匹配时兜底处理,建议显式声明 |
匹配顺序:精确匹配 > 通配符前缀 > 通配符后缀 > 正则匹配 > 默认服务器
三、IP 访问的特殊处理
1. 为什么不能直接匹配?
当客户端通过 http://IP:端口/uri 访问时:
- 请求头中的
Host字段为 IP 地址(如Host: 192.168.1.100) server_name example.com与Host字段的 IP 不匹配- Nginx 不会选择该
server块处理请求
2. Nginx 的实际行为
- 无
default_server:选择第一个server块(即使不匹配),通常返回 400 Bad Request - 有
default_server:选择标记为默认的server块处理请求
3. 解决方案
方案 1:配置默认服务器块
server {listen 80 default_server; # 标记为默认server_name _; # 匹配所有未匹配的请求location / {root /var/www/ip-access;index index.html;}
}server {listen 80;server_name example.com;location / {root /var/www/example;index index.html;}
}
方案 2:混合域名与 IP 匹配
server {listen 80;server_name example.com 192.168.1.100; # 同时匹配域名和 IPlocation / {root /var/www/example;index index.html;}
}
四、典型配置示例
1. 多域名绑定
server {listen 80;server_name example.com www.example.com;location / {root /var/www/example;index index.html;}
}
2. 通配符子域名
server {listen 80;server_name ~^(?<subdomain>.+)\.example\.com$;location / {root /sites/$subdomain;index index.html;}
}
3. 默认服务器配置
server {listen 80 default_server;server_name _;location / {return 403 "Forbidden";}
}
五、IP 访问的常见问题与解决方案
| 问题场景 | 解决方案 |
|---|---|
| 通过 IP 访问无法匹配 | 配置 default_server 或添加 server_name 192.168.1.100; |
| 通配符匹配失败 | 确保格式为 *.example.com 或 .example.com |
| 正则表达式未生效 | 检查 ~ 前缀,确保使用 $ 锚定结尾 |
| Host 头缺失导致 400 错误 | 配置 server_name ""; 处理空 Host 请求 |
| 域名权重 SEO 问题 | 使用 return 301 强制跳转到主域名(如 www 版本) |
六、性能优化建议
- 减少正则使用:精确匹配和通配符比正则更高效
- 哈希表优化:
http {server_names_hash_max_size 512;server_names_hash_bucket_size 64; } - 避免冗余配置:合并相同配置的 server 块
- SNI 配置:HTTPS 场景需配合
ssl_server_name on;使用
七、最佳实践总结
- 优先使用精确匹配:确保域名明确无歧义
- 默认服务器兜底:每个端口应配置一个默认 server
- 通配符规范写法:推荐使用
.example.com而非*.example.com - 正则捕获命名:使用
?<name>语法提高可读性 - 安全防护:限制通配符范围,防止意外匹配
八、调试工具推荐
- 测试匹配结果:
curl -H "Host: www.example.com" http://127.0.0.1 - 查看监听状态:
ss -lntup | grep nginx - 配置语法检查:
nginx -t
九、总结
通过合理配置 server_name,Nginx 可实现灵活的路由控制,满足从简单网站托管到复杂微服务架构的多样化需求。当通过 IP 访问时,务必配置 default_server 或显式声明 IP 地址,以确保请求能正确路由。掌握其匹配规则和优化技巧,是构建高性能 Web 服务的关键基础。

