クラウド上の LB + SSL アクセラレーター + unicorn + Rails で HTTPS オンリーなアプリケーションを提供するための設定


下記のシンプルな構成を実現したかった。

  • クラウド上の LB はグローバル IP を持ち HTTPS:443 のみ LISTEN
  • LB の SSL アクセラレーターで SSL リクエストをターミネート
  • バックエンドの unicorn + rails アプリには平文のリクエストがプロキシされる

んだけど、検索すると nginx で HTTP_X_FORWARDED_PROTO=https を設定しろ、という情報ばかりでハマりまくってしまった。
いろいろ調べまくったせいでどこのサイトで見つけた記述か失念しまったけど、最終的には unicorn.conf.rb に下記を記述するとよいことが分かった。

# for serving https only application
HttpRequest::DEFAULTS["rack.url_scheme"] = "https"
HttpRequest::DEFAULTS["HTTPS"] = "on"
HttpRequest::DEFAULTS["HTTP_X_FORWARDED_PROTO"] = "https"

参考資料