现象

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

由Nginx的DNS缓存导致的访问404的更多相关文章

  1. 解决vuejs应用在nginx非根目录下部署时访问404的问题

    以往部署vuejs应用都是直接在nginx的location为/下直接部署,这次遇到要将vue应用部署在/vuejs-admin的非根下,使用以往部署方案直接访问就会404,这时修改步骤如下: 1.修 ...

  2. 清理工具CleanMyMac如何帮助用户清空DNS缓存

    什么是DNS缓存?这个缓存有什么危害?相信大家平时使用浏览器时,有时候会遇到一个很奇怪的问题,就是Mac打开许多网站如百度网站,都是可以访问的,但是在打开某个特定网站时,却发现浏览器提示检测不到网络连 ...

  3. Chrome清除dns缓存

    Chrome清除dns缓存 为了加快访问速度,Google Chrome浏览器采用了预提DNS记录,在本地建立DNS缓存的方法,加快网站的连接速度.你在谷歌Chrome浏览器的地址栏中输入about: ...

  4. nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录

    在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...

  5. 一次dns缓存引发的惨案

    时间2015年的某个周六凌晨5点,公司官方的QQ群有用户反馈官网打不开了,但有的用户反馈可以打开,客服爬起来自己用电脑试了一下没有问题,就给客户反馈说,可能是自己网络的问题,请过会在试试.早点8点,越 ...

  6. Nginx - 代理、缓存

    Nginx 标签 : nginx 代理 代理服务可简单的分为正向代理和反向代理: 正向代理: 用于代理内部网络对Internet的连接请求(如VPN/NAT),客户端指定代理服务器,并将本来要直接发送 ...

  7. 清理dns缓存

    dns缓存是什么? DNS缓存指DNS返回了正确的IP之后,系统就会将这个结果临时储存起来.并且它会为缓存设定一个失效时间 (例如N小时),在这N小时之内,当你再次访问这个网站时,系统就会直接从你电脑 ...

  8. 某些浏览器具有dns缓存功能,大家更改域名指向,建议清理下浏览器缓存

    最近遇到一个很郁闷的问题,在我们的的ngnix服务器上原来默认的网址需要更改.更改后,重启了ngnix.可是在客户端使用360浏览器打开网址.地址还是指向旧地址.直接输入服务器 IP地址转向了新地址, ...

  9. dns缓存刷新时间是多久?dns本地缓存时间介绍

    原文: http://www.winwin7.com/JC/4742.html dns缓存刷新时间是多久?一般来说,我们只知道DNS解析是互联网绝大多数应用的实际寻址方式,在我们打开某站点,DNS返回 ...

随机推荐

  1. jquery只获取自身文本节点,不获取子元素的

    jQuery.text()方法时候,会把子元素的文本也获取到,以下方法可获取自身文本节点,不包括子元素 <div id="demo">只获取我<a href=&q ...

  2. [Linux] 使用Yum在CentOS上安装MySQL

    跟随官网上的安装教程:https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html官网上还有一个QuickGuide ...

  3. S2.1 修复图像小程序(简单版)

    用OpenCV自带的inpaint()演示 CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask, OutputArray ...

  4. sql server 关于日期格式转换查询备注

    select GETDATE()--2016-01-08 16:15:05.787select convert(varchar,getdate(),11)--16/01/08select conver ...

  5. 几个VB常见又内涵的错误

    第一位内涵的就是:没有对象 找到对象,却发现是别人的对象 不能加载也不能卸载...这到底是什么对象 哈哈哈~

  6. SpringBoot+ Mybatis 搭建

    spring boot+mybatis整合   LZ今天自己搭建了下Spring boot+Mybatis,比原来的Spring+SpringMVC+Mybatis简单好多.其实只用Spring bo ...

  7. Go语言基础之包

    Go语言基础之包 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的.本文介绍了Go语言中如何定义包.如何导出包的内容及如何导入其他包. Go语言的包(packag ...

  8. postgrel执行VACUUM报VACUUM cannot run inside a transaction block

    在python脚本里执行: sql_gp1 = "VACUUM dwd_access_record_inout_temp" sql_gp2 = "delete from ...

  9. java中int和integer

  10. 浅谈开发中python通过os模块存储数据

    #其实本人很烦发博客,但为了面试还是发一下好,证明一下自己的能力 前言 首先说一下适用环境,在开发中我们有一些经常用到的数据(数据量大)需要存储起来. 存sql嘛又不合适,要知道在开发中每条sql语句 ...