Heroku上のRails 3アプリをRails 4に移行する際に工夫した点

Herokuで動いている「むびりす」をRails 3から4に移行してみた。非互換部分のコード修正は意外に少なく、いくつかのExceptionやWarningを潰すだけで済んだ。ついでにRubyも2.0.0に上げている。

工夫したのは、自動インジェクションされなくなったrails_log_stdoutとrails3_serve_static_assetsの扱い。そして、まだRails 4をサポートしていないheroku-deflaterの扱いだ。

rails_log_stdout、rails3_serve_static_assetsの扱い

rails_log_stdoutとrails3_serve_static_assetsは、「Getting Started with Rails 4.x on Heroku」に書かれているgemには頼らず、以下のようにした。

config.ru
$stdout.sync = true
config/environments/production.rb
config.logger = Logger.new(STDOUT)
config.logger.level = Logger::INFO
config.serve_static_assets = true

heroku-deflaterの扱い

heroku-deflaterは、作者がRails 4を使っておらず、サポートされるのに時間がかかりそうなので、Forkしてしまった。

Rails 4に移行した理由

Rails 3ではSweeperにバグがあり、キャッシュがうまく消せなかった。Rails 4ではプラグイン化され、バグも直っているようなので、移行することにした。Sweeperの挙動はまだ試していない。

ちなみに「むびりす」では、DB処理よりビューのレンダリングに時間がかかっている。速度のみを求めているわけではない(RailsやHerokuを使っているぐらいだし)とはいえ、速いにこしたことはない。

追記(2013-05-05)

heroku-deflaterがRack 1.5をサポートしました。

これで、Rails 4アプリにも普通に導入できます。ありがたい限りです。

Rails3アプリ on Herokuの転送量削減メモ

Herokuで公開したRails3アプリ(むびりす)が少し重いので改善したくなった。まずは転送量を削減してみる。

前提

  • 30分ごとにpingし、アイドリングを防いでいる
  • Asset Pipelineはもともと有効

やったこと

  • heroku-deflaterを入れて圧縮転送を有効に
  • OptiPNGで圧縮したPNG画像に差し替え
  • 「config.static_cache_control = "public, max-age=2592000"」とした
    (assetsを30日間キャッシュ。デフォルトではCache-Controlヘッダが出力されない)
  • 動的ページのうち可能なものは「Cache-Control: max-age=0, public, must-revalidate」とした
    (デフォルトでは「max-age=0, private, must-revalidate」)

結果

描画のもっさり感が減った。むしろ、サーバの処理待ちが気になる。今度はアクションキャッシュによる処理時間の削減を試してみたい。

記事検索
Twitter