由Nginx的DNS缓存导致的访问404

服务器

浏览数:161

2019-9-18


现象

访问某个URL出现404,而且全站都是404。通过日志查看Nginx的规则也正确,请求被代理到指定位置。

排查

最近针对这个站点没有修改过Nginx配置也没有站点升级。所以应该是其他原因。
首先PING代理到的域名,发现可以解析

查看日志

发现解析的2个地址都返回502,这里[ip,ip]是因为第一个访问失败才走的第二个,最后2个都失败了,后端返回502,然后Nginx给前端重定向到自定义的404页面。
仔细一观察发现PING解析的IP和Nginx日志解析的IP不同。因为我们这里代理是通过域名,所以后端IP不可控,怀疑是Nginx缓存了DNS解析,后端变化而Nginx没有更新所导致,顾首先重启一下Nginx服务。

重新访问并查看日志

总结

这种问题通常发生在Nginx代理使用代理到域名的情况下发生,尤其是代理到一个第三方的地方,它的域名解析出来的IP可能会更换(出于安全考虑),而Nginx本身有DNS缓存机制,默认你可以不配置,这样它缓存DNS解析的时长就是它通过查询DNS服务器获得记录的TTL时间。

DNS缓存时长

DNS缓存有操作系统级别也有应用程序级别,OS级别都有生存时间,时间到了就会刷新缓存(有时候根据需要我们也会强刷)。所以你有时候需要配置。默认情况下Nginx的resolver 没有配置,也没有设置valid时间,那么Nginx缓存这条解析的时长就是它首次查询DNS时从DNS服务器响应中获得的,得到之后这段时间就不会再查询,当过期之后它再查询得到结果再缓存,所以如果一条DNS记录解析在Nginx缓存这个周期内变更,虽然你在系统上PING看到的新的IP,但是Nginx由于缓存时长没有过期所以它还会用老的IP。

比如在应用程序级别:以谷歌浏览器为例,它有一个DNS缓存机制为例加快连接速度。

chrome://net-internals/#dns

作者:昀溪