ALBを使ってバランシングをする
クライアントのリクエストは一旦ALBで引き受けて、その後はALBにwebサーバーとのやり取りを任せます。この時ALBに元々付いている無料SSLの設定をしており、webサーバー側にはhttps接続のために Apache HTTP Server の mod_sslを利用しているので、httpsでの接続が必須になります。しかし、ALBとwebサーバーのやり取りは、httpで行われるという制約があります。ではどうしようか・・・
解決策
クライアント側のhttpsリクエストをwebサーバー側で検知させる
必要なディレクティブ
リクエストのある側面が指定された正規表現 に合うかどうかによって環境変数を設定する機能のApacheモジュールmod_setenvifを使用して使えるようになるディレクティブです。
リクエストの属性に基づいて環境変数を設定する
このディレクティブに使える引数は、
1.HTTP リクエストヘッダフィールド
2.以下のリクエストの一部分のどれか:
Remote_Host - リクエストを行なっているクライアントのホスト名 (もしあれば)
Remote_Addr - リクエストを行なっているクライアントの IP アドレス
Server_Addr - リクエストを受け取ったサーバの IP アドレス (2.0.43 以降のみ)
Request_Method - 使用されているメソッド名 (GET, POST など)
Request_Protocol - リクエストが行なわれたプロトコルの名前とバージョン (例えば、"HTTP/0.9", "HTTP/1.1" など。)
Request_URI - URL のスキームとホストの後の部分
3.リクエストと関連付けられる環境変数のリスト。
必要なヘッダー
- X-Forwarded-Proto
X-Forwarded-Proto (XFP) ヘッダーは、プロキシまたはロードバランサーへ接続するのに使っていたクライアントのプロトコル (HTTP または HTTPS) を特定するために事実上の標準となっているヘッダーです。
この2つを用いて、検知させる仕組みを作ります。自分でも作業しててたった1行でできたので、驚いたものです。
実際にconfに書いたもの
SetEnvIf X-Forwarded-Proto ^https$ HTTPS=on
になります。リクエストヘッダにX-Forwarded-Protoを使い、正規表現にはhttpsが引っかかるようにして、関連づけられる環境変数はHTTPS=onです。