引言
由于有个小项目需要搭个临时的多语言测试环境,所以做了个多级域名来区分不同的语言环境。
操作如下:
- 在阿里云的控制面板,将t1.kangbiao.org和t2.kangbiao.org两个二级域名分别解析到两台服务器上面。
- 在t1.kangbiao.org服务器上面安装nginx,修改配置文件,分别添加java.nginx.conf,python.nginx.conf和php.nginx.conf三个配置文件。
- 设置三个语言环境的访问方式(即修改三个配置文件服务器名)为java.t1.kangbiao.org,py.t1.kangbiao.org和php.t1.kangbiao.org。(完全是强迫症犯了,不想分目录访问三个语言环境的服务)。
问题:
只有t1.kangbiao.org能正确访问,其他的三级域名均查询不到dns。
这就是没有完全理解dns查询过程导致的坑啊。我一直以为把域名解析到服务器后,这个域名对应的下级域名就可以在服务器上面配置,然后就可以实现泛解析或者多下级域名访问。
解决问题
nginx配置有问题?
对照着nginx的官方文档一个配置一个配置的检查了每个配置文件是否正确,甚至把无关紧要的配置项都改来改去测试是不是配置问件有问题,然而改了一个小时候,完全放弃,这根本不是配置文件的坑好嘛。
网络问题?
于是又想是不是公司网络的问题,需要用自己的手机访问了一下,still error。。。于是这个问题原因就被排除了。
DNS解析问题?
后来仔细看了看浏览器报的错,感觉这是dns没有配对啊。于是上网查了查dns解析原理。最后基本确定是三级域名没有解析记录导致的。
开始解决
在阿里云控制面板增加三个域名解析A记录py.t1,java.t1和php.t1后访问,访问正常。我只是测试性的这样配置一下,没想到阿里云还真支持这种a记录里面带.的解析配置。最后想了想,在用户这样设置的时候,这条解析记录直接就绕过t1.kangbiao.org这个域而生效了。
一般我们设置php.t1.kangbiao.org解析后的DNS查询如下:
- 浏览器查询本地缓存,没有则会像ISP的dns发起查询,如果ISP的DNS也没有缓存,则一级一级的去查询解析记录。
- 由于每一次的查询,浏览器都是带着完整的域名php.t1.kangbiao.org去查询,所以即使没有设置t1.kangbiao.org的解析记录,仍然可以直接查到php.t1.kangbiao.org对应的主机。
- 所以,dns查询过程并不是一定要老老实实的对每一级域进行查询,只要有记录,是可以跳级去查询的。并不是每个域都要有解析记录。比如一台DNS服务器上面有kangbiao.org和php.t1.kangbiao.org两条解析记录,而t1.kangbiao.org没有解析记录时,那么当去查询php.t1.kangbiao.org时,这台DNS服务器并不是告诉你t1.kangbiao.org对应的服务器是哪一台,而是直接就返回php.t1.kangbiao.org的地址。所以域名在DNS解析里面是字符串式的查询,是不分域的,也就是可以不是一层一层的查询,而是这个域名对应的字符串有解析记录我就返回给你,当查不到时,会返回该DNS服务器已经记录的离该查询域名最近的一个域对应的服务器地址(可能就是该域名本身),分域是针对于浏览器的一个概念
总结
所以这下就知道了为什么刚开始只设置t1.kangbiao.org的解析记录,然后再服务器上面设置php.t1.kangbiao.org会访问不到的原因了,因为最后当DNS查询进行到最后一级(即php.t1.kangbiao.org)的时候,是向装有nginx的那台web服务器进行了一次DNS解析查询,明显的那台服务器没有装DNS服务器,所以53号端口就完全没有被开放,所以会直接导致DNS查询失败,在DNS查询里面,分域就是一种协议,大家互相遵守。
教科书上说的果然都是一般情况,技巧性的东西还需多跳坑。