capistrano+apache+unicorn

unicorn

Railsプロジェクトをデプロイする時に山ほどのエラーが発生することが先週初めて知りました・・・デプロイタスクを自動化しようと思い、capistranoを使ってみました。このツールを使いこなせると、あっという間にstaggingやproductionサーバーのデプロイが可能になりますので、設定手順を作ってみました。

まずはローカル環境でcapistranoをインストールします

gem install capistrano capistrano_colors capistrano-ext rvm-capistrano

capistranoの他に幾つかのgemをインストールしました。

  1. capistrano_colors 実行結果に色を付けれてくれる便利なgemです
  2. capistrano-ext 環境に応じて、設定を変えられるツールです
  3. rvm-capistrano rvm経由でのインストール

Gemfileを更新します

#デプロイする際にcapistranoをインストール
group :deployment do
  gem 'capistrano'		
  gem 'capistrano_colors'	
  gem 'capistrano-ext'	
  gem 'rvm-capistrano'
end
...

#プロダクションモードの場合(本番機)、unicornをインストール
group :production do
  gem 'unicorn'
end
...

Gemfileの設定が完了になりました!次はcapistranoの設定を行います。【cap】コマンドでcapistranoの必要なファイルを生成します:

$cd {project_path}
$capify .

capify コマンドによって、デフォルトで次のファイルが生成されたはずです。

  • Capfile
  • config/deploy.rb

【deploy.rb】を書き直します:

#multi-stages用
require "capistrano/ext/multistage"

# 結果に色を作れくれるツール
require "capistrano_colors"

require "bundler/capistrano"

# RVMでrubyを管理していれば ↓
require "rvm/capistrano"   

# 値をセット
set :rvm_ruby_string, "ruby-2.0.0-p0"       
set :application, "myapp"   
set :copy_exclude, %w(.git .gitignore doc features log spec test tmp Capfile)
#set :shared_children, shared_children + %w(public/uploads)
set :use_sudo, false
set :user, "app"
set :stages, %w(staging production) 

# unicornサーバーを管理するためにdeploy namespaceを用意
# start/stop/restartメッソード
namespace :deploy do
  task :start, roles: :app, except: { no_release: true } do
    run "cd #{current_path} && bundle exec unicorn_rails -c config/unicorn.rb -E #{rails_env} -D"
  end

  task :stop, roles: :app, except: { no_release: true } do
    run "kill -KILL -s QUIT `cat #{shared_path}/pids/unicorn.pid`"
  end

  task :restart, roles: :app, except: { no_release: true } do
    stop
    start
  end
end

#デプロイ前に確認画面を出す
def confirm
  puts "\n\e[0;36m#{stage}\e[0m\e[0;31m Do you really deploy? (yes/no) \e[0m\n"
  proceed = STDIN.gets rescue nil
  exit unless proceed.chomp! == "yes"
end

本来はcapistranoの呼び方はこんな感じになります:

cap namespace1:task1  namespace1:task2 tasks3

今回はcapistranoのmultistageを使うことにしますので、コマンドが変わってきます。

cap stage namespace1:task1  namespace1:task2 tasks3

設定ファイルで定義した通りに2つのstageを用意しておきます:

  1. stagging (テスト用)
  2. production(本番)

capistranoは指定されたstagesの設定ファイルを自動的に読み取ってくれる。この設定ファイルの保存場所は → config/deploy/{stage名}.rb

ということで、stagging.rbとproduction.rbを追加しましょう!

#production.rb

server "myRealServer", :app, :web, :db, primary: true
set :rails_env, "production"
set :rvm_type, :user
set :scm, :subversion
set :scm_username, "myUser"
set :scm_password, "xxxxx"
set :repository, "https://myrepository/svn/myproject/trunk"

#確認メッソードを呼び出す
confirm

#stagging.rb
server "myproject.com", :app, :web, :db, primary: true
set :rails_env, "staging"
set :rvm_type, :system
set :rvm_path, "/usr/local/rvm"
set :scm, :git
set :repository,  "ssh://git@gitlab.test.com:10022/myProject.git"
set :deploy_via, :remote_cache

ご覧のとおり、stageによってscm(バージョン管理ツール)やサーバーが違います。

最後はサーバー側の修正を行います。必要なライブラリーをインストールし、unicorn用のユーザーアカウントを追加します

### 必要なライブラリのインストール (rootにてコマンド実行)
$ yum install libxslt-devel

### app ユーザ作成 (rootにてコマンド実行)
# adduser app
# mkdir -p /u/apps
# chown app:app /u/apps

rvm経由でRubyのインストールを行う:

### ruby2.0.0-p0 インストール (appユーザにてコマンド実行)

$ rvm install 2.0.0-p0
$ rvm reload
$ rvm use 2.0.0-p0 --default
$ echo 'gem: --no-ri --no-rdoc' >> ~/.gemrc
$ echo ':ssl_verify_mode: 0' >> ~/.gemrc
$ gem install bundler

最後はapacheのVirtualHostを設定します:

### apache 設定

    ServerName special.myserver.jp

    ProxyPass /assets/ !
    ProxyPass / http://localhost:18080/
    ProxyPassReverse / http://localhost:18080/

    Alias /assets/ /u/apps/myProject/current/public/assets/

        Options FollowSymLinks
        Order Allow,Deny
        Allow from All

実際にプロジェクトをデプロイしてみましょう!

#capistranoの動作確認(初回のみ)
cap production deploy:check

# 最初の環境構築 (初回のみ)
cap production deploy:setup

#デプロイ
cap production deploy

#自分で作ったunicornのインストール・起動タスク
cap production deploy:start

http://special.server.comをアクセスすると、問題なくアプリが起動する・・はずです。

by johann

広告