前回からの続き
5.railsアプリケーションのデプロイ準備
Unicornでアプリケーション起動
ローカル開発環境のrailsアプリケーションに戻り、unicornを使えるようにします。
gem 'unicorn' gem 'therubyracer', platforms: :ruby
$ bundle install
config/unicorn.rbファイルを作成してUnicornを設定します。
config/unicorn.rb
rails_root = `pwd`.chomp
worker_processes 3
timeout 15
preload_app true
# TCPソケットで使う場合
listen 3000
# Unixドメインソケットを使う場合(WEBサーバーと連携する場合)
#listen "/tmp/unicorn.sock", :backlog => 64
pid "#{ rails_root }/tmp/pids/unicorn.pid"
# ログの設定方法.
stderr_path "#{ rails_root }/log/unicorn.log"
stdout_path "#{ rails_root }/log/unicorn.log"
before_fork do |server, worker|
ActiveRecord::Base.connection.disconnect!
old_pid = "#{ server.config[:pid] }.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end
after_fork do |server, worker|
ActiveRecord::Base.establish_connection
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end
end
$ bundle exec unicorn -D -c config/unicorn.rb
このコマンドでアプリケーションをUnicornで起動できます。http://localhost:3000/にアクセスして、WEBRick起動時と同様に表示されることを確認します。Unicornの停止は、psでプロセスIDを探して、そのプロセスをkillします。
$ ps aux | grep 'unicorn master' $ kill -QUIT 99999
サーバでのnginxとの連携設定
サーバでは、nginxとUnicornを連携して動作させるため、TCPソケットからUnixドメインソケットへ設定を変更しておきます。
config/unicorn.rb
# TCPソケットで使う場合 #listen 3000 # Unixドメインソケットを使う場合(WEBサーバーと連携する場合) listen "/tmp/unicorn.sock", :backlog => 64
Capistrano
デプロイは自動化ツールCapistrano3を使って行います。まずはGemfileに追加して、いつも通りbundle install。その後、deploy設定のファイルを編集していきます。設定ファイル中の(アプリケーション名)などは自分の環境に置き換えてください。
Gemfile
group :development do gem "capistrano" gem "capistrano-rails" gem "capistrano-bundler" gem "capistrano-rbenv" gem "capistrano3-unicorn" end
$ bundle install
Capistranoの設定ファイルを生成します。
$ bundle exec cap install mkdir -p config/deploy create config/deploy.rb create config/deploy/staging.rb create config/deploy/production.rb mkdir -p lib/capistrano/tasks create Capfile Capified
Capfile
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
config/deploy.rb
lock '3.3.5'
set :application, '(アプリケーション名 - rwerckersample)'
set :repo_url, '(GitHubのリポジトリURL - git@github.com:username/rweckersample.git)'
set :deploy_to, '/home/ec2-user/(rwerckersample)'
set :scm, :git
set :rbenv_ruby, '2.1.5'
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/assets public/uploads}
set :default_stage, "production"
set :default_env, {
rbenv_root: "/home/ec2-user/rbenv",
path: "/home/ec2-user/rbenv/shims:/home/ec2-user/rbenv/bin:$PATH",
secret_key_base: '(予めrake secretコマンドで生成)'
}
set :unicorn_rack_env, "production"
set :unicorn_config_path, 'config/unicorn.rb'
namespace :deploy do
desc 'Restart application'
task :restart do
invoke 'unicorn:restart'
end
after :publishing, :restart
after :restart, :clear_cache do
on roles(:web), in: :groups, limit: 3, wait: 10 do
# Here we can do anything such as:
# within release_path do
# execute :rake, 'cache:clear'
# end
end
end
end
config/deploy/production.rb
set :stage, :production
set :rails_env, :production
role :app, %w{ec2-user@(AWSサーバのIPアドレス)}
role :web, %w{ec2-user@(AWSサーバのIPアドレス)}
role :db, %w{ec2-user@(AWSサーバのIPアドレス)}
関連記事
[1] 最近のWebサービス開発フロー,WerckerでGithubのプライベートリポジトリからAWSへデプロイしてHipChatへの通知まで
[3] AWS EC2サーバの構築

