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

EC2

久々に技術ネタです。

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にしたくない場合だと

[sourcecode]

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

[/sourcecode]

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

簡単でしょ?

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

 

コメント