AWS ELB の動的 IP に対応した nginx 設定方法
はじめに
AWS Elastic Load Balancer (ELB) や同様のサービスは、動的 IP アドレス に解決されるため、nginx の DNS キャッシュを適切に設定することが重要です。この問題を無視すると、nginx が古い IP を使い続けることになり、さまざまな問題が発生します。本記事では、nginx の DNS キャッシュの TTL を短縮する方法を解説します。
なぜ DNS キャッシュが重要か
Elastic Load Balancer は同じ DNS 名に対して異なる IP アドレスを返すことがあり、この場合 DNS キャッシュ は問題を引き起こします。nginx はデフォルトで DNS 解決を無期限にキャッシュするため、新しい IP に解決されても古い IP にトラフィックを送る可能性があります。
一般的な nginx 設定と DNS キャッシュの問題
以下の nginx.conf
は、DNS キャッシュを考慮しない標準的な設定例です。この設定では ELB の IP アドレスが変わると問題が発生します。
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;
}
この問題は、nginx が解決済みの IP を無期限に保持し、DNS が新しい IP を返しても更新されないことに起因します。
nginx 設定を調整して DNS キャッシュの TTL を短縮する
この問題を解決するには、DNS リゾルバ を明示的に定義し、キャッシュ TTL を短縮する必要があります。以下は修正後の nginx.conf
の例です。
location / {
# キャッシュ 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 (192.168.0.2
) を利用できます。- 各 VPC の DNS サーバーの IP アドレスは、VPC ネットワークのベースアドレス +2 になります。
valid=60s
: キャッシュされた DNS 応答の TTL を 60 秒に制限し、nginx が頻繁に新しい IP に解決するようにします。
まとめ
動的 IP を解決する AWS ELB などのロードバランサーを使用する場合、nginx の DNS キャッシュ TTL を短縮することは信頼性の高いパフォーマンスを実現するために重要です。この解決策では、短い TTL を持つ resolver
ディレクティブを使用し、nginx が常に最新の DNS レコードを取得するようにします。
本記事で紹介した手順を実行することで、一般的な問題を回避し、nginx とロードバランサー間のスムーズな統合を確保できます。
Happy Coding! 🚀