Nginx 默认服务器由 listen 指令的 default_server 参数指定,同一端口仅能有一个;server_name 不影响默认匹配,真正起作用的是 listen ... default_server;HTTP 和 HTTPS 需分别配置,HTTPS 还需考虑 SNI 与证书匹配。

在 Nginx 中,当请求的 Host 头不匹配任何已定义的 server 块时,Nginx 会将请求交给“默认服务器”(default server)处理。要让某个 server 块充当默认主机来响应未知域名,关键在于正确设置 listen 指令的 default_server 参数。
明确指定 default_server
在监听语句中添加 default_server 标志,告诉 Nginx 这是该端口上的默认服务块:
- 同一端口(如
80或443)只能有一个default_server - 若未显式声明,默认取配置文件中第一个
server块(但行为不可靠,不建议依赖) - HTTP 和 HTTPS 需分别设置,因为监听端口不同
示例(处理未知 HTTP 请求):
server {
listen 80 default_server;
server_name _; # 或留空,或用通配符,实际不参与匹配
return 444; # 静默关闭连接,或返回 404/443 重定向等
}server_name 不影响默认匹配逻辑
server_name 的值(包括 _、空字符串、通配符)在默认服务器中几乎不起作用——只要该 server 被标记为 default_server,它就会接收所有未被其他 server 显式匹配的请求。
-
server_name _;是常见写法,语义上表示“无特定名称”,但非必需 - 即使写成
server_name example.com;,只要加了default_server,它仍会响应unknown.com - 真正起作用的是
listen ... default_server,不是server_name
HTTPS 场景需单独配置 default_server
由于 HTTPS 在 TLS 握手阶段就需选择证书,Nginx 会基于 SNI(Server Name Indication)字段匹配 server_name;若客户端不支持 SNI 或 Host 不匹配,且没有 default_server,可能返回默认证书或连接失败。
- 务必为
443端口也设置default_server - 建议搭配一个基础证书(如自签名或泛域名证书),避免 TLS 握手报错
- 可统一返回 444、重定向到主站,或返回友好提示页
验证与调试技巧
确认默认服务器是否生效,可用 curl 模拟无 Host 或非法 Host 的请求:
curl -H "Host: nonexistent.example" http://your-server-ip/curl --resolve "fake.com:80:your-server-ip" http://fake.com/- 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,看是否有匹配警告 - 运行
nginx -t确保配置语法正确,再nginx -s reload










