Rails

Capistranoでpuma.sockが作成されない(Puma not running)

2021/01/08

問題

Capistranoを利用してデプロイ( $ bundle exec cap production deploy )した際に, puma.sockが作成されず,
Nginxとのやりとりがうまくいかなかった.

Capistranoでpumaを起動( $ bundle exec cap production puma:start )しても, なぜか起動しない.

$ bundle exec cap production puma:status
00:00 puma:status
      WARN  Puma not running

原因

僕の場合は, /home/ec2-user/app/アプリケーション名/shared/puma.rb に以下のような設定をしていた.

app_dir = File.expand_path("../..", __FILE__)
bind "unix://#{app_dir}/tmp/sockets/puma.sock"
pidfile "#{app_dir}/tmp/pids/puma.pid"
state_path "#{app_dir}/tmp/pids/puma.state"
stdout_redirect "#{app_dir}/log/puma.stdout.log", "#{app_dir}/log/puma.stderr.log", true

しかし, 以下の2つのlogファイルがないため, 起動時にエラーになっていたようだ.

/home/ec2-user/app/アプリケーション名/log/puma.stderr.log
/home/ec2-user/app/アプリケーション名/log/puma.stdout.log

そのため, 手動でファイルを作成すれば動くようになった.

調査方法

僕の場合は, 上記のような原因だったが, 同じ問題に当たっていた記事はなかった.
多分, 相当まれなケースだと思われる.

今回厄介だったのは, エラーのログも出ず, capistrano自体は正常に終了しているような出力になっていることである.
そのため, 今回は僕の調査手順を記述することで, 近いような問題でも原因がわかるようにしておく.
※未来の僕のために

1. 今回原因のコマンドを実行

$ bundle exec cap production deploy
 or
$ bundle exec cap production puma:start

を実行すると, 以下のように表示される.

00:54 puma:start
      using conf file ~/app/アプリケーション名/shared/puma.rb
      01 $HOME/.rbenv/bin/rbenv exec bundle exec puma -C ~/app/アプリケーション名/shared/puma.rb --daemon
      01 Puma starting in single mode...
      01 * Version 4.3.7 (ruby 2.6.5-p114), codename: Mysterious Traveller
      01 * Min threads: 0, max threads: 16
      01 * Environment: production
      01 * Daemonizing...
    ✔ 01 ec2-user@13.113.222.89 1.275s

2. 実際に本番環境で実行してみる

コンソールには, $HOME/.rbenv/bin/rbenv exec bundle exec puma -C ~/app/アプリケーション名/shared/puma.rb --daemon と表示されている.

そのため, 本番環境で以下のように実行してみる.

$ bundle exec puma -C ~/app/アプリケーション名/shared/puma.rb

すると, 僕の場合は以下のように表示された.

Puma starting in single mode...
* Version 4.3.7 (ruby 2.6.5-p114), codename: Mysterious Traveller
* Min threads: 0, max threads: 16
* Environment: development
* Listening on unix:///home/ec2-user/app/アプリケーション名/tmp/sockets/puma.sock
Use Ctrl-C to stop
bundler: failed to load command: puma (/home/ec2-user/app/アプリケーション名/shared/bundle/ruby/2.6.0/bin/puma)
RuntimeError: Cannot redirect STDOUT to /home/ec2-user/app/アプリケーション名/log/puma.stdout.log
  /home/ec2-user/app/アプリケーション名/shared/bundle/ruby/2.6.0/gems/puma-4.3.7/lib/puma/runner.rb:128:in `redirect_io'
  /home/ec2-user/app/アプリケーション名/shared/bundle/ruby/2.6.0/gems/puma-4.3.7/lib/puma/single.rb:111:in `run'
  /home/ec2-user/app/アプリケーション名/shared/bundle/ruby/2.6.0/gems/puma-4.3.7/lib/puma/launcher.rb:172:in `run'
  /home/ec2-user/app/アプリケーション名/shared/bundle/ruby/2.6.0/gems/puma-4.3.7/lib/puma/cli.rb:80:in `run'
  /home/ec2-user/app/アプリケーション名/shared/bundle/ruby/2.6.0/gems/puma-4.3.7/bin/puma:10:in `<top (required)>'
  /home/ec2-user/app/アプリケーション名/shared/bundle/ruby/2.6.0/bin/puma:23:in `load'
  /home/ec2-user/app/アプリケーション名/shared/bundle/ruby/2.6.0/bin/puma:23:in `<top (required)>'

3. エラーを元に調査する

僕の場合は, RuntimeError: Cannot redirect STDOUT to /home/ec2-user/app/アプリケーション名/log/puma.stdout.log だったため, 原因を突き止めることができた.

同じような現象でも, 解決方法が違うのが複数記事ございましたので, 原因が全くわからない方は上記の手順で調査するのもありかと思う.

Twitterフォロー待ってます!