ELB や動的 DNS バックエンド向けの nginx リゾルバー設定

ELB や動的 DNS バックエンド向けの nginx リゾルバー設定

nginx が ELB などの動的 DNS バックエンドの背後にある場合、古い IP アドレスを保持し続けないようにリゾルバー設定を行う方法。

Takahiro Iwasa
4 min read

AWS Elastic Load Balancer(ELB)のような、動的な IP アドレスに名前解決されるサービスを利用する場合、nginx が DNS キャッシュを適切に管理するよう設定することが重要です。これに対処しないと、nginx が古い IP を使い続けてしまい、問題が発生する可能性があります。

DNS キャッシュが重要な理由

Elastic Load Balancer は、同じ DNS 名に対してしばしば異なる IP アドレスを返すため、DNS キャッシュが問題になりやすいです。デフォルトでは、nginx は DNS の解決結果を無期限にキャッシュするため、古い IP へトラフィックを送り続けてしまうことがあります。

以下の nginx.conf は、DNS キャッシュを考慮していない標準的な設定例です。この設定は、ELB が IP アドレスを変更すると機能しなくなります。

nginx.conf
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://internal-xxx-alb-1234567890.ap-northeast-1.elb.amazonaws.com;
}

DNS キャッシュの TTL を短縮するための nginx 設定調整

これに対処するには、キャッシュ TTL を短縮した DNS リゾルバーを明示的に定義します。

nginx.conf
location / {
# Added to shorten cache TTL
resolver 192.168.0.2 valid=60s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://internal-xxx-alb-1234567890.ap-northeast-1.elb.amazonaws.com;
}
  • resolver:
    • DNS サーバーを指定します。
    • 各 VPC の DNS サーバーの IP アドレスは、VPC のネットワーク範囲のベースアドレスに 2 を加えたものです(例: 192.168.0.2)。
    • 詳細は公式ドキュメントを参照してください。
  • valid=60s:
    • キャッシュされた DNS レスポンスの TTL を 60 秒に制限し、nginx が頻繁に最新の IP を解決するようにします。

まとめ

短い TTL を指定した resolver ディレクティブを明示的に追加することで、ロードバランサーがアドレスをローテーションした後も nginx が古い ELB の IP へプロキシし続ける事態を防げます。これがなければ、nginx は proxy_pass 内のアップストリームホスト名を起動時またはリロード時に一度だけ解決し、その IP を無期限にキャッシュしてしまうため、ELB が変わった瞬間に静かに壊れます。resolver 192.168.0.2 valid=60s; — 常にネットワークのベースアドレスに 2 を加えたものになる VPC の DNS サーバーを指定する設定です — によって、nginx は 60 秒ごとに再解決するようになり、ELB が現在使用している IP に追従し続けます。この設定は ELB に限らず、動的な IP に解決される任意のアップストリームに対しても適用する価値があります。ホスト名の向こう側に何があっても、基盤となるキャッシュの挙動自体は変わらないためです。

About the author

Takahiro Iwasa

Takahiro Iwasa

Software Developer

This blog shares technical notes from hands-on projects—architecture, implementation, and AWS service integrations.