核心是将default_server参数正确写在listen指令后,如listen 80 default_server;同一端口协议下仅允许一个,IPv4与IPv6需分别设置,优先级高于server_name匹配,常用于返回444或404防止信息泄露。

让某个 server 块成为 Nginx 的默认虚拟主机,核心是用好 default_server 参数——它必须写在 listen 指令后面,而不是单独成行,也不依赖 server_name 是否为空或为 _。
default_server 必须绑定 listen 指令
这个参数不是独立指令,只作为 listen 的修饰符生效:
- ✅ 正确:
listen 80 default_server;或listen 443 ssl http2 default_server; - ✅ IPv6 同样需要显式声明:
listen [::]:80 default_server; - ❌ 错误:
default_server;单独一行(Nginx 会报配置错误) - ❌ 错误:
listen 80;和listen 80 default_server;在同一配置中重复出现(Nginx 不允许同端口协议下多个 default_server)
同一端口协议下仅能有一个 default_server
Nginx 按 “IP:端口:协议” 维度识别默认行为,IPv4 和 IPv6 是分开计算的:
- 可以同时存在:
listen 80 default_server;(处理 IPv4 请求)和listen [::]:80 default_server;(处理 IPv6 请求) - 不能有两个
listen 80 default_server;,否则nginx -t会提示 duplicate default_server - 如果只写了
listen 80;,哪怕server_name ""或server_name _;,它也不会兜底
default_server 的匹配优先级最高
请求进来时,Nginx 先查 Host 头是否匹配任一 server_name;全部不匹配,才启用对应端口上的 default_server:
- 即使该
server块里写的是server_name ""、server_name _;,甚至完全不写server_name,只要带default_server,就能兜底 - 常见安全做法是在 default_server 中返回
444(直接关闭连接)或404,避免暴露服务器信息 - 也可用于统一重定向,比如把所有 IP 直连或错输域名的请求跳转到主站:
return 301 https://www.example.com$request_uri;
配置路径与加载建议
生产环境推荐将 default_server 单独写入一个配置文件(如 vhost/default.conf),再通过 include vhost/*.conf; 加载:
- 主配置
nginx.conf中保留http块,删掉默认的server{} - 确保
include路径正确,且文件权限允许 Nginx 读取 - 每次修改后务必执行
nginx -t测试语法,再nginx -s reload生效


















