zoukankan      html  css  js  c++  java
  • 由Nginx的DNS缓存导致的访问404

     

     

    现象

    访问某个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

  • 相关阅读:
    python的多线程
    python的socket解析
    python的os.system函数的应用
    自动化测试的4种模型
    测试中的一些常见名词解析
    mysql存储过程详解
    mysql时间加减函数
    十周课程总结
    实验&报告7
    实验& 报告7
  • 原文地址:https://www.cnblogs.com/rexcheny/p/9381879.html
Copyright © 2011-2022 走看看