Unicornの設定ファイルを読み解く(Part2)

【結論】
・「ワーカープロセス」とは、
 アプリケーションが実行されるプロセス

・ソケットとは、ネットワークの出入り口となる部分

・プロセスIDとは、実行されているプロセスを見分ける為の識別子


【目次】


【本題】

前回の続き

ryoutaku-jo.hatenablog.com

「app_path」の値は、「/var/www/アプリ名」という
絶対パスを文字列にしたものだと判明しました。

↓参考URL
Unicorn設定のまとめ - Qiita
unicorn.rb - ソフトウェアエンジニアリング - Torutk
rails-sample/config/unicorn.rb at master · violetyk/rails-sample · GitHub

ワーカープロセス数の設定

worker_processes 1


「ワーカープロセス」の数を設定します。

「ワーカープロセス」とは、
アプリケーションが実行されるプロセスのことです。

つまり、「worker_processes」では、
並行して処理できるプロセスの数を指定できます。

なお、「プロセス」とは、
パソコンのCPUが実行するひとまとまりの処理を指します。

並行して処理できるプロセスの数は、 CPUのコア数に依存するので、
CPUのコア数以下に設定できません。
なので、サーバーのメモリなどによって変更する必要があります。

また、autoにすることで自動でコア数を設定する事も可能です。

アプリを実行するディレクトリを設定

working_directory "#{app_path}/current"

Unicornの起動コマンドを実行するディレクトリを指定します。

前回の投稿で説明した通り、Capistranoで自動デプロイしている際は、
「current」ディレクトリのアプリを起動させます。

app_pathには、「/var/www/アプリ名」という絶対パスを文字列にした
ものが入っているので、式展開してcurrentとくっつける事で
「/var/www/アプリ名/current」という絶対パスが指定できます。

ソケットの設定

listen "#{app_path}/shared/tmp/sockets/unicorn.sock"

上記はソケットファイルを生成する記述です。
ソケットとは、ネットワークの出入り口となる部分です。

今回は、nginxとの通信を行う為に記述しています。
下記の通り、nginx側にもUnicornのソケットファイルが
指定する記述がなされています。。

rails.conf(Nginxの設定)

upstream app_server {
  server unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock;
}

プロセスIDの設定

pid "#{app_path}/shared/tmp/pids/unicorn.pid"

上記はプロセスIDファイルを生成する記述です。
プロセスIDとは、実行されているプロセスを見分ける為の識別子です。

これが無いと、どのプロセスでunicornが実行されているのか特定できません。

ログファイルの出力先設定

stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"

Unicornのエラーログと通常ログの位置を指定します。
unicorn.stderr.log」がエラーで
unicorn.stdout.log」が通常ログです。

動作検証用の接続先設定

listen 3000
timeout 60

とりあえず起動して動作確認をしたい時の設定。

EC2インスタンスのセキュリティグループのポートを
タイプを「カスタムTCPルール」、
プロトコルを「TCP」、
ポート範囲を「3000」、
送信元を「カスタム / 0.0.0.0」に設定しておく必要がある

接続タイムアウト時間も合わせて設定する。

再起動設定

更新時にダウンタイム無しで起動ができる

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

接続チェック設定

check_client_connection false

アプリケーションを読み込む前に呼ぶ前に、unicornの接続が
同じホスト上のクライアントに限定された状態になっているかチェックする。
切断された接続に対してアプリケーションを呼び出すのを防ぐ

処理制限設定

run_once: true

処理を一度しか実行されない様に限定する

再起動時の古いプロセスの削除設定

before_fork do |server, worker|
  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false # prevent from firing again
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exist?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH => e
      logger.error e
    end
  end
end

この設定をしておけば、再起動時に古いプロセスをkillしてくれます。