はじめに
先日Railsアプリをサーバーにデプロイしようとしたらpumaプロセスが立ち上がらない問題が出て躓いたのでそのメモ共有です。
記事がなかなかなかったので同じ現象が起こっている方の役に立てば幸いです
環境
ruby (2.7.1p83)
rails (6.0.3.4)
puma (5.1.0)
capistrano (3.9.0)
capistrano3-puma (5.0.4)
発生していた問題
- deployは成功しているのにpuma processが存在しない
- サーバー上で直接起動コマンドを叩いたらpumaは起動する
- deploy上で使用しているコマンド(systemctl restart puma / systemctl start puma)からはエラーが返ってこない
- systemctl status pumaではエラーが発生している模様
- pumaのログ置き場のshared/log/staging.logには何も発生していない
先に結論
capistrano3-puma 5系からはsystemdが推奨されています。
今回はsystemd経由でのrbenv呼び出しの設定漏れがありrubyのversionが正しくloadingされていませんでした
journalctl
このコマンドさえ知っていたら全て解決した。
systemdについて
なぜ必要か
capistrano3-puma 5系においてプロセス管理方法がsystemdになった。
is 何
process管理ツール。再起動などいろいろ楽。
基本的なコマンド
# systemdのserviceのログをtailする
journalctl -f -u puma
# reload service file
sudo systemctl daemon-reload
# start / stop / restart / enable / disable / status
sudo systemctl (start|stop|restart|enable|disable|status) puma.service
# 設定ファイル
/etc/systemd/system/puma.service
journalctl -f -u pumaを使う
sudo systemctl restart puma.service
を行うたびに下記エラーログが出てきました。
3月 09 10:00:00 systemd[1]: Started Puma HTTP Server for project_name (staging).
3月 09 10:00:00 systemd[1]: Starting Puma HTTP Server for project_name (staging)...
3月 09 10:00:00 app[12810]: rbenv: version `2.7.1' is not installed (set by /var/www/project_name/releases/2021000000000000/.ruby-version)
3月 09 10:00:00 systemd[1]: puma.service: main process exited, code=exited, status=1/FAILURE
どうやらrbenvからうまくruby versionを呼び出せないようです。
サーバー上で直接起動時には問題ないのでsystemd経由でrbenvがうまく使えていないことを疑いました。
systemdで環境変数を読み込む
調べているとsystemdでは.bash_profileなどに書いている環境変数を 読み込んでくれない のでrbenvを想定通りに動かしたい場合は別途設定が必要とのこと。
/etc/sysconfig/ファイル名
で設定するのが一般的みたいです。
$ which rbenv
/usr/local/rbenv
RBENV_ROOT="/usr/local/rbenv" #上記結果をここに入れてください
[Unit]
Description=Puma HTTP Server for project_name (staging)
After=network.target
[Service]
Type=simple
User=app
WorkingDirectory=/var/www/project_name/current
ExecStart=/usr/local/rbenv/bin/rbenv exec bundle exec puma -C /var/www/project_name/current/config/puma/staging.rb
ExecReload=/bin/kill -TSTP $MAINPID
EnvironmentFile=/etc/sysconfig/puma.env ### この行を追加
StandardOutput=append:/var/www/project_name/shared/log/puma_access.log
StandardError=append:/var/www/project_name/shared/log/puma_error.log
Restart=always
RestartSec=1
SyslogIdentifier=app
[Install]
WantedBy=multi-user.target
設定後
設定の再読み込みと再起動で無事pumaが立ち上がることを確認できました。
# 設定再読み込み
sudo systemctl daemon-reload
# サービス再起動
sudo systemctl restart puma
# プロセス確認
ps aux | grep puma