nginx重复server_name分两类:空值(如""、_)导致emerg级启动失败;非空域名重复仅warn级忽略,首个块生效。default_server可能隐性覆盖请求,通配符与正则不触发conflicting警告。

Nginx 遇到重复的 server_name 时,报错行为分两类:启动失败(emerg 级别)和静默忽略(warn 级别),具体取决于冲突类型。
空 server_name 引发启动失败
当多个 server 块在相同 listen 地址+端口上都未定义 server_name,或都写成 server_name ""; 或 server_name _;,Nginx 会直接拒绝启动:
nginx: [emerg] a duplicate listen 0.0.0.0:80 for server, sleepingnginx: [emerg] conflicting server name "" on 0.0.0.0:80
这类错误属于配置语法级冲突,nginx -t 就能立即检测出来,服务无法加载。
非空域名重复仅警告不中断
如果两个 server 块都明确写了相同的有效域名(如都写 server_name example.com;),Nginx 不会报 emerg,而是发出警告并继续启动:
nginx: [warn] conflicting server name "example.com" on 0.0.0.0:80, ignored
此时只有第一个按文件顺序出现的 server 块生效,后续同名块被静默跳过——请求始终由第一个块处理,其余配置形同虚设。
default_server 标记加剧隐性覆盖
若某个带 default_server 的块其 server_name 为空或不匹配,它会兜底响应所有未精确匹配的请求。这容易掩盖真实冲突:
- 用户访问
www.example.com,但配置里只写了example.com,没写www - 结果被
default_server块捕获,打开的却是另一个站点首页 - 日志里可能只显示
no suitable server found,而非直接报冲突
通配符与正则表达式不触发“conflicting”警告
像 *.example.com 和 ~^api\..*\.example\.com$ 这类写法即使语义重叠,Nginx 也不会报 conflicting server name。它按固定优先级(精确 > 左通配 > 右通配 > 正则)选一个处理,但不会提示你逻辑可能出错。











