同服务器站点互通,同一服务器网站内网互通设置

同一台服务器内部搭建多个网站,站点之间互相调取数据、调用接口,这件事看着简单,实际操作很容易踩坑绕弯路。我第一次碰到这个场景,是一台部署了宝塔面板的服务器,A站要调用B站的API,当时直接填写B站公网域名发起请求,流量从公网绕一圈再回到本机,延迟超出预期,还白白消耗公网流量。后来才明白,同一台机器上站点互相调用,完全没必要走公网链路。

最简单的方式就是使用回环地址127.0.0.1,也就是本机地址。A站请求B站接口,把域名替换成127.0.0.1,端口填写B站实际监听端口。举个例子,B站Nginx监听8080端口,A站内使用curl http://127.0.0.1:8080/api/xxx就能完成调用。这种方式不经过物理网卡,不占用公网带宽,速度最优。但有前提条件,B站监听地址需要设置为0.0.0.0或者127.0.0.1,如果仅绑定某个固定公网IP,回环地址无法建立连接。

同服务器站点互通,同一服务器网站内网互通设置

有人会问,用服务器内网IP行不行。当然可以,云服务器一般会分配内网地址,大多属于10.x.x.x或者172.16.x.x网段。内网IP相比回环地址兼容性更好,部分程序校验地址时对内网IP接受度更高。如果后续打算把B站迁移到另一台服务器,只需要修改内网IP,原有调用逻辑不用大改,架构预留了调整空间。不过流量会经过虚拟网卡,性能对比127.0.0.1会轻微下降,普通业务场景几乎感知不到差异。

域名解析这块也要留意。如果A站代码里面写死B站域名,最简单的处理办法就是修改本机hosts文件,把B站域名指向127.0.0.1。这样原有代码不用改动,请求自动走本机回环。Linux系统编辑/etc/hosts,Windows系统路径为C:WindowsSystem32driversetchosts,新增一行记录127.0.0.1 对应B站域名。Nginx反向代理场景也经常这么配置,proxy_pass填写域名,依靠本机hosts把域名解析到本地端口。但修改hosts之后,如果B站同样占用443端口,会出现端口冲突,要么修改B站监听端口,要么启用Nginx stream模块做四层转发。

端口冲突,是同机多站点互相调用最常见的问题。A站和B站都想占用80、443端口,同一时间只能有一个站点绑定成功。解决办法有几种,第一种用Nginx搭建虚拟主机,依靠域名区分站点,两个站点共用80端口,请求转发到各自后端端口。第二种一个站点监听80端口,另一个站点更换为8080这类端口,依靠Nginx反向代理对外提供访问。还有一种方案使用Docker,每个容器拥有独立网络命名空间,内部端口互不干扰,容器之间依靠容器名称或者自定义网络互通。Docker Compose环境更省事,同一网络内的服务,可以直接填写服务名称作为主机地址,A容器执行curl http://b-service:8080/api就能调用,不用记录IP。

防火墙不要忽略。云服务器安全组默认往往只放行80和443端口,如果内网互通使用其他端口,需要确认安全组是否放行对应端口。部分云平台内网互通默认放开,也有平台需要手动添加规则。系统层面iptables或者firewalld也要检查,防止回环流量、内网网段被拦截。排查的时候优先用telnet 127.0.0.1 目标端口测试连通性,确认通了之后再测试内网IP,最后测试公网域名,分段定位问题。

还有数据库互通的细节。A站和B站共用本机MySQL,数据库连接地址填写localhost或者127.0.0.1即可。如果填写公网IP,MySQL权限表没有匹配的host记录,连接请求会直接被拒绝。MySQL user表里面,root@localhost、root@127.0.0.1、root@%属于三条独立权限记录,权限互相独立。同机调用数据库,最好单独创建内网访问账号,host限定127.0.0.1或者内网网段,尽量不要直接使用root账号对外提供连接。

HTTPS场景处理起来会麻烦一点。B站配置SSL证书之后,A站使用127.0.0.1发起调用,证书校验会失败,证书绑定对象是域名而非IP。两种解决思路,代码内部关闭SSL校验;或者修改hosts将域名指向127.0.0.1,调用时使用域名访问,证书校验就能正常通过。Nginx反向代理可以配置proxy_ssl_verify off关闭校验,但这个方式只适合内部可信环境,对外业务不能这么设置。

最后一个容易漏掉的点,Nginx反向代理搭配hosts方案,要注意Nginx的resolver缓存。修改hosts文件之后,Nginx可能继续使用旧的解析记录,需要reload Nginx重新读取配置。部分程序自带DNS缓存,例如Java JVM默认缓存域名解析结果,修改hosts之后要重启应用才能生效。这些都属于小细节,但赶项目的时候卡在上面会很耗时间。优先保证回环地址调用能通,再考虑域名和内网IP方案,大部分站点互通需求依靠127.0.0.1加上正确端口就能搞定。

免责声明:本文提供的方法与建议仅供技术参考,实际部署效果受机房环境、运营商线路、系统配置等多重因素影响。请在专业人员指导下操作,因自行操作导致的业务损失本站不承担责任。