当前位置:

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

访客 2024-02-04 1213 0

一问题的背景

问题一

  • "分割线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)whileconnectingtoupstream
  • CDN问题

    二根因

    ①官网给的解读

  • '细节点':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的握手过程

    发表评论

    • 评论列表
    还没有人评论,快来抢沙发吧~