Apache(SSL) + mod_proxy_balancerのバックエンドでRailsアプリケーションを動かす場合の注意点

SSL(HTTPS)の使用が前提のもと、フロントエンドでApache(mod_ssl + mod_proxy_balancer)をリバースプロキシ(兼ロードバランサ)として動かして、そのバックエンドでlighttpdやmongrelを使ってRailsアプリを動かす場合のメモ。


何も考えずにRailsアプリに対してHTTPS接続を行い、アプリ内でリダイレクト(redirect_to)を行った場合、RailsアプリはHTTPSで接続されていることを知らないため、HTTPのURLへリダイレクトしてしまいます。

これを解決するためには、フロントエンドのApacheで、HTTPリクエストヘッダにHTTPS接続であることを指定することで、バックエンドのアプリに伝わるようにします。
# ↓のリンク先を参考にさせていただきましたm(_"_)m


これに必要なのは、Apacheでmod_headersが組み込まれている必要があります。
追加で組み込む場合の詳細については、Google先生に聞くと教えてもらえると思いますが、簡単には↓のような感じ。

$ cd ${APACHE2.2_SRC}/modules/metadata/
$ sudo apxs -c -i -a mod_headers.c

${APACHE2.2_SRC}は、Apache2.2のソース(httpd-2.2.x.tar.gz)を展開したディレクトリ


で、Apacheの設定ファイルで、以下のように「RequestHeader set X_FORWARDED_PROTO 'https'」を追記してやればOKです。

ProxyPass / balancer://rails_app/
ProxyPassReverse / balancer://rails_app/
<Proxy balancer://rails_app/>
    RequestHeader set X_FORWARDED_PROTO 'https'
    BalancerMember http://192.168.1.1:3000
</Proxy>

これで、HTTPS使用時にアプリ側でリダイレクトが発生する場合でも、リダイレクト先がHTTPSとなるようになりました!
# Thanks! id:kuranuki & ふくださん