Nginx のDNS 名前解決とS3 やELB へのリバースプロキシ
Nginx をフロントに立てて、バックエンドをごにょごにょするといろいろ捗ると思います。 ただ、バックエンドがAWS のようにAuto Scaling が働く場合、IP アドレスが変わってトラブルになることがあります。
リバースプロキシの設定
proxy_pass
にURI 指定すると、リクエストを転送処理できます。 必要に応じて proxy_set_header
, proxy_hide_header
を指定する事で、転送先サーバーにリクエストヘッダーを送信できます。
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://proxy.example.com;
}
}
Nginx 内部の名前解決
デフォルトの挙動として、Nginx は起動時に名前解決を行いIP アドレスをキャッシュします。 AWS のELB やS3 などのエンドポイントのように、一定期間でIP アドレスが動的に変更される場合は問題が発生します。 サーバーをIP アドレスで指定している場合、サーバーネームのIP が変更されない場合は特に問題ありません。
resolver
にDNS を指定することで定期的に名前解決を行ってくれます。 また、デフォルトではDNS のTTL の時間だけキャッシュしてくれるようです。 valid
を指定することでキャッシュ時間をNginx 側で制御できます。
server {
listen 80;
server_name example.com;
location / {
resolver 8.8.8.8;
proxy_pass http://proxy.example.com;
}
}
cf. resolver ディレクティブ
S3 やELB へのリバースプロキシ
VPC 内のインスタンスであれば、AWS が自動的に割当てたDNS サーバーを利用することできます。 IP アドレスは、VPC ネットワーク範囲のベースに「プラス 2」した IP アドレスです。 VPC の CIDR 範囲が 10.0.0.0/16
である場合、DNS サーバーの IP アドレスは 10.0.0.2
です。
server {
listen 80;
server_name example.com;
location / {
resolver 10.0.0.2 valid=5s;
proxy_pass http://proxy.example.com;
}
}
逆にDNS への問い合わせが不要なら resolver
は指定せずにNginx のキャッシュ任せ or IP アドレス指定にすると良いと思います。