DNS缓存失效,nginx死循环访问造成连接数瞬间飚高的问题

news2024/11/25 6:55:25

0.背景介绍

       某服务domain.com.cn 之前DNS解析到服务真实地址10.1.1.11,后面需要对用户登录增加黑名单功能,于是在openresty针对服务domain.com.cn的特性完成了黑名单功能。黑名单功能已经上线几个月,但是DNS从服务真实地址10.1.1.11切换到openresty10.1.4.2 一直遇到些问题,直到半个多月前才已经完成DNS切换,openresty lua脚本运行半个多月都没有问题。直到某一天执行了openresty -s reload,发生了一个生产小事故。

1.网络架构

        client------>F5(domain.com.cn DNS解析至F5)------>openresty(宿主机:docker容器,openresty部署在docker容器中)

2.事故描述

        openresty上面部署了黑名单lua脚本,脚本里面有根据cookie解析用户名称的代码,有些老外用户名称比较特殊,解析失败,前期没有记录详细的日志,这次在lua脚本中加了日志,在docker容器中执行bin/openresty -s reload。事故出现了,浏览器访问域名(http://domain.com.cn),显示502bad getway。

3.分析过程

        只是重新reload了一下,服务怎么不可用了,telnet 服务ip 端口是通的,问题很有可能出现在openresty网关上面。查看nginx的error日志,并没有发现lua脚本的错误,全都是下面这些报错。

2023/04/18 15:19:28 [crit] 786#0: *100069488 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:30 [crit] 786#0: *100069620 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:30 [crit] 788#0: *100069623 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:32 [crit] 787#0: *100070474 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:32 [crit] 788#0: *100070476 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:32 [crit] 789#0: *100070478 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:43 [crit] 788#0: *100075175 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:43 [crit] 787#0: *100075176 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:45 [crit] 788#0: *100076749 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:48 [crit] 787#0: *100077950 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:48 [crit] 786#0: *100078001 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:50 [crit] 789#0: *100078390 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 
2023/04/18 15:19:50 [crit] 788#0: *100078392 connect() to 10.1.1.21:8888 failed (99: Cannot assign requested address) while connecting to upstream, client: 10.1.1.29, server: vip.sdns.cn, 

在openresty的宿主机执行命令:netstat -ae | wc -l

发现达到了5w+,此时联系网络同事,他也反馈了同样的问题:连接数暴增,如下图。

出现这么多暴增的连接,首先想到的就是死循环访问的问题。

排查宿主机hosts文件,发现运维同事配置了本地解析地址:10.1.1.11 domain.com.cn

10.1.1.11是服务的真实地址,并且nginx的反向代理配置为:proxy_pass http://domain.com.cn;

如果domain.com.cn没有正确解析到服务真实地址10.1.1.11,而是F5地址10.1.1.21,那就刚好构成死循环访问了。于是立刻在docker容器中ping domain.com.cn发现却是10.1.1.21,于是定位到问题。

问题的原因在于:

①openresty宿主机10.1.4.2 设置了hosts文件:10.1.1.11 domain.com.cn,

domain.com.cn这个域名 dns解析到f5:10.1.1.21 , f5又会转发到10.1.4.2,这是构成死循环的前提条件。

②宿主机的hosts文件设置内容并没有同步到docker容器中,这个是通过在docker容器执行openresty -s reload 命令触发了dns缓存更新,看下图:

③至于说DNS切换F5(F5再转发到openrestry)已经上线半个多月为啥没问题,因为,openresty黑名单代码已经跑了很久了长达几个月,上次openresty容器 里面执行reload命令的时候,dns服务器解析还没有切换f5。

4.后续优化

 ①DNS直接解析到openresty,省去F5这一层,两台ng配置Keepalive。

②proxy_pass 域名;使用动态DNS解析,即

http {
	server {
			listen 80;
			set   $domain  doamin.com.cn;					

			location / {
					resolver 8.8.8.8 valid=600s;
					proxy_pass http://$domain;
			}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring MVC 参数解析(13)

目录 简介 调用流程 1. 首先,还是需要进行到前端控制器的doDispatch方法,这是我们的调用Spring MVC的核心入口方法 2. 在doDispatch方法内部,我们调用到了HandlerAdapter.handle(*****) 方法 3. 最终,我们会来到 RequestMappi…

完美解决丨2. `TypeError: list indices must be integers or slices, not str`

‘tuple’ object does not support item assignment 原因: tuple 是一个元素不可变的列表,如果尝试对 tuple 中的某个元素进行修改,会报错。 解决办法: 需要将 tuple 转换为 list,然后再把 list 转换为 tuple。 示例…

最长公共上升子序列LCIS

最长公共上升子序列LCIS 题目链接: acwing272. 最长公共上升子序列 题目描述: 输入输出: 题解: 首先考虑 最长上升子序列和 最长公共子序列问题 最长上升子序列的状态表示与状态转移如下: 状态表示: 用f[i],来表示以A[i]结尾的A[1~i]最长上升子序列的长度(注意,该上…

WPF教程(三)--事件Event调用

1、WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序才停止运行。 ShutDown 是隐式或显式发生,可以通过指定 ShutdownMode 的属性值来进行设置。 对ShutdownMode选项的更改,可以直接在App.xaml中更改&a…

coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)

目录 1 生产者 数据源 1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据 1.2 match-server接收 前端发给Exchange-server的数据 2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性 3.Order转成 OrderEvent 4. 分配序号发布…

【初学ROS,年轻人的第一个Node节点】

【初学ROS,年轻人的第一个Node节点】 1. 工作空间设置2. 创建Package3. 回访依赖包4. 创建Node节点5. 源码编译6. 运行Node节点7. Node节点完善8. 总结 本教程是B站阿杰视频的笔记 视频地址:https://www.bilibili.com/video/BV1nG411V7HW 超声波传感器 …

界面组件DevExtreme v22.2新版亮点 - 各UI组件增强升级

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

geometric distribution and exponential distribution(几何分布和指数分布)

几何分布 分布函数均值和方差意义 表示经过k次实验才第一次得到正确的实验结果 比如抛硬币得到正面的需要抛的次数 指数分布 分布函数均值和方差意义 表示经过一段x之后,某件事第一次发生 比如经过x时间之后,公交车来的概率 比如餐厅从开业到第一个客人…

基于ArcGIS 服务获取气象栅格某点位值及数据更新

1. 背景 假如有很多气象数据,不想通过后台脚本去获取数据,想通过前台服务的rest接口去识别,并且这些栅格数据可能是需要更新变化的,以下对一些技术方法做一个简单的介绍。 需求概述: 点击某一个点,获取影…

设计模式 --- 概述

一、设计模式概述 1.1、软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任 克里斯托夫亚历山大 (Christopher Alexander&…

c/c++:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式

c/c:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知…

WPF教程(十一)---数据绑定(4)--数据类绑定

一、排序 如果想以特定的方式对数据进行排序,可以绑定到 CollectionViewSource,而不是直接绑定到 ObjectDataProvider。CollectionViewSource 则会成为数据源,并充当截取 ObjectDataProvider 中的数据的媒介,并提供排序、分组和筛…

PMP项目管理-[第六章]进度管理

进度管理知识体系: 规划进度管理: 定义活动: 排列活动顺序: 估算活动持续时间: 制定进度计划: 6.1 规划进度管理 定义:为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档的过程 作…

docker简单教程(三)常用操作

docker简单教程(三)常用操作 文章目录 docker简单教程(三)常用操作1:查看所有容器列表:docker ps -a2:查看正在运行的容器列表:docker ps3:运行容器:docker r…

内网渗透之横向移动wmismb密码喷射CrackMapExec

0x01 横向移动之wmi wmi可以通过hash或明文进行验证,不会在系统日志中留下痕迹,使用139端口 复现环境: god.org win2008 dc win2012sql win2008 web 准备: cs上线 win2008web 提权利用ms14-058 抓取hash和明文密码(当获取到其他…

重磅发布,时隔两月——复旦大学MOSS最新0.0.3版本发布

今天中午吃饭的时候无意间看到一则新闻说的就是复旦大学开发的MOSS也就是国产版的类chatGPT对话模型已经发布了最新版本0。0.3,目前公测期间是完全开源免费的,还是可以上手体验一下的。 官方的博客介绍在这里,首页如下所示: 如果…

手机端无线投屏技术及方案推荐

目前主流的无线投屏技术主要又DLNA,Miracast,Airplay。 对协议的描述引用知乎作者的文章,原文:AirPlay、Miracast 、DLNA三大协议对比 - 知乎 (zhihu.com) 【DLNA】 DNLA,Digital Living Network Alliance&#xff…

光照的个人推导过程与GL实现

目录 1、前提知识 1.1、GL的绘图过程: 1.2、点积的规则和作用: 1.3、normalize在方向处理上的作用 2、光照控制的理论基础 2.1、自由的实现: 2.2、带有方向性的光——基于dot product的实现 最终效果演示如下: 3、关键代…

可能是史上最详细的MySQL用户和权限原理和实战

前言 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系…

Python - Jupyter - 远程连接Jupyter内核

Python - Jupyter - 远程连接Jupyter内核 前言 假设你有一台高性能服务器(电脑B),并且在上面安装好了Jupyter 现在你想使用你自己常用的电脑(电脑A)编码,但使用电脑B的计算资源。 怎么办呢?…