关于nginx的名称解析
关于nginx的名称解析,出现了“哎呀”的行为,所以做了笔记。
另外,如果你google一下,会发现有相似的文章,可能有些人已经知道了。
nginx会在忽略TTL的情况下缓存DNS记录,直到重启或更新配置。
在Nginx官方博客中也有提到。
使用NGINX和NGINX Plus进行服务发现的方法是通过DNS。
NGINX会将DNS记录缓存直到下一次重启或配置重新加载,并忽略记录的TTL值。
只有当设置连接从nginx到应用程序服务器时,以主机名方式访问时可能会出现问题。
我将提供更多具体例子。
-
- nginx から application server へ example.com というホスト名で接続する
-
- example.com で名前解決をすると複数の Priavte IP が返却される(例えば複数のサーバーで冗長構成されている)
-
- この状態で一つのサーバーが何らかの原因で応答不能となる
-
- 上記により example.com で名前解決をした時の PrivateIP から応答不能になったサーバーがなくなる(A レコードが削除される)
- nginx は最初に名前解決をした結果をキャッシュする為、接続できない PrivateIP に接続してしまうが、当然応答が得られない
可能有类似的情节。虽然我希望你看一下TTL,但NGINX却没有留意到。
你打算怎么办?
在上述的博客中有几种方法。在我的情况下,由于我使用了proxy_pass,所以我可以确认即使在像上面的示例中也可以继续连接使用resolver和set指令的方法。在这种情况下,TTL过期后将进行名称解析。
从博客摘录
在使用一个变量来指定proxy_pass指令中的域名时,NGINX会在其TTL过期时重新解析该域名。你必须包括resolver指令来明确指定名称服务器(NGINX不像前两种方法那样参考/etc/resolv.conf)。
# 公式ブログより抜粋
resolver 10.0.0.2 valid=10s;
server {
location / {
set $backend_servers backends.example.com;
proxy_pass http://$backend_servers:8080;
}
}
在resolver指令中指定valid后,似乎会忽略TTL,并按照指定的频率进行名称解析。
从博客中提取摘要
通过将有效的参数包含到解析器指令中,您可以告诉NGINX忽略TTL并按指定频率重新解析名称。这里我们告诉NGINX每10秒重新解析一次名称。
由于我自己的情况下已经设置了TTL,所以我决定不设置valid。
我参考了一篇文章。
-
- Nginxの名前解決についてまとめ
- nginx の proxy_pass の闇