前回の記事では、unicornの概要についてまとめました。 今回は、Ruby on Railsアプリケーションを動かすためのunicornの設定やタスクについてまとめます。

設定

unicornのふるまいは設定ファイルで設定することができます。 設定可能な項目の一覧は公式ドキュメントで確認できます。 ここでは、特筆すべき項目について簡単に説明します。

どのような値を設定するかに関しては、unicornが公開しているサンプルどおりで基本的に問題ないと思います。 実際の設定例をGistに上げましたので、あわせてご覧ください。

なお、デフォルト値はソースコード内で確認できます。

worker_processes

アプリケーションの実際の処理を行なうworkerプロセスの数を指定します。 推奨値としては「最低1つ/コア」で、稼働時のメモリの使用量に応じて、様子を見ながら増減させるとよいと思います。

listen

リクエストを受けつける場所を指定します。 ここのパスとWebサーバ(nginxなど)のパスを合わせなければならないので注意が必要です。

pid

プロセスIDが記入されたファイルを配置する場所を指定します。

preload_app

masterプロセスがworkerプロセスをつくる前に、アプリケーションのコードを読み込みます。 これにより、masterプロセスをforkするworkerプロセスは最新のコードを保つことができます。

old_pid ...

masterプロセスにUSR2シグナルを送ると新しいworkerプロセスがつくられますが、古いプロセスは残ったままになります。 このため、before_fork内でこれを削除する必要があります。

sleep 1

workerプロセスを順次killするために、forkごとにsleep処理を行ないます。

設定時の注意点

Capistranoでデプロイすると、その度にreleases/ディレクトリ下にディレクトリが作成されます。

このとき、unicornのプロセスがロードしているコードにおいて、Gemfileの参照先として古いディレクトリを参照するケースがあります。

この場合、設定例にあるようにGemfileのパスを指定する必要があります。

タスク

unicornのタスクとしては、起動、終了、再起動の3つが主なタスクになると思います。

これらタスクをCapistranoから実行するには、capistrano3-unicornを導入することで実現できます。 このライブラリがやっていることは単純で、masterプロセスにUSR2QUITといったシグナルを送っているだけです。

ここではその導入方法について述べます。

1. インストールする

次の行をGemfileに書いてbundleします。

Gemfile:

group :development do
  gem 'capistrano3-unicorn'
end

2. Capfileに追加する

Capistranoで実行するタスクはCapfileから参照する必要があるので、ここにライブラリを追加します。

Capfile:

require 'capistrano3/unicorn'

3. デプロイ時に再起動する

Capistranoでのデプロイ時にunicornを再起動するには、Capistranoの設定ファイルにタスクを登録する必要があります。

config/deploy.rb:

namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end
end

after 'deploy:publishing', 'deploy:restart'

おわりに

以上で、Railsアプリケーションを公開する際のunicorn関連の情報は網羅できたかと思います。

タスクについては、capistrano3-unicornをよりシンプルに実装した拙作のcapistrano-unicorn-tasksもありますので、よければあわせてご覧ください。