Nginx服务器块匹配异常:公网IP访问匹配内网IP块原因解析
Nginx公网IP访问匹配内网IP Server块的原因解析
场景回顾
云服务器公网IP为8.130.104.xxx,内网IP为172.16.38.191,Nginx配置了两个server块,分别监听公网IP和内网IP的80端口,且server_name均为example.org。使用公网IP访问时,请求却匹配了内网IP对应的server块,返回的server_addr为内网IP。
核心原因:云服务器公网IP的NAT映射机制
云服务商提供的公网IP大多并非直接绑定在服务器的物理网卡上,而是通过NAT(网络地址转换)网关实现流量转发:
- 外部用户发起的公网IP请求,首先到达云平台的NAT网关
- NAT网关会将请求的目的IP替换为服务器的内网IP,再转发到服务器
- 服务器的Nginx收到请求时,请求的目标IP是内网IP
172.16.38.191,因此只会匹配监听该内网IP的server块,监听公网IP的server块根本不会收到这个请求
Nginx内部匹配逻辑验证
Nginx的server块匹配遵循以下优先级:
- 优先匹配请求的目标IP:端口:只有当请求的目标IP和端口与
listen指令配置的地址完全一致时,才会进入该server块的后续匹配 - 若多个server块匹配同一IP:端口,再根据
Host头匹配server_name - 无匹配
server_name时,使用该IP:端口上的默认server
在这个场景中,请求经过NAT转换后目标IP变为内网IP,第一步就命中了内网IP的server块,因此不会触发公网IP server块的匹配逻辑。
额外验证方式
可以通过服务器上的netstat命令查看Nginx的实际监听端口:
netstat -tulpn | grep nginx
如果公网IP8.130.104.xxx并未出现在监听列表中,说明Nginx无法绑定到该公网IP(因为网卡未配置该IP),进一步验证了NAT映射的结论。
内容的提问来源于stack exchange,提问作者hejun
相关产品推荐
相关产品推荐

