rails:tips
Rails開発、小ネタ
request.domain
サーバ名は、ENV[“SERVER_NAME”]やENV[“HTTP_HOST”]ではなく、request.domainで取得する。
リバースプロキシを使った構成の場合、railsは外部にどういったドメインでアプリケーションが公開されているか分からない。このため、リバースプロキシでX_FORWARDED_HOSTヘッダに公開されているドメインをセットし、railsに公開度メインを伝える。
request.domainは、X_FORWARDED_HOSTヘッダがあればその値を返し、無ければ自分のホスト名を返すので、サーバ構成がどうあっても同一のコードで外部に公開されているドメインを取得できる。
request.remote_ip
クライアントホストの取得にはrequest.remote_ipを使う。リバースプロキシを使う場合はX_FORWARDED_FORを設定する。
mod_proxy + mod_ssl → mongrel
ApacheでSSL処理を行う場合 X_FORWARDED_PROTOヘッダをセットするとリダイレクトのLocationヘッダがhttpsで返るようになる。
<Proxy /hoge> RequestHeader set X_FORWARDED_PROTO 'https' </Proxy>
バランサを使う場合の設定まとめ
セッションストアは個々のサーバ上に保存しないもの(Cookie、ActiveRecord、MemCache、Drb)を使おう。
apacheのconfigは…
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
# リバースプロキシを使います。
ProxyRequests Off
# / へアクセスしたときに balancer://rails_cluster/ へ
ProxyPass / balancer://rails_cluster/ nofailover=On timeout=2
# プロキシの設定
<Proxy balancer://rails_cluster/>
RequestHeader set X_FORWARDED_HOST 'yourhost.example.com' # リバースプロキシの外向きのホスト名
RequestHeader set X_FORWARDED_FOR %{REMOTE_ADDR}e # クライアントのIPアドレスを通知
RequestHeader set X_FORWARDED_PROTO 'https' # リバースプロキシがSSL処理する場合に必要
BalancerMember http://192.168.1.2:3000/
BalancerMember http://192.168.1.3:3000/
BalancerMember http://192.168.1.4:3000/
</Proxy>
rails/tips.txt · 最終更新: by nullpon