排查 nginx server_name 域名解析不生效,核心在于确认请求的 host 头是否匹配配置中的域名,以及 dns 解析是否正确指向了服务器 ip。首先检查 nginx 配置文件中的 server_name 指令是否准确包含了目标域名,并验证 nginx -t 语法通过后重新加载配置。其次,使用 curl -h "host: example.com" http://ip 模拟请求,观察返回内容是否符合预期,以排除 dns 缓存或客户端解析问题。

Nginx 配置中 server_name 匹配规则是什么
server_name 的匹配遵循精确匹配、通配符前缀、通配符后缀和正则表达式的优先级顺序。当多个 server 块可能匹配同一个 Host 时,Nginx 会选择最具体的那个。如果没有任何 server 块匹配,请求将落入默认 server 块(通常是第一个定义的或标记为 default_server 的)。确保你的域名在配置中被明确列出,且没有与其他冲突的配置项混淆。

server {
listen 80;
server_name www.example.com example.com;
location / {
root /var/www/html;
index index.html;
}
}
上述配置中,访问 www.example.com 或 example.com 都会进入此 server 块。若只写了 server_name *.example.com;,则只能匹配子域名,无法直接匹配裸域 example.com。需根据实际需求调整域名列表。
如何验证 Host 头与 server_name 的匹配结果
通过命令行工具 curl 可以直接测试 Host 头与 server_name 的匹配情况。构造请求时指定 -H "Host: ..." 参数,可以绕过 DNS 解析,直接向服务器 IP 发送带有特定域名的请求。观察响应状态码和返回内容,判断是否进入了预期的 server 块。如果返回 404 或默认页面,说明匹配失败或未正确配置。

# 假设服务器 IP 为 192.168.1.100 curl -I -H "Host: www.example.com" http://192.168.1.100 # 期望看到 200 OK 及正确的 Content-Type curl -I -H "Host: bad.domain.com" http://192.168.1.100 # 期望看到 444 或默认服务器的响应
执行第一条命令,若返回 200 OK 且内容为 /var/www/html 下的文件,则匹配成功。执行第二条命令,若返回 444 No Response 或默认站点内容,说明 bad.domain.com 未在任何 server_name 中定义,从而落入默认处理逻辑。这有助于快速定位是配置遗漏还是其他网络问题。
当 server_name 包含正则表达式时行为有何不同
在 server_name 中使用正则表达式(如 ~^www\.example\.(com|net)$)可以提供更灵活的匹配能力,但其优先级低于精确匹配和通配符匹配。正则表达式匹配是大小写敏感的,且性能开销相对较大。如果配置中同时存在精确匹配和正则匹配,Nginx 会优先选择精确匹配的 server 块。因此,在使用正则表达式时,需确保其不会意外覆盖其他更简单的匹配规则,并定期审查配置以避免性能瓶颈。











