【Rails】Rails4&ページキャッシュでnginxから爆速応答させようぜ

【Rails】Rails4&ページキャッシュでnginxから爆速応答させようぜ


こんにちは。応援するとチームが必ず負ける@srockstyleでーす。楽天今日がんばってね! 技術ネタも書きたいので今日はRailsのページキャッシュのお話をします。

Railsアプリでキャッシュ、使ってますか?

実はページキャッシュはRails4本体から削除され、フラグメントキャッシュになりました。でもやっぱり静的に作成したいなあ、なんて要望もあるかもしれません。

まあそんなときは以下の設定をGemfileに書いちゃってください。このgemを使うとページキャッシュを復活させることができます。

gem 'actionpack-page_caching'

これでbundle installすればRails4でもページキャッシュが作成されます。作成先は設定によって変えられます。以下をapplication_controller.rbに書いちゃってください。

classApplicationController< ActionController::Base
   includeActionController::Caching::Pages
   self.page_cache_directory="#{Rails.root.to_s}/public/cache"
end

つぎにキャッシュ対象のコントローラで以下を設定します。

class BlogController < ApplicationController
   caches_page :index, :show
   # Rest of the file omitted.
 end

この場合Blogコントローラのindex、showアクションがキャッシュされ、/public/cache以下にhtmlファイルが作られます。あとはこのHTMLファイルをnginxで静的にレスポンスさせればいいだけです。

location / {
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_host;
     proxy_redirect off;
     try_files $uri /cache/$uri /cache/$uri.html proxy_path;
   }

nginx再起動しておわり。

これ、メリットとデメリットがあって、ちょっと注意が必要です。

メリット:

  1. 静的ファイルを返すのでnginxが大活躍
  2. 外部に依存する長い処理(APIたたくとか)を静的生成してくれるので待たなくてよい
  3. コントローラから返された値で生成したものを静的生成してくれるのでアクセスのたびにRailsを通さずにすむ

デメリット

  1. Railsを通さないのでパラメータによってビューを切り替えるみたいな処理ができない
  2. リンクにパラメータつけるときにユーザIDとかが固定になるので、ユーザによって処理をわけたいときなんかは向かない。
  3. キャッシュの削除が手動。(cronとかで自動化は可能)

みたいなところですか。

たとえばブログでいうとトップページとかのみんなに見られるところはキャッシュするけど管理ページやコメントのPOST先アクションはキャッシュしないなどの使い分けがキモになるのかなあ、という感じです。

まあフラグメントキャッシュが導入され、公式からページキャッシュが削除された今となっては使い道があるかわかりませんが、必要になったらぜひ使ってみてくださいな。

なにか間違いなどあればTwitterなどでご指摘いただければうれしいです。