- HOME
- Blog
- Development
- NginxでS3をプロキシせざるを得ない時
NginxでS3をプロキシせざるを得ない時
S3から静的サイトを配信する場合、通常はS3の静的ホスティングを利用し直接配信するか、もしくはCloudFrontを組み合わせて配信するのが定石だと思います。しかしながら、諸般の事情により、一旦EC2上のNginxを経由して配信する必要が出てきましたので試してみました。ところが…
NginxでS3をproxy_passでプロキシしたが…
Nginxに以下のような設定を記述し、S3の静的サイトホスティングのアドレスをproxy_passでプロキシしてみました。しかし…
S3からNginx経由のページが表示されたりされなかったり…
この場合、指定したS3ホスティングのページが表示されたりされなかったりといった問題が起き、小一時間ほど解決に時間を費やすことになりました。最初はS3のバケットポリシーの設定が適切でないのではと疑っていましたが、どうやらその様子でもなさそうでした。
Nginxのproxy_passは起動時または設定リロード時しか名前解決をしてくれない?
Nginx公式のトピックによると
NGINX caches the DNS records until the next restart or configuration reload, ignoring the records’ TTL values.
参考: https://www.nginx.com/blog/dns-service-discovery-nginx-plus/
と記述があるとおり、NginxはDNSで指定されたTTLを無視し、起動時と設定リロード時のみURLのDNSの名前解決をおこなうため、再起動や設定リロードが行われない限りDNS名前解決が行われないようです。そのため、DNS情報が変更されても反映されず、アクセスできなくなるといったことが起きるようです。
常時DNSの名前解決をおこなうためにはresolverパラメータを指定
解決策としては、 proxy_passと一緒にresolverを指定すれば解決するようです。
resolverのDNSサーバーの指定ですが、基本的にはproxy_passのアドレスが解決できるIPアドレスなら大丈夫だと思いますが、EC2からのアクセスならAmazonがインターネットゲートウェイを介して通信するインスタンス向けに提供しているAmazon DNS サーバーが無難かと思われます。