AWS+Nginx+Unicorn+Ruby on Railsでサーバー環境構築

Ruby on Railsのインストールする

1. Ruby on RailsとUnicornを入れるために必要なものをインストールします。

sudo yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison git

2. ruby-buildをインストールします

cd
git clone git://github.com/sstephenson/ruby-build.git
cd ruby-build
sudo ./install.sh
cd ../ruby-build
sudo rm -rf ruby-build

3. Rubyとrbenvをインストールします。
rbenvとは複数のRuby実行環境の管理を簡単にするツールです。
Rubyには様々なバージョンがあり簡単に切り替えるためのものです。
今回は現時点で1番新しいrbenv 2.5をインストールして使用します。

cd
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bashrc
exec $SHELL -l
rbenv install -l
rbenv install 2.5.0;rbenv rehash
rbenv global 2.5.0
ruby --version

Rubyのバージョンも2.5になっています。

4. bundlerをインストールします
gemとはRubyのパッケージ管理システムです。
bundlerとは、gemの依存関係とバージョンを管理するためのツールです。

Rubyのパッケージ管理とバージョン管理ができるようになります。

gem install bundler --no-rdoc --no-ri
sudo rbenv rehash

Ruby on RailsとUnicornをインストールする

hogeというディレクトリにRuby on Railsのインストールする場合、

mkdir hoge
cd hoge
bundle init
vi Gemfile

Gemfileファイルの設定を変更します。

# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "rails"
gem "unicorn"

or

gem install rails
gem install unicorn
rbenv rehash

unicornとはプロセス上で動作するアプリケーションサーバーです。
デプロイ時のダウンタイムがなく起動も早いです。

下記コマンドを実行するとrailsとunicornが入ります。
「bundle exec rails new .」で質問がきたら「Y」で先に進みます。

bundle install --path=vendor/bundle
bundle exec rails new .
bundle install --path=vendor/bundle

Unicornの設定

configディレクトリの中にunicorn.rbを作成し下記内容で保存します。
hoge/config/unicorn.rb

worker_processes 2
listen '/tmp/unicorn.sock'
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
preload_app true
before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
old_pid = "#{ server.config[:pid] }.oldbin"
unless old_pid == server.pid
begin
Process.kill :QUIT, File.read(old_pid).to_i
rescue Errno::ENOENT, Errno::ESRCH
end
end
end
after_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

Unicornプロセスの開始

Unicornのプロセスを開始するときは下記コマンドを実行します。

unicorn_rails -c config/unicorn.rb -E development -D

Unicornプロセスの終了

Unicornのプロセスをプロセスを終了するときは下記コマンドを実行します。

#ps aux | grep unicorn | grep -v grep | awk '{ print "kill -9", $2 }' | sh

Nginxの設定でUnicornと連動させる

Unicornプロセスの開始したままNginxの設定をします。

vi /etc/nginx/nginx.conf

さきほどunicorn.rbでプロセス起動したunicornを使う設定にします。

http {
#今回関係のない部分省略
upstream unicornapp {
server unix:/tmp/unicorn.sock;
}
include /etc/nginx/conf.d/*.conf;
}

upstream unicornappの「unicornapp」の名前は自由に変更できますがあとで重要になりますので変更するときは要注意です。

Unicornを利用したバーチャルホストを作成します

vi /etc/nginx/conf.d/hoge.conf

を作成します。

中身は下記のように書きます。
ポイントはさきほど設定したnginx.confのupstream unicornappの「unicornapp」部分が
proxy_pass http://unicornapp;「unicornapp」に相当します。
upstreamを変更したらproxy_passも変更する必要があります。

server {
listen 80;
root /hoge;
include /etc/nginx/mime.types;
server_name hoge.com;
location / {
if (-f $request_filename) { break; }
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://unicornapp;
}
}

はじめてRuby on Railsに挑戦