Nginx(二十三)nginx的dns缓存问题

您所在的位置:网站首页 linux设置dns缓存时间 Nginx(二十三)nginx的dns缓存问题

Nginx(二十三)nginx的dns缓存问题

2024-07-14 04:11| 来源: 网络整理| 查看: 265

一     问题背景

①    问题一

+++++++++++++++++"分割线1"+++++++++++++++++ 1. 同事1:晚上做'nginx正向代理'变更要出公网,变更前'检测'公网域名'无法解析' 2. 根因: 1) 同事0'白天做变更'的时候 --> '错误的认为变更级别低,风险小,而批量进行变更' 2) 不小心把'/etc/resolv.conf'中的ip由'公网ip'修改为'内网ip' --> '操作' 3) 但是当时'不感知' --> '没有考虑影响面' ps: /etc/resolv.conf修改为'内网'只是影响解析,'不影响'网络的连通性['通过ip定位的'] 3. 当时感到奇怪:'nginx'服务配置的'公网域名'竟然还能'正常'解析,'对外'提供服务

②    问题二

+++++++++++++++++"分割线2"+++++++++++++++++ 1. 操作:同事修改nginx 对应server块的'server_name'对应的'DNS'解析记录 2. 预期:只需要'更改' DNS 解析到'新的 ip' 就能'完成'切换,压根'不需要'对nginx服务进行操作 3. 现象: 1) 更改 DNS 解析后 --> "操作" 2) 通过 nginx转发后 怎么'也访问不了'后端 --> "现象" 3) 而在 nginx 机器上直接 'curl 后端'是没有问题的 --> "对比" 细节点: 发现'被 hang 住 (超时)',超时才'退出' 4. 排错的'观察'点 1) 通过'upstream_addr'或者'error.log'错误日志,可以看到解析的'ip' error.log'报错': upstream timed out (110: Connection timed out) while connecting to upstream 2) 强调:nginx'当前转发'请求使用的域名'解析值',而'不是'ping的域名解析

CDN问题

③  引申

场景: 利用'proxy_pass' 域名多个A记录 做'容灾',不管是'region'还是'az'级别 事项: 一定要通过'resolver 设置多个server'并通过'变量'形式保存域名,最后proxy_paas使用变量 优点: 避免'非变量'时nginx域名'解析值'常驻内存,failover故障切换时,nginx不'reload'无感知

二     根因

①    官网给的解读

'细节点':curl'手动'测试和nginx'代理转发测试'是完全'不同'的两个效果 备注:为了'避免'搭建dns服务器,可以通过'/etc/hosts'本地解析临时添加'域名和ip'

②    方式1:通过proxy_pass指令使用裸域名

思考:proxy_pass怎么能'区分后面'是'域名'还是'upstream_name'? 规则:先找是否有对应的'upstream_name',如果'无法识别'则尝试dns'解析' 特点:域名在'restart、start'时必须能'解析' -->不能解析,nginx'进程起不来' -- 细节点:如果'reload',进程'不会'报错,但是'error.log'会记录 附加:如果proxy_pass不涉及'域名',全都是ip,'不涉及本章'的问题了

1)reload方式 

细节点: 1) 修改'proxy_pass'后,'reload'没有生效 2) 观察:'ps -ef | grep nginx' 进程'启动时间'

reload不生效的原因 

2)restart方式

++++++++++++++ "必须restart场景" ++++++++++++++ 1. 需要'修改'limit_req参数,必须'restart'下nginx的进程,不然会因为'内存释放不了'导致不生效 背景: 添加nginx'透传源ip'的策略时 2. 缓存'清理'的问题,例如'proxy_pass'域名解析缓存问题

 ③  方式2:通过upstream组使用域名

 ④    方式3:proxy_pass使用变量

备注:这三种方式,算是'递进'关系 细节点:只要'proxy_pass'后边涉及'变量','可能变量包含域名、或者变量是url参数[但是涉及域名]',都是下面的'情况' 例外: set $forward "https://upstream_id"; proxy_pass ${forward}; -->"这种不涉及域名解析" 根因:使用 'resolver 语法'来解决 'DNS 缓存'的问题 补充:'不配置 valid 选项'时,V1.1.9 之后的 Nginx 默认会使用 'DNS 解析结果中'的 TTL

辅助参考 

no resolver defined报错

二   告警指标补充

增加一个'告警'指标: 定时检测nginx某些proxy_pass的'对应域名[非变量]'的初始解析值与'后续探测值',是否发生变化 思考:nginx -t -->能检验'哪些'问题? -->'证书问题?'

三   参考链接

 Nginx 代理域名地址时的 DNS 缓存问题

 nginx的dns缓存问题

 Nginx缓存了DNS解析造成后端不通

 参考博客

 最佳实践

 https的握手过程



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3