nginx 的 server_name 指令仅匹配 http 请求头中的 host 字段,该字段不包含端口号,因此无法直接通过 server_name 区分不同端口的访问。要处理带端口的域名访问,必须依赖监听端口(listen)与域名的组合来建立独立的 server 块。当 nginx 收到请求时,会先根据目标端口找到对应的 server 块,再在该块内使用 server_name 进行精确匹配。

如何配置特定端口的 server 块
在 Nginx 中,每个需要独立处理的端口都需要一个单独的 server 块。通过在 listen 指令中指定端口,并在 server_name 中定义域名,可以实现对特定端口和域名的精准控制。例如,监听 8080 端口的请求并匹配 example.com,可以将其路由到特定的根目录或反向代理后端。

server {
listen 8080;
server_name example.com;
location / {
root /var/www/html-8080;
index index.html;
}
}
上述配置创建了一个监听 8080 端口的服务器块。当用户访问 http://example.com:8080 时,Nginx 会将请求分发到此块中定义的 location 进行处理。如果同时存在监听 80 端口的同名 server 块,两者互不干扰,因为它们的监听端口不同。
如何处理默认端口与非标准端口的冲突
当多个 server 块拥有相同的 server_name 但监听不同端口时,Nginx 会根据请求的目标端口选择正确的块。如果请求的端口没有匹配的 listen 指令,Nginx 会返回 404 错误。此外,如果某个端口下没有明确匹配 server_name 的配置,Nginx 会使用该端口下的第一个 server 块作为默认响应。

server {
listen 80 default_server;
server_name _;
location / {
return 444;
}
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend_api;
}
}
第一段代码展示了如何为 80 端口设置一个默认的“捕获”块,用于拒绝未明确配置的域名访问。第二段代码则定义了针对 api.example.com 的具体处理逻辑。这种结构确保了只有符合预期的域名和端口组合才会被处理,其他请求会被拦截或返回默认行为。
基于 server_name 匹配失败时的回退机制
当请求的 Host 头无法匹配任何 server_name 时,Nginx 会回退到该监听端口下的默认 server 块。这个默认块通常是该端口下配置的第一个 server 块,或者是指定了 default_server 参数的块。理解这一机制对于排查“为什么我的域名访问到了错误的网站”至关重要。











