nginx 选择 server 块的第一步是根据 listen 指令的地址精度筛选候选块:ip 绑定越具体(如 192.168.1.10:80)优先级越高,宽泛绑定(如 *:80)仅作兜底;default_server 显式指定 fallback,否则取端口下首个配置块。

Nginx 选择哪个 server 块处理请求,第一步就看 listen 指令——它不是简单“开个端口”,而是定义了该块的“接收范围”。地址绑定越具体,匹配优先级越高。
listen 地址精度决定候选资格
请求到达某 IP 和端口后,Nginx 先筛出所有 listen 能覆盖该组合的 server 块。这个筛选本身就有明确优先级:
-
listen 192.168.1.10:80;只响应发往192.168.1.10的 80 端口请求,不处理其他 IP 的同端口请求 -
listen *:80;或listen 80;表示监听所有 IPv4 和 IPv6 地址的 80 端口,范围最宽 -
listen [::]:80;仅限 IPv6;listen 0.0.0.0:80;仅限 IPv4(等价于listen *:80 ipv6only=off;)
相同端口下,IP 绑定越细越先被选中
当多个 server 块都监听 80 端口,但绑定不同地址时,Nginx 不按配置顺序,而是按地址 specificity 匹配:
- 请求目标 IP 是
192.168.1.10:80→ 只有listen 192.168.1.10:80;块参与后续server_name匹配 - 请求目标 IP 是
10.0.0.5:80→listen *:80;块入选,listen 192.168.1.10:80;被跳过 - 若同时存在
listen 10.0.0.1:80;和listen *:80;,前者一定优先于后者,无论谁写在前面
default_server 是显式兜底,不是靠猜
当 Host 头无法匹配任何 server_name,或请求 IP/端口没被更具体的 listen 覆盖时,就需要一个 fallback。这时:
-
listen 80 default_server;显式标记的块,无论server_name是什么,都会接管未命中请求 - 没加
default_server,Nginx 就取该端口下第一个出现的server块——这容易因配置顺序变动导致行为漂移 - 建议为每个常用端口(如 80、443)单独设一个最小化默认块,返回 444 或 404,避免泄露信息
协议与地址绑定共同隔离匹配池
listen 不仅管 IP 和端口,还隐含协议上下文:
-
listen 443 ssl;和listen 443;完全不兼容,HTTP 请求永远不会进入前者 -
listen 192.168.1.10:443 ssl;与listen *:443 ssl;属于不同监听组,前者只收指定 IP 的 HTTPS 请求 - 混用
ssl和非ssl监听同一端口会启动失败,Nginx 明确报错











