运维遇坑记录-Nginx缓存了DNS解析造成后端不通
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;
}
}