同一机器下通过HTTP域名访问其他服务器进程返回504问题记录
我这边项目的服务器有好几个类型节点,每个节点为一个进程,不同节点间通过HTTP来通讯,当前这几个类型的节点都部署在同一台机器上,然后我再测试某个节点到另一个节点的http通讯时,发现一个奇怪的现象:
1. 我先通过“http://127.0.0.1:8888”这种方式去访问另一个节点的话,没有问题。
2. 我再把ip改为了“域名”(比如域名为:abc.efg.com), 域名是通过负载均衡和这台机器做了关联,通过“https://abc.efg.com”去访问就一直给我返回状态码“504”(gateway time-out),然后我在其他机器上去访问“https://abc.efg.com”(curl -X POST https://abc.efg.com)就没有问题。
后面想到会不会是安全组的“入站规则”那边没有开放端口导致的?于是把“8888”端口也加进去了,再回到问题机器上通过域名访问就没问题了。
根本原因分析
(1) 负载均衡(LB)的流量路径
- 当通过域名
abc.efg.com
访问时:- 流量路径:客户端 → 负载均衡(LB)→ 后端服务器(你的机器)。
- LB 需要将请求转发到后端服务器的
8888
端口。
- 安全组的作用:
- 安全组控制的是 后端服务器(你的机器)的入站流量。
- 未开放
8888
时:- 外部机器:LB 的 IP 不在安全组限制范围内(LB 通常有独立 IP 白名单),流量可以到达你的机器。
- 本地机器:通过 LB 访问时,LB 会将流量 回源到同一台机器,此时触发了安全组规则,丢弃了
8888
端口的入站流量。
- 开放
8888
后:本地回源流量被允许,问题解决。
(2) 为什么 127.0.0.1
不受影响?
127.0.0.1
是 本地回环地址,完全绕过网络栈和安全组,直接由内核处理,因此不受安全组限制。
(3) 为什么外部机器通过 LB 能访问?
- 外部机器的请求经过 LB 后,LB 可能使用 内网 IP 或 非
8888
端口 转发到你的机器(例如 LB 到后端默认走80/443
),而你的安全组允许这些端口。