Ubuntu上のRailsアプリをpumaでデーモン化と自動起動設定する。

pumaのデーモン化

まずは、シンプルにpumaをデーモン化してみよう。
puma -p 3000 -e production -C config/puma.rb -d 

もしくは

pumactl start 

pumactlは、config/puma.rbに設定をすべて記述してシンプルな実行をするタイプのコマンド。実行時にパラメータを指定する方式では、パラメータ管理をしにくいし、実行時のパラメータ指定ミスなど起こりやすいから。

デーモン化されてサービスが動作していることの確認
lsof -i 

ポート3000でrubyの待ち受けが動いていることがわかる。
PIDもここでわかる。PIDはconfig/puma.rbでpid管理ファイルを指定しておけば、pid管理ファイルを参照するのが良い。

サービスを終了する。
kill -QUIT XXXX   # pid指定
kill -s SIGTERM  XXXX   # pid指定

もしくはpidをファイルに出力している場合にはファイルを参照して実行するコマンドが良い。

kill -s SIGTERM `(cat tmp/pids/puma.pid)`    # -QUIT でも良い

pumaのデーモン化を自動起動に組み込む。

自動実行スクリプト /etc/init.d/pumaを作る。

#!/bin/bash


NAME=puma
USER=<user_name>
APP_NAME=<app_name>
APP_DIR=/home/$USER/railsWork/$APP_NAME  #webアプリのプロジェクトルートをフルパスで指定
TMP_DIR=$APP_DIR/tmp
PID_DIR=$TMP_DIR/pids
PID_FILE=$PID_DIR/puma.pid  #config/puma.rb で指定しているpidファイルと同じパス&ファイル名を指定する。
PUMA_BIN=/home/$USER/.rbenv/shims/pumactl  #rbenvの使用をしている前提のスクリプトにした。
HOME=/home/$USER
NODE_VERSION=v8.10.0    #railsアプリが前提としているnode.jsのバージョン。nvmでインストールしてある前提でこのスクリプトにした。


# home/.bashrcに組み込んでいたnvmのロードスクリプト。インタラクティブモードのときしか.bashrcは読まれないので、同じスクリプトをここに仕込む。
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

# nvmのdefault設定がしてあれば動くが、defaultのままではdefaultのバージョンが変わったときに問題が起きる可能性があるので、やはりバージョンを指定しておくべき。そのためのnvmだし。
nvm use $NODE_VERSION





start() {
  cd $APP_DIR;
  echo "--------------------------------"
  echo "Starting puma init script."
  echo 
  echo "---init script config parameters---"
  echo "USER= $USER"
  echo "APP_NAME= $APP_NAME"
  echo "APP_DIR= $APP_DIR"
  echo "TMP_DIR= $TMP_DIR"
  echo "PID_FILE= $PID_FILE"
  echo "NODE_VERSION= $NODE_VERSION"
  echo 
  echo "---context information---"
  echo "pwd=" `pwd`
  echo "NVM_VERSION=" `nvm --version`
  echo "NODE_VERSION=" `node --version`
  echo 
  echo "---start the service.---"

  sh -c "$PUMA_BIN start"
  echo 
  echo "--------------------------------"

}

stop() {
  echo -n "Stopping puma"
  kill -s SIGTERM `cat $PID_FILE`
}

restart() {
  stop
  start
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart}" >&2
    exit 1
    ;;
esac

自動実行スクリプトを実行許可する。

sudo chmod +x /etc/init.d/puma

参考サイト

qiita.com