Web制作メモ -トップへ-

NginxとUnicornでRails起動まで

Rails環境再構築2016.02.24 23:24

Nginxのインストール

Nginxのリポジトリを追加

# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=Nginx
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Nginxをインストール

# yum -y install nginx

/etc/nginx/nginx.confが設定ファイルの本体。実行ユーザーやワーカープロセスを変更できる。

$ sudo vi /etc/nginx/nginx.conf
今回は何も変更しない

デフォルトの設定ファイルを削除

# rm /etc/nginx/conf.d/*

デフォルトサーバーの設定(全てアクセス拒否)

# vi /etc/nginx/conf.d/default.conf
server {
  listen 80 default_server;
  server_name _;
  deny all;
}

今回使用するサーバーの設定

# vi /etc/nginx/conf.d/server.conf
upstream usock {
  server unix:/opt/unicorn/unicorn.sock;
}

server {
  listen 80;
  server_name [ホスト名].[ドメイン名];

  root /[プロジェクト名]/current/public;
  client_max_body_size 1g;
  error_page 404 /404.html;
  error_page 500 502 503 504 /500.html;

  location ^~ /assets/ {
    expires 1y;
    add_header Cache-Control public;
    add_header ETag "";
    gzip_vary on;
    gzip_static on;
  }

  try_files $uri/index.html $uri @app;

  location @app {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://usock;
  }
}

Unicornのインストール

Unicornで使用するsocketやpidをVirtualBoxの共有領域に置くとエラーとなった為、Unicornで使用するものは全て(ログファイルも)Unicorn専用のディレクトリを作ってそこで管理することにする。

# mkdir /opt/unicorn
# chown [ユーザー名]:[ユーザー名] /opt/unicorn

Unicornをインストール

# gem install unicorn-rails

Unicornの起動スクリプトを作成。RAILS_ENVはこのファイルで制御する。

# vi /etc/init.d/unicorn
#!/bin/sh
# chkconfig: - 85 15

. /etc/rc.d/init.d/functions

RAILS_ENV=development

PROG_NAME=unicorn
APP_ROOT=/[プロジェクト名]/current
PID_FILE=/opt/unicorn/unicorn.pid

export PATH=/usr/local/bin:$PATH
cd $APP_ROOT || exit 1

case $1 in
  start)
    daemon --user=[ユーザー名] --pidfile=$PID_FILE unicorn_rails -c /opt/unicorn/config.rb -D -E $RAILS_ENV
    ;;
  stop)
    killproc -p $PID_FILE $PROG_NAME -QUIT
    ;;
  restart)
    killproc -p $PID_FILE $PROG_NAME -USR2
    ;;
  *)
    echo >&2 "Usage: $0 "
    exit 1
    ;;
esac

起動スクリプトにアクセス権を設定

# chmod 755 /etc/init.d/unicorn

サービスの起動

# service unicorn start

自動起動するように設定する

# chkconfig unicorn on
# chkconfig unicorn --list

Unicornの設定ファイルを作成

# vi /opt/unicorn/config.rb
worker_processes 4
working_directory "/[ProjectName]/current"
listen "/opt/unicorn/unicorn.sock"
pid "/opt/unicorn/unicorn.pid"
stderr_path "/opt/unicorn/unicorn.stderr.log"
stdout_path "/opt/unicorn/unicorn.stdout.log"

preload_app true

before_fork do |server, worker|
  ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  ActiveRecord::Base.establish_connection
end

rootで作ってしまったので所有者をユーザーに変更

# chown [ユーザー名]:[ユーザー名] /opt/unicorn/config.rb

Rails環境の設定

bundleインストールでエラーが出るので事前にnokogiriをインストール

$ sudo gem install nokogiri -- --use-system-libraries

bundleインストール

$ bundle install

DB作成

$ rake db:create RAILS_ENV=development
$ rake db:migrate RAILS_ENV=development
$ rake db:seed RAILS_ENV=development

.bash_profileに設定しておくと指定しなくて済む

$ vi ~/.bash_profile
export RAILS_ENV=development