上十一点多,一个做工业设备租赁的客户打来电话,说网站刚换了服务器,域名解析也改了,用手机打开是新的,用办公室电脑打开还是旧的,清了好几次浏览器缓存都没用。
客户在辽宁沈阳市铁西区,做叉车、升降机这类的租赁业务。网站从原来的一台青岛服务器迁到了天津的新机器上,迁移过程挺顺利,文件和数据库都搬完了,域名也重新解析到了新IP。
先从本地DNS查起
让客户在办公室电脑上打开命令行,敲了nslookup 域名,返回的还是旧服务器的IP。这说明本地DNS缓存没有刷新,用的是之前解析的旧记录。
问题来了,客户说手机用的是4G网络,解析到的是新IP,办公室的宽带解析到的是旧IP,同一个域名在不同的网络环境下结果不一样。
检查TTL设置
登录域名管理后台,看了一下A记录的TTL值,设置的是3600秒,也就是一小时。理论上改完解析一小时之内应该全部生效,但客户说已经过了快两个小时了。
这种情况通常是运营商的DNS服务器缓存没有主动过期。有些地方运营商的DNS服务器不严格遵守TTL,会根据自己内部的策略延长缓存时间。办公室那条宽带用的正好是当地运营商的DNS,缓存时间偏长。
临时解决办法
让客户先把电脑的DNS服务器改成公共DNS,比如阿里云的223.5.5.5或者腾讯的119.29.29.29。改完之后再访问,刷新了一下,新网站出来了。
但客户说不能每个员工都去改DNS,这太麻烦了。而且客户自己在沈阳市铁西区的办公室,员工有十几个人,不可能一个个去调。
继续排查
既然手机能访问新网站,说明解析本身没问题,问题出在办公室这条宽带的DNS缓存上。但等下去也不是办法,得主动去通知DNS服务器刷新。
联系了域名解析服务商,提交了刷新缓存的请求。同时把域名的TTL值从3600秒临时改成了60秒,这样以后再做解析变更生效会快很多。
但这些操作只能加速公共DNS的刷新,本地运营商DNS的缓存没办法强制刷新,只能等它自然过期。客服说一般最长不超过24小时。
为什么手机和电脑结果不一样
手机用的是4G网络,走的运营商移动网络的DNS,可能刚好那台DNS服务器缓存已经过期了,或者走的是不同的解析路径。办公室的固定宽带走的是另一套DNS服务器,缓存时间没到。
这不是CDN的问题,纯粹是DNS缓存不同步导致的。
第二天早上
第二天早上九点多,客户发消息说办公室电脑已经正常了,访问的是新网站。前后大概等了14个小时,运营商DNS缓存终于过期了。
客户说昨晚折腾到半夜,还以为是自己电脑有问题。我说这是域名解析变更后的正常现象,改完解析不是马上就全网络生效的,不同地区、不同运营商的生效速度都不一样,最快几分钟,最慢可能要一天。
顺手检查了CDN配置
客户之前给网站配了CDN,但迁移过程中CDN的回源地址还是指向旧服务器的IP。检查了一下,果然没改。虽然CDN缓存的内容本身是静态的,但回源地址没更新,一旦缓存过期需要回源的时候还是会去请求旧服务器。
在CDN控制台把回源地址改成了新服务器IP,同时刷新了全站缓存,强制CDN重新从新服务器拉取内容。这一步不做的话,后面可能还会出现CDN回源到旧服务器导致内容不一致的问题。
还发现了一个小问题
客户网站上有几个页面用的是绝对路径写死了旧服务器的IP,迁移之后这些资源加载不出来。在数据库里批量替换了一下,把旧IP换成新域名,这几个页面就正常了。
几点经验
域名解析变更后,生效时间取决于几个因素:TTL设置、各地运营商DNS缓存策略、是否用了CDN。最稳妥的做法是在变更解析之前先把TTL调低,比如提前一天改成60秒,等解析变更完成后再调回正常值。这样变更生效会快很多。
如果遇到解析已经改了但部分用户还是访问旧服务器,先检查本地DNS缓存,再检查CDN回源配置,最后确认网站代码里有没有写死旧IP的地方。这几个地方查一遍,基本能定位到问题。
客户后来在电话里说,以后换服务器一定提前跟我说,让我把TTL先调低,省得半夜折腾。我说对,这种事提前规划一下,比出了问题再排查要省事得多。
