一     问题背景

①    问题一

+++++++++++++++++"分割线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的握手过程

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐