Railsアプリケーションを公開するならAssets on Cloudパターンを使おう
Assets on Cloudパターンとは
「Assets on Cloudパターン」*1はRailsデザインパターン*2の一つ。Railsアプリケーションの静的なコンテンツ(Assets)をクラウドに配置するパターンである。ファイルサイズの大きい画像などをクラウドに配置することでウェブサーバへのリクエストを減らし、ネットワークリソースを節約する。
Assetsの配置先はAmazon S3を推奨する。
asset_syncの使い方
「Assets on Cloudパターン」はasset_syncというgemを利用する。
Amazon S3の設定方法
asset_syncを設定する前にAmazon S3でバケットを作っておく。バケット名を自分が持ってるドメインのサブドメインと同じにしておくと少しだけ幸せになれる。ドメインを持っていない場合、適当なバケット名でもいいが、全世界で一意にする必要がある。(他の人と同じバケット名でバケットを作成することができないので注意)
また、国内ならRegionをTokyoにしておかないと、ネットワークの速度が遅くなってしまうので注意。
以降はTokyoリージョンに作成したassets.example.comというバケットで説明を進める。
asset_syncの設定方法
Gemfileに以下の記述を追加する。
gem 'asset_sync'
以下の内容でconfig/asset_sync.ymlを用意する。
defaults: &defaults fog_provider: 'AWS' fog_directory: 'assets.example.com' fog_region: 'ap-northeast-1' aws_access_key_id: '<AWSのACCESS KEY>' aws_secret_access_key: '<AWSのSECRET ACCESS KEY>' existing_remote_files: delete manifest: true gzip_compression: true development: <<: *defaults test: <<: *defaults production: <<: *defaults
config/environments/production.rbに以下の記述を追加する。
config.action_controller.asset_host = '//s3-ap-northeast-1.amazonaws.com/assets.example.com'
以上で設定は完了。Assetsのprecompile時に自動的に配置されるようになる。
$ bundle exec rake assets:precompile
capistranoとの連携
capistranoの設定方法
Railsの汎用デプロイツールであるcapistranoと組み合わせることで、アプリケーションのデプロイと同時にAssetsをクラウドに配置することができる。
config/deploy.rbに以下の記述を追加する。
namespace :assets do task :precompile, :roles => :web do run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake assets:precompile" end task :cleanup, :roles => :web do run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake assets:clean" end end after :deploy, 'assets:precompile'