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 · 最終更新: 2011/10/27 15:43 by nullpon