当你调不出来为什么一个 server_name 匹配不上的时候,请关注是否有另一个 server 块直接听了某个 IP,而不是 0.0.0.0

因为 Nginx 对 server 块的匹配是先找符合的 listen,随后再看符合的 listen 下面的 server_name。其中找 listen 的时候是先找对应 IP 的,没有再找 0.0.0.0。如果有完全相同的 IP,就不会看监听到 0.0.0.0 上的 server 块了。

举例: 有以下配置

eth0 -> 10.1.1.1
eth1 -> 10.1.2.1
server {
  listen 10.1.1.1:80;
  server_name a.example.com;
}

server {
  listen 0.0.0.0:80;
  server_name b.example.com;
}

一个 Host: b.example.com,如果从 eth1 走,会走到第二个块里。如果从 eth0 走,会走到第一个块里。

我算是服了