server_name不能配置端口号,因其仅匹配Host头中的域名部分,忽略端口;端口区分由listen指令实现,不同端口需配置独立server块。

server_name 不能配置端口号。这是 Nginx 的设计规则:server_name 指令只匹配 HTTP 请求头中的 Host 字段,而 Host 字段本身不包含端口(除非端口是非标准端口且显式写出,如 example.com:8080),但 Nginx 在匹配 server_name 时会忽略端口部分,仅比对域名或 IP 地址。
为什么 server_name 不处理端口
Nginx 区分虚拟主机的逻辑是分层的:
- 最外层靠
listen指令决定哪个 server 块响应请求——它绑定的是 IP + 端口; - 内层才用
server_name进一步区分同端口下的多个域名或主机名; - 所以端口区分必须通过多个
listen指令实现,而不是写在server_name里。
正确配置带端口的虚拟主机的方法
要让不同端口服务不同站点,只需为每个站点单独定义一个 server 块,并在其中设置不同的 listen 值。server_name 可以保持一致(比如都写 localhost 或 IP),也可以留空或设为任意值——只要 listen 端口不同,Nginx 就能准确路由。
- 监听 8080 端口的服务:
server {
listen 8080;
server_name localhost;
root /var/www/site-a;
index index.html;
} - 监听 8081 端口的服务:
server {
listen 8081;
server_name localhost;
root /var/www/site-b;
index index.html;
}
注意事项
实际使用中要注意几个关键点:
- 防火墙需放行对应端口(如
8080、8081),否则外部无法访问; - 浏览器访问时必须显式带上端口,例如
http://192.168.1.100:8080; - 如果 server_name 写了带端口的字符串(如
server_name example.com:8080),Nginx 不报错但也不会按端口匹配——该配置等效于server_name example.com; - 同一端口下多个 server 块若 listen 相同,server_name 才起作用;跨端口场景下,server_name 几乎无关紧要。


















