nginx通过listen指令绑定ip与端口实现基于ip的虚拟主机,语法为listen [ip:]端口[参数];必须确保每个server块的ip+端口组合唯一,否则启动报错;支持ipv4/ipv6分别或同时监听,并需注意权限及default_server兜底规则。

明确 listen 的语法结构
基本格式是:listen [IP地址:]端口号 [参数];
-
listen 80; → 监听本机所有 IPv4 地址的 80 端口(等价于
0.0.0.0:80) - listen 192.168.1.100:80; → 只响应发往该 IP 的请求,其他网卡或 IP 不处理
- listen 127.0.0.1:8080; → 仅本地进程可访问,适合反向代理后端或管理接口
- listen [::1]:8000; → 绑定 IPv6 回环地址(注意方括号)
基于 IP + 端口组合的虚拟主机配置
当一台服务器有多个 IP(如公网 IP + 内网 IP),又想为不同 IP 上的相同端口提供不同服务时,就靠 IP+端口唯一标识一个 server 块:
- 每个
server块必须有唯一的listen组合(IP+端口不能完全重复) - 若两个块都写
listen 80;,Nginx 启动会报错:“duplicate listen options” - 允许同一端口在不同 IP 上监听,例如:
listen 192.168.10.10:80;listen 192.168.20.20:80;
这样就实现了两个独立的“基于 IP 的虚拟主机”
常见误区与注意事项
实际配置中容易忽略几个细节:
- 权限问题:绑定 1–1023 端口(如 80、443)需要 root 权限;普通用户只能监听 ≥1024 的端口
-
系统限制:Linux 默认可能禁止非 root 用户绑定低编号端口,需用
setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx或改用高编号端口测试 -
IPv6 兼容性:若启用了 IPv6,
listen 80;默认只监听 IPv4;要同时监听 IPv4 和 IPv6,得写两行:listen 80;listen [::]:80; -
default_server 作用:当多个 server 块监听同一 IP+端口时,加
default_server的那个块会兜底处理未匹配到server_name的请求
一个可运行的双 IP 虚拟主机示例
假设服务器已配置两个 IP:192.168.50.100 和 192.168.50.101:
server {
listen 192.168.50.100:80;
server_name _;
root /var/www/site-a;
index index.html;
}
server {
listen 192.168.50.101:80;
server_name _;
root /var/www/site-b;
index index.html;
}
访问 http://192.168.50.100 显示 site-a,访问 http://192.168.50.101 显示 site-b,彼此完全隔离。











