ユーザ用ツール

サイト用ツール


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