Rails3.1+capistrano
Rails3.1でasset pipelineが導入された関係で、3.0のままのレシピでデプロイするといくつか問題が出る。
まずpublic/images、public/stylesheets、public/javascriptsがないというエラー。 エラーが出ても実害はないが、赤文字がずらずら流れるので心臓によろしくない。 これの解決は簡単で、deploy.rbに
set :normalize_asset_timestamps, false
を追加するだけでOK。
ちょっと悩ましいのが、rake assets:precompileをいつ実行するかということ。 ヒューマンエラーをなくすために、まずはdeploy時に実行するようにしてみる。 (deploy.rbではなく)Capfileに
require "deploy/assets"
Gemfileに
gem 'execjs'
を追加。さらにサーバ側にnode.jsをインストールしておく。 これでcap deployすると自動的にrake assets:precompileが実行される・・・んだけど、実はassets:precompileはかなり遅い。appサーバが複数あると全部で実行されるし、大変に効率が悪い。node.jsが簡単にインストールできない環境だとそれも面倒だし。(Ubuntuならapt-getするだけだが) というわけで、assets:precompileはローカルで実行してリポジトリに含めておくことにした。
ついでにcapistranoではないけど、nginxの設定。 unicornに投げる部分は省略して、assetsまわりのみはこんな感じ。
location ~ ^/assets|system/ {
expires 1y;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
}
例によって静的ファイルはrailsを通さずに処理されるので、圧倒的に早い。
[amazon-product]4797363827[/amazon-product]
必携。電書版はこちら。