1 问题现象

我们使用 Nginx 的时候,经常会用到 Proxy 功能,为了方便管理,后端站点或者服务一般用域名来表示。

在运维过程中,有一次后端需要切换,按理说,只需要更改 DNS 解析到新的 IP 就能完成切换,然后发现更改 DNS 解析后,走 Nginx 怎么也访问不了后端,而在 Nginx 机器上直接 curl 后端是没有问题的。

问题找了半天发现是 Nginx 会缓存 DNS 解析,需要重载 Nginx 才会刷新。

2 缓存问题的解决方案

2.1 每次更改 DNS 解析都重载 Nginx

重载 Nginx 一定会刷新缓存,这是最保险也是最麻烦的一种方案,如果体量小还可以接受,如果 Nginx 实例比较多就有些困难,除非有批量运维工具帮忙。

2.2 使用 Nginx 的 resolver

我们在使用 Nginx 过程中,有时需要根据 Url 传值动态选择 host 进行代理转发,这种模式下,一开始是不会去进行 DNS 解析的,只有请求的时候才会进行 DNS 解析,并且要设置 resolver 指定 DNS 服务器 IP。

这个时候,我们就可以使用 resolver 语法来解决 DNS 缓存的问题,比如说,我在原来的 Nginx 配置里指定 DNS IP,并设置缓存 60 秒。

server {
    listen 80;
    server_name duvvv.cn;

    resolver 223.5.5.5 valid=60s;
    resolver_timeout 3s;

    set $proxy_url "duvvv.cn";
    location / {
        proxy_set_header Host duvvv.cn;
        proxy_pass http://$proxy_url;
    }
}