Nginx 代理的 DNS 缓存问题
问题背景
我们有大量使用 Nginx 作为反向代理的场景,为了尽量不去修改固化的配置,通常在配置中使用域名而非硬编码 IP。
1 | server { |
本来以为这样就可以万无一失,直到发现待裁撤的机器还一直被调用的情况。
问题原因
通过一番调研,发现这其实是 Nginx 的一个特性(或者说 Bug):Nginx 在启动时,会对域名做 DNS 解析操作并缓存,直到下一次重启或配置重载。
解决办法
这个问题的原因和解决办法,在 Nginx 官方文章中均有提到:Using DNS for Service Discovery with NGINX and NGINX Plus。
不过,文中提到的解决办法仅限于商业版本的 Nginx(即 Nginx Plus)。对于开源版本的 Nginx,就还是老实使用 nginx -s reload
重载配置吧。
对于无法登录机器执行命令的环境,建议开发配套的脚本下发/执行的工具和平台,或者增加 cron 脚本定时重载 Nginx 配置。