Amazon EC2 Elastic Load BalancingにSSLを使った場合のnginxのSSL判別

久々に技術ネタです。

EC2のElastic Load Balancing便利ですねー。とっても便利です。

何が便利かってSSLをロードバランサーに設定出来るんですね。なので、いちいちインスタンス側に設定しなくてもすみます。

具体的にはまず80番ポートだけでELBを作ります。このあたりはググればすぐ出てくるので割愛します。

次にSSLの設定を行うんですが、CSRの生成とかもよくある話なので飛ばします。

EC2マネージメントコンソールのLoad Balancersから対象のロードバランサーを選択後ListenerからSSLの設定を行います。

  1. Load Balancer ProtocolにHTTPS(Secure HTTP)を選びます
  2. Load Balancer Portは443のまま
  3. Instance ProtocolはHTTPでInstance Portは80番のままでOKです
  4. Cipherは必要に応じて設定してください
  5. そしてSSL Certificateに鍵を設定します

最初はSSL証明書やキーファイルなどをアップロードしてください。

これだけでSSLの設定完了です。

あとはWebサーバー側のnginxの設定を変えるのみです。

問題点としてELBでSSLを設定してしまうとnginx側ではhttpsもhttpも同じ80番で入ってきてSSLかどうかが区別できなくなります。今までは80番と443番でリダイレクトの挙動を変えていた場合はつらいですね。

どうやって解決するかというとELBにSSLを設定してポートフォワードした場合環境変数に

「X-Forwarded-Proto」がセットされます。

nginx側では$http_x_forwarded_protoで取得できるので

例えばトップページはSSLにしたくない場合だと


location = / {
if ($http_x_forwarded_proto = "https") {
rewrite ^(.*) http://$server_name$1
break;
}
proxy_pass http://backend/;
}

こんな感じで書けばOKです。

簡単でしょ?

ぜひみなさんもEC2をお使いの際はELBをお使いください

 


About the author

Ruby on Rails専門のクラウドソーシング「StartupLabo」を運営する株式会社StartupTechnology代表。 ネタ系Webサービス「シャチクのミカタ」、「告白の行方」なんかも作ってたりしてます。 http://startup-technology.com