Nginx 代理的 DNS 缓存问题

问题背景

我们有大量使用 Nginx 作为反向代理的场景,为了尽量不去修改固化的配置,通常在配置中使用域名而非硬编码 IP。

1
2
3
4
5
6
7
8
server {
listen 80;
server_name xxx.xxx.com;

location / {
proxy_pass http://x.x.xxx;
}
}

本来以为这样就可以万无一失,直到发现待裁撤的机器还一直被调用的情况。

问题原因

通过一番调研,发现这其实是 Nginx 的一个特性(或者说 Bug):Nginx 在启动时,会对域名做 DNS 解析操作并缓存,直到下一次重启或配置重载。

解决办法

这个问题的原因和解决办法,在 Nginx 官方文章中均有提到:Using DNS for Service Discovery with NGINX and NGINX Plus

不过,文中提到的解决办法仅限于商业版本的 Nginx(即 Nginx Plus)。对于开源版本的 Nginx,就还是老实使用 nginx -s reload 重载配置吧。

对于无法登录机器执行命令的环境,建议开发配套的脚本下发/执行的工具和平台,或者增加 cron 脚本定时重载 Nginx 配置。