listen和server_name共同决定虚拟主机请求匹配:listen指定监听的IP与端口,server_name匹配Host头;同一端口下按server_name精确匹配→通配符→正则→默认首个块的优先级顺序路由请求。

在 Nginx 的 server 块中,监听端口和服务器名称分别通过 listen 和 server_name 指令配置,这是虚拟主机识别请求的关键基础。
监听端口:用 listen 指定 IP 和端口
listen 指令定义该 server 块响应哪些网络地址和端口的请求。不写 listen 时,默认监听 80(HTTP)或 443(HTTPS,需配 SSL)。常见写法包括:
-
listen 80;— 监听本机所有 IPv4 地址的 80 端口 -
listen 192.168.1.10:8080;— 仅监听指定 IP 的 8080 端口 -
listen [::]:80;— 监听所有 IPv6 地址的 80 端口 -
listen 443 ssl http2;— 启用 HTTPS 和 HTTP/2(需同时配ssl_certificate等)
服务器名称:用 server_name 匹配 Host 头
server_name 用于匹配客户端 HTTP 请求中的 Host 请求头,决定由哪个 server 块处理该请求。支持多种匹配方式:
-
server_name example.com;— 精确匹配 -
server_name *.example.com;— 通配符匹配子域名(不匹配根域) -
server_name ~^www\d+\.example\.com$;— 正则匹配(开头加~) -
server_name "";— 匹配空 Host 头(如直接用 IP 访问)
多个名称可用空格分隔:server_name example.com www.example.com;
端口与名称共同决定匹配优先级
Nginx 在收到请求后,先按 listen 找到可能匹配的 server 块,再用 server_name 进一步筛选。当多个 server 块监听同一端口时,匹配顺序是:
- 先找
server_name完全匹配的 - 再找最长通配符前缀(如
*.example.com比example.com优先级低) - 最后找正则匹配(按配置文件中出现顺序)
- 都未匹配则使用该端口下第一个定义的 server 块(即“默认 server”)
一个典型 HTTP 虚拟主机示例
以下是一个监听 80 端口、响应 example.com 和 www.example.com 的完整配置片段:
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/example;
index index.html;
}
}
若还需支持 HTTPS,可另起一个 server 块监听 443,并添加 SSL 相关指令。


















