Nginx(二十三)nginx的dns缓存问题
一问题的背景
①问题一
"分割线1"1.同事1:晚上做'nginx正向代理'变更要出公网,变更前检测域名'无法解析'2.根因:同事0'白天做变更'的时候,不小心把'/etc/resolv.conf'中的ip由'公网ip'修改为'内网ip',但是当时'不感知';ps:/etc/resolv.conf修改为'内网'只是影响解析,'不影响'网络的连通性['通过ip定位的']3.当时感到奇怪:'nginx'服务配置的'公网域名'竟然还能'正常'解析,'对外'提供服务②问题二
"分割线2"1.操作:同事修改nginx对应server块的'server_name'对应的'DNS'解析记录2.预期:只需要'更改'DNS解析到'新的ip'就能'完成'切换,压根'不需要'对nginx服务进行操作3.现象:更改DNS解析后,走nginx怎么'也访问不了'后端,而在nginx机器上直接'curl后端'是没有问题的.细节点:发现'被hang住'error.log报错:[error]20472#0:*455027upstreamtimedout(110:Connectiontimedout)whileconnectingtoupstreamCDN问题
二根因
①官网给的解读
'细节点':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方式
细节点:修改'proxy_pass'后,'reload'没有生效-->观察:'ps-ef|grepnginx'进程'启动时间'
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辅助参考
noresolverdefined报错
二告警指标补充
增加一个'告警'指标:检测nginx某些proxy_pass的'对应域名[非变量]'的初始解析值与'后续探测值','定时检测'是否发生变化思考:nginx-t-->能检验哪些问题?-->'证书问题?'三参考连接
Nginx代理域名地址时的DNS缓存问题
nginx的dns缓存问题
Nginx缓存了DNS解析造成后端不通
参考博客
最佳实践
https的握手过程