二度忘れた事を三度忘れないようにする

しがないフリーランスIT系エンジニア

Unicornをsystemdで管理する

Rails初心者が典型的なハマり方をしたと思うので戒めの意を込めて。

前提
CentOS 7系
・SCL版ruby2.3
・SCL版nginx1.8

nginxはscl版でも標準でsystemctlコマンドで制御できるので特に問題なし。

$ sudo systemctl enable(start) rh-nginx18-nginx

unicronは自分でserviceファイルを記述する必要があるが、sclのrubyを使っているので普通にかくと環境変数がことなることでエラーになります。

ということでserviceファイルは以下みたいな感じで記述

[Unit]
Description=Unicorn Server

[Service]
WorkingDirectory=/var/www/html/
SyslogIdentifier=unicorn
PIDFile=/var/www/html/tmp/pids/unicorn.pid
User=nginx
Restart=always

ExecStart=/usr/bin/scl enable rh-nodejs4 rh-ruby23 -- unicorn_rails -c config/unicorn.rb -E development -D
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

しかし、ちゃんと起動しない。コマンド直打ちでは問題ないことはわかっているので、ユーザ周りを睨んで調査していると、gemで入れたアレコレがみつからないことがわかった。(経緯のメモを忘れた)

原因 「bundle install」でパスを未指定

これは完全にbundleの理解不足でした。パスを未指定で実行していたことで、カレントユーザのホームディレクトリにインストールされるため、systemdで実行した際に「色々ネーヨ」ってなってました。なので、パスを指定してインストールした以後は「bundle exec」をつけて各種コマンドを実行することでbundle installしたgem群の読み込みをよしなにしてくれた。

ということでserviceファイルのExecStartのコマンドを次に修正することで無事解決

ExecStart=/usr/bin/scl enable rh-nodejs4 rh-ruby23 -- bundle exec unicorn_rails -c config/unicorn.rb -E development -D