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