2016/10/02

[作業記録][Debian] Debian 最小構成から Redmine を動かすまで(2) - Unicorn インストールから自動起動設定まで -

環境

  • Debian 8.5 最小構成インストール
  • sudo, vim, ssh はインストール済み
  • Redmine は準備済み(前回の投稿)

目標

Redmine + sqlite3 + Nginx + Unicorn な環境を作る。

今回は、 Unicorn のインストールから、デーモンとして自動起動するための設定まで。

手順概要

Unicorn の準備

Unicorn のインストール

sudo apt install unicorn

Unicorn の設定

/etc/default/unicorn

デフォルトで起動する unicorn の起動スクリプト設定ファイルは /etc/default/unicorn にあるのでこれを編集。 APP_ROOT を Redmine のルートディレクトリに修正。

これと、起動スクリプトをコピーして、 Rails アプリごとに Unicorn サーバーを立てるのが普通なのかな?動なんだろうか。

# Change paramentres below to appropriate values and set CONFIGURED to yes.
# CONFIGURED=no
CONFIGURED=yes

# Default timeout until child process is killed during server upgrade,
# it has *no* relation to option "timeout" in server's config.rb.
TIMEOUT=60

# Path to your web application, sh'ld be also set in server's config.rb,
# option "working_directory". Rack's config.ru is located here.
# APP_ROOT=/path/to/your/web/application
APP_ROOT=/var/redmine

# Server's config.rb, it's not a rack's config.ru
# CONFIG_RB="$APP_ROOT/unicorn.conf.rb"
CONFIG_RB="$APP_ROOT/config/unicorn.rb"

# Where to store PID, sh'ld be also set in server's config.rb, option "pid".
# PID=/run/unicorn.pid
PID=/var/redmine/run/unicorn.pid

# Additional arguments passed to unicorn, see man (1) unicorn.
# UNICORN_OPTS="-D -c $CONFIG_RB"
UNICORN_OPTS="/var/redmine/config.ru -D -c $CONFIG_RB -E production"

/var/redmine/config/unicorn.rb

unicorn の設定ファイルは、ひな形が /usr/share/doc/unicorn/examples/unicorn.conf.minimal.rb にあるので、それをコピーして使用する。コピー先は、 /etc/default/unicorn 内の CONFIG_RB の設定値(今回は /var/redmine/config/unicorn.rb)。

sudo -u www-data cp /usr/share/doc/unicorn/examples/unicorn.conf.minimal.rb /var/redmine/config/unicorn.rb

下記のように修正。

# Minimal sample configuration file for Unicorn (not Rack) when used
# with daemonization (unicorn -D) started in your working directory.
#
# See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete
# documentation.
# See also http://unicorn.bogomips.org/examples/unicorn.conf.rb for
# a more verbose configuration using more features.

listen 2007 # by default Unicorn listens on port 8080
worker_processes 2 # this should be >= nr_cpus
# pid "/path/to/app/shared/pids/unicorn.pid"
pid "/var/redmine/run/unicorn.pid"
stderr_path "/var/redmine/log/unicorn_stderr.log"
# stderr_path "/path/to/app/shared/log/unicorn.log"
stdout_path "/var/redmine/log/unicorn_stdout.log"
# stdout_path "/path/to/app/shared/log/unicorn.log"

ディレクトリ作成

ログ出力先と PID 出力先を作成。

cd /var/redmine
sudo -u www-data mkdir run log

Unicorn の動作確認(手動)

cd /var/redmine
sudo -u www-data unicorn -c config/unicorn.rb -E production

これで、ホストの 2007 ポートにアクセスすれば、 Redmine のトップページが見れるはず。 終了は Ctrl-D で。

起動スクリプトの準備

/etc/init.c/unicorn がそのままだと動かなかったので修正。

PID と、起動時のオプションを変えた。

起動スクリプト修正

#!/bin/sh
### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: unicorn initscript
# Description:       unicorn
### END INIT INFO

set -e

NAME=unicorn
DESC="Unicorn web server"

. /lib/lsb/init-functions

if [ -f /etc/default/unicorn ]; then
  . /etc/default/unicorn
fi

DAEMON=/usr/bin/unicorn
# PID=${PID-/run/unicorn.pid}
PID=/var/redmine/run/unicorn.pid

run_by_init() {
    ([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}

exit_with_message() {
  if ! run_by_init; then
    log_action_msg "$1 Not starting."
  fi
  exit 0
}

check_config() {
  if [ $CONFIGURED != "yes" ]; then
    exit_with_message "Unicorn is not configured (see /etc/default/unicorn)."
  fi
}

check_app_root() {
  if ! [ -d $APP_ROOT ]; then
    exit_with_message "Application directory $APP_ROOT is not exist."
  fi
}

set -u

case "$1" in
  start)
        check_config
        check_app_root

        log_daemon_msg "Starting $DESC" $NAME || true
#         if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
        if start-stop-daemon --start --chdir /var/redmine --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
              ;;
  stop)
        log_daemon_msg "Stopping $DESC" $NAME || true
        if start-stop-daemon --stop --signal QUIT --quiet --oknodo --pidfile $PID; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  force-stop)
        log_daemon_msg "Forcing stop of $DESC" $NAME || true
        if start-stop-daemon --stop --quiet --oknodo --pidfile $PID; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" $NAME || true
        start-stop-daemon --stop --quiet --oknodo --pidfile $PID
        sleep 1
        if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  reload)
        log_daemon_msg "Reloading $DESC" $NAME || true
        if start-stop-daemon --stop --signal HUP --quiet --oknodo --pidfile $PID; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  reopen-logs)
        log_daemon_msg "Relopening log files of $DESC" $NAME || true
        if start-stop-daemon --stop --signal USR1 --quiet --oknodo --pidfile $PID; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  status)
        status_of_proc -p $PID $DAEMON $NAME && exit 0 || exit $?
        ;;
  *)
        log_action_msg "Usage: $0 <start|stop|restart|force-reload|reload|force-stop|reopen-logs|status>" || true
        exit 1
        ;;
esac

systemctl 更新

sudo systemctl daemon-reload

動作確認

起動確認

sudo service unicorn start

終了確認

sudo service unicorn stop

0 件のコメント: