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

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

nginx から ELB などの IP アドレスが変化するバックエンドへプロキシする際に、DNS レコードを更新するための設定方法を解説します。

Takahiro Iwasa
3 min read

nginx から AWS Elastic Load Balancer(ELB)などの IP アドレスが変化するサービスへプロキシする場合は、DNS の名前解決を適切に設定する必要があります。設定しないと、nginx が古い IP アドレスへトラフィックを送り続ける可能性があります。

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

Elastic Load Balancer は、同じ DNS 名に対して異なる IP アドレスを返すことがあります。proxy_pass にホスト名を直接記述すると、nginx は設定の読み込み時に名前解決を行い、DNS レコードの TTL に従って自動更新しません。

以下の nginx.conf では ELB のアドレス変更が考慮されていないため、起動時またはリロード時に解決したアドレスを使い続ける可能性があります。

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 の名前解決を行う設定

短い有効期間を指定した DNS リゾルバーを定義し、アップストリームのホスト名を変数経由で proxy_pass に渡します。これにより、nginx が実行時に名前解決を行います。

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

まとめ

proxy_pass で変数を使用し、resolver ディレクティブを設定すると、nginx は実行時に ELB の IP アドレスを更新できます。

resolver 192.168.0.2 valid=60s; は VPC の DNS サーバーを指定し、応答を 60 秒間キャッシュします。ホスト名を $backend に代入することで、proxy_pass は設定の読み込み時に取得したアドレスだけに依存せず、このリゾルバーを使用します。

同じ設定は、DNS 名の解決先 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.