关键在于listen指令后添加default_server参数,它是端口维度的兜底标识,必须与listen绑定(如listen 80 default_server;),同一ip:端口:协议组合下仅允许一个,且优先级高于server_name匹配,用于处理所有未匹配host头的请求。

在 Nginx 中,指定默认虚拟主机(即兜底处理未匹配域名的请求)的关键,是给 listen 指令加上 default_server 参数,而不是靠 server_name 或其他配置“凑数”。
必须加在 listen 上,不能单独写
default_server 是 listen 的修饰符,不是独立指令。它只在监听端口时生效:
- ✅ 正确:
listen 80 default_server;或listen 443 ssl http2 default_server; - ❌ 错误:
default_server;单独一行(Nginx 启动会直接报错) - ❌ 错误:
server_name _;或空server_name—— 这只是普通 server,不兜底
同一端口协议下只能有一个
Nginx 按“IP:端口:协议”维度判定默认行为,所以:
- IPv4 和 IPv6 要分别设置:比如
listen 80 default_server;和listen [::]:80 default_server;都需要显式写 - 不能有两个
listen 80 default_server;,否则 reload 时报 “duplicate default_server” - 可以共存
listen 80 default_server;和listen 80;,前者优先接管所有未匹配 Host 的请求
匹配逻辑:Host 不匹配 → 找 default_server
Nginx 处理请求时,先查 Host 头是否命中某个 server_name;全部不中,才启用该端口的 default_server:
- 哪怕这个 server 块里写的是
server_name "";或干脆没写server_name,只要listen带default_server就生效 - 常见安全做法:在 default_server 里返回
return 444;(直接断连)或return 404;,避免暴露服务器信息
推荐实践:独立配置 + 明确作用
建议把默认虚拟主机单独写成一个配置文件(如 /etc/nginx/conf.d/.default.conf),内容精简清晰:
- 监听 80 和 443,并都带上
default_server - 不设
server_name,或设为"" - 根目录不用指向真实站点,直接用
return 444;或重定向到主站











