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