nginx按listen精度和server_name匹配顺序选server块:先筛选能接收请求的listen(ip+端口越精确优先级越高),再在候选块中依精确匹配、前导通配符、后缀通配符、正则顺序匹配host头;未匹配时由default_server或首个server块兜底;http与https监听完全隔离。

Nginx 选哪个 server 块处理请求,不是看配置文件里谁写在前面,而是按一套固定规则层层筛选。核心就两点:先看 listen 能不能接住这个请求,再看 server_name 谁更匹配 Host 头。
listen 地址精度决定谁能参与竞争
请求打到某个 IP 和端口(比如 192.168.1.10:80),Nginx 会先筛出所有能“接得住”它的 server 块:
-
listen 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; 写在最上面,只要同时存在 listen 10.0.0.5:80;,而请求目标正好是 10.0.0.5:80,那只有后者进下一轮比拼。
server_name 匹配有明确先后顺序
同一端口下的候选块,按以下顺序比 Host 头(不区分大小写):
-
完全相等:比如
server_name example.com;只匹配Host: example.com,不认www.example.com或example.com:8080 -
最长前导通配符:如
server_name *.example.com;,可匹配api.example.com、www.example.com,但不匹配example.com -
最长后缀通配符(Nginx ≥1.11.10):如
server_name example.*;,匹配example.org、example.net -
正则表达式:以
~(区分大小写)或~*(不区分)开头,从上到下逐行试,第一个成功就停,不比长度
注意:通配符之间不混比,正则也不和通配符比——Nginx 先扫一遍精确匹配,没有再扫前导通配符,再没有才看后缀,最后才轮到正则。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
兜底必须显式声明 default_server
当 Host 头一个都没匹配上,或者请求是直接用 IP 访问(没带 Host 头),就需要 fallback:
- 写明
listen 80 default_server;或listen 443 ssl default_server;,该块无条件接管 - 没写
default_server,Nginx 就取该端口下**第一个加载的 server 块**(通常是配置文件里第一个定义的),行为不可靠
建议每个常用端口都配一个最小化默认块,比如返回 444(直接断连)或 404,避免泄露服务器信息或误导向。
HTTP 和 HTTPS 必须分开配置
这两个协议走的是不同监听池:
-
listen 80;的块不参与 HTTPS 请求匹配 -
listen 443 ssl;和listen 443;是两套独立的 server 块集合,互不影响 - SSL 证书绑定取决于最终匹配到的 server 块,不是靠域名猜——
server_name *.example.com;块里配通配符证书,server_name www.example.com;块里配具体域名证书
别指望一个 server 块同时扛 HTTP 和 HTTPS,也别把 HTTP 的 server_name 规则套到 HTTPS 上去比。










