问题描述
当我们通过 nginx 配置代理访问一个静态域名时,其默认只会在启动时做 dns lookup 然后把域名映射的具体 IP 缓存下来,
从此之后,如果我们不做 restart 或者 reload,域名所映射的 IP 都是不会变的,哪怕这个 IP 已经失效。如下图所示:
proxy_pass https://open.feishu.cn;
我们最近通过 nginx 搭建代理访问飞书公共API服务的时候就被这个坑到了:飞书域名背后的 IP 是动态的,而且隔一段时间某些 IP 就会失效。这就导致我们的代理服务,隔一段时间就会访问飞书失败。直接阻塞了我们的服务。
解决办法
以变量的方式定义要转发的域名:
resolver 1.1.1.1 2.2.2.2
set $feishu "open.feishu.cn;"
proxy_pass https://$feishu;
当把代理域名设置成变量后,我们需要手动定义 resolver 即 dns 解析服务地址。
Linux 服务器上的 DNS 服务地址可以通过以下命令获取:
cat /etc/resolv.conf
resolver 配置多个 DNS 服务地址时,IP 用空格隔开。
More
通过变量的方式配置后,Nginx 也并不会每次访问都做 DNS lookup,默认是缓存 5min(该时间来源于论坛,并为实际验证)。
通过 resolver 配置内的 valid 可以自定义 DNS 缓存的超时时间(建议不要太短):
resolver 1.1.1.1 2.2.2.2 valid=3600s