capistrano と unicorn と systemd(CentOS 7) で遊んでみた


最近、テンパり気味で、更新サボってます。ごめんなさい。

さて、今日もエンジニア向けのエントリーです。

今時の環境にするために、CentOS 7と unicorn と capistrano あたりで構成してみました。

大した話ではないのですが、わかっていないと使えないので、簡単に必要な知識を総ざらいできるようにメモを残します。

時間がない人は以下の2行だけでよいです。

  1. systemdでunicornを動かすなら環境周りのエラーに注意。解決はunicornのstderrで!
  2. systemdの管理下で動かすと決めたら他の動かし方はしない。capistranoの起動停止もsytemctlを使うように書き換える。

ちなみに、この辺のキーワードをググるとそれなりに設定ファイルのサンプルやらなにやら出てくるので細い話は割愛です。

良い記事は多いですが、わかっている人前提なので、、、ちょっとでもヒントになれば良いなと。

systemdとは?

CentOS 7 といえば、こいつですね。

ちゃんとプロセスの管理してくれるとっても素敵な感じのinitと理解してます。

Windowsのサービスと近い概念ですね。

設定する側から言うと起動スクリプトを書いたりとかが設定ファイルになったのでかなり楽です。

実行ユーザー / 実行グループ

はじめに設定しておきましょう。

設定しなくても動いちゃうのでタチが悪いです。

rootにファイルをガチャガチャ触られると後が面倒ですので最初に。

依存関係

特にいらないかと、、、

一応、データベースサーバーとnginxあたりが起動してくれているとありがたいですが、特に必須というわけではないという感じの設定が良いかと思います。

環境変数

ここは、はまりポイントかと

DBのパスワードやらシークレットキーやらなにやらを設定したファイルを用意しておいて、

/etc/systemd/system/unicorn.service

から読み込む設定にします。
rbenv使うなら、その設定も必要ですね。

一通り設定したところで

systemctl daemon-reload

とします。なんかしないと動かないらしいです。

確認

一旦、killなりcap production unicorn:stopなり何でも良いのでunicornを止めます。

でもって、

systemctl start unicorn

で起動できることを確認します。

止めたり、リロードしたり、いろいろと試します。

起動しなかったら?

systemctl status unicorn

で調べるのですが、ここにエラーがない場合は、まずunicornの標準エラー出力にあたります。

大体が環境変数の設定漏れやら設定ミスやらです。

unicorn 起動時のエラーを見ればいつも通りの知識で解決できます。

あとは、疑わしきはフルパスでということわざ通り、起動するコマンドはちゃんとフルパスで指定します。

capistrano設定

Railsでアプリを作ってると、capistranoでデプロイしたくなりますよね。

デプロイしたら一連の流れでcapistranoで起動したくなりますが、直接起動しちゃダメです。

直接というのは、

cd /opt/app/current && unicorn -c config/unicorn/production.rb -E production -D

みたいなやつです。

これをやってしまうと、unicornプロセスがsystemdの管理下に入りません。管理下に入らないと、systemdがunicornを起動/停止できなくなってしまったりと不都合があります。

ここは素直に

run ‘systemctl start unicorn’

とやって起動する設定にします。

もしこの設定が漏れていたら?

なにやらよくわからない、kill の使い方が sytemctl status unicorn の出力に出てきます。

停止コマンドを

ExecStop=/usr/bin/kill -QUIT $MAINPID

と設定したものの、systemctlの管理下に入っていないので、$MAINPIDが空白になってkillのリファレンスが出てきちゃう感じでしょうね。

環境を移行している場合、直接起動するスクリプトが生きていることがあるので、capistrano.rbの

namespace :deploy do

task :start

あたりの設定を確認しましょう。

unicorn:start

をキックしてたりします。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です