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>
エスケープしつつ改行をbrタグに置き換え
Rails 3の場合は以下のヘルパを作成する
def br str html_escape(str).gsub(/\n/, "<br>").html_safe end
Rails3のビューでは普通に出力すると自動的にエスケープされるが、html_safeで安全とマークされた文字列はエスケープされない
rails/tips.1319730076.txt.gz · 最終更新:  by nullpon