Rails5 + CentOS7 + nginx + puma でVPSを設定してみた。

Rails5を使ってVPS(CentOS7)上に設定をしてみた。

環境は以下の通り。

  1. VPS( CentOS7 )
  2. nginx
  3. Ruby on Rails 5
  4. puma

unicorn と pumaを迷ったがRail5からpumaが良さそうな記事を見て

pumaで試してみることに。

サーバーにpumaの設定ファイルを置く。

/etc/init.d/puma

#!/bin/bash

NAME=puma # 変更なし
USER=ubuntu # centOSのuserに変更
APP_NAME=appname # RailsのAppの名前に変更
APP_DIR=/home/$USER/$APP_NAME # Railsをおいているディレクトリに変更
TMP_DIR=$APP_DIR/tmp
PID_DIR=$TMP_DIR/pids
SOCKET_DIR=$TMP_DIR/sockets
LOG_DIR=$TMP_DIR/logs
PUMA_BIN=/home/$USER/.rbenv/shims/puma

RAILS_ENV=staging

sudo -u $USER -H sh -c "mkdir -p $PID_DIR"
sudo -u $USER -H sh -c "mkdir -p $SOCKET_DIR"
sudo -u $USER -H sh -c "mkdir -p $LOG_DIR"

PIDFILE=$PID_DIR/puma.pid


start() {
  cd $APP_DIR;
  sudo -u $USER -H sh -c "echo \$\$ > $PIDFILE; RAILS_ENV=$RAILS_ENV $PUMA_BIN -C $APP_DIR/config/puma.rb -d"
}

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

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

pumaファイルの権限と実行を変更する。

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

startでOKがでればよい。
自動起動も設定します。

sudo chkconfig puma on
sudo chkconfig | grep puma

Railsの設定をする。

config/puma.rbに以下を追記する。

_app_path = "#{File.expand_path("../..", __FILE__)}"
_app_name = File.basename(_app_path)
_home = ENV.fetch("HOME") { "/home/[決めたuser名]" }
pidfile "#{_home}/run/#{_app_name}.pid"
bind "unix://#{_home}/run/#{_app_name}.sock"
directory _app_path

runのディレクトリを作成する

mkdir /home/[決めたuser名]/run/

 

nginxの設定

/etc/nginx/nginx.conf

#コメントアウトする
#include /etc/nginx/sites-enabled/*;

/etc/nginx/conf.d/appname.conf

upstream appname {
    server unix:///home/[決めたuser名]/run/[Railsアプリ名].sock;
}

/etc/nginx/conf.d.appname.conf

server {
    listen 80;
    server_name 192.168.0.1; # 本番環境のipアドレス
    root /home/ubuntu/appname/public; # アプリケーション名
    location / {
        proxy_pass http://appname; # アプリケーション名
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    access_log /var/log/appname.access.log;
    error_log /var/log/appname.error.log;

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}
</pre>
<pre>sudo service nginx restart

 

これである程度はうごくかなと思います。

他、/etc/nginx/nginx.conf にも以下の設定も必要かもしれません。

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  XXXXX;
        root         /[アプリの場所]/[アプリ名]/public;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            try_files $uri $uri/ = 404;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

サーバー状況は各自で違うのでなかなか設定が難しい…。

取り急ぎ私がやった設定ファイルの一覧でした。