CentOS7.0 + Ruby + Unicon環境構築

ちょっとづつまとめてみようと思う。
無駄がある気がするので修正依頼求む。

# OS状況確認
CentOS 7 (x86_64) with Updates HVM
https://aws.amazon.com/marketplace/pp/B00O7WM7QW
※user:'centos'

# Rubyインストール

## rbenvインストール
```shell-session:
sudo yum install git gcc make openssl-devel libffi-devel patch gcc-c++
cd
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

## rbenvインストール確認

```shell-session:
rbenv --version
```
※rbenv 0.4.0-140-gf87d876等が表示されればインストール完了

## ruby-buildインストール

```shell-session:
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
sudo git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```

##インストール出来るRubyバージョンを確認

```shell-session:
sudo rbenv install -l
```
以下のように表示されればOK
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249

```shell-session:
rbenv install 2.2.0
rbenv global 2.2.0
ruby -v
```

# Ruby環境設定

```shell-session:
gem update --system
gem install bundler
gem install unicorn
rbenv rehash
```
※unicornは後でインストールする為不要かも。

# Rails インストール
※公開ディレクトリが/opt/domainsの場合

```shell-session:
gem install rails
sudo yum install sqlite-devel
mkdir /opt/domains
cd /opt/domains
rails new <<Virtual Domain>>
```

#  インストール
※公開ディレクトリが/opt/domainsの場合

```shell-session:
cd /opt/domains/
sed -i "s/# gem 'unicorn'/gem 'unicorn'/g" <<Virtual Domain>>/Gemfile
sed -i "s/# gem 'therubyracer', platforms: :ruby/gem 'therubyracer', platforms: :ruby/g" <<Virtual Domain>>/Gemfile
echo "gem 'rb-readline'" >>  <<Virtual Domain>>/Gemfile
```

```shell-session:
cat <<_EOF_ > config/unicorn.rb
rails_root = File.expand_path('../../', __FILE__)

# ワーカーの数
worker_processes 2

# RAILS_ROOT を指定
working_directory rails_root

# ソケット
listen "#{rails_root}/tmp/sockets/unicorn.sock"

# PID
pid    "#{rails_root}/tmp/pids/unicorn.pid"

# ログ
stderr_path "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn_stdout.log"

# ダウンタイムなくす
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
_EOF_
bundle exec unicorn_rails -c config/unicorn.rb -p 3000 -E development -D
```

# Unicon 起動確認

```shell-session:
ps -ef | grep unicorn | grep -v grep
```

# Nginx インストール

```shell-session:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
sudo yum install nginx
```

# Webサーバ(Nginx)起動・公開

```shell-session:
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
```
*Webサーバ停止*

```shell-session:
kill -QUIT `cat tmp/pids/unicorn.pid`
```

# Webサーバ(Nginx)起動確認

ブラウザにてサーバIPにアクセスする
http://<<サーバIP>>

# NginxとUnicon連携

```shell-session:
cat <<_EOF_ > /etc/nginx/conf.d/vhost-<<サーバドメイン>>.conf
upstream unicorn {
  # nginxとunicornの連携
  server unix:/opt/domains/<<サーバドメイン>>/tmp/sockets/unicorn.sock;
}

server {
    listen 80;
    server_name <<サーバドメイン>>;

    root /opt/domains/<<サーバドメイン>>/public;

    access_log /var/log/nginx/vhost-<<サーバドメイン>>_access.log;
    error_log /var/log/nginx/vhost-<<サーバドメイン>>_error.log;

    client_max_body_size 100m;
    error_page 500 502 503 504 /500.html;

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

    location @unicorn {
      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://<<サーバIP>>;
  }
}

_EOF_
```

# NginxとUnicon連携確認

```shell-session:
sudo systemctl restart nginx.service
```

# 残課題

unicorn の自動起動
unicorn のログローテーション
Webサーバ経由で簡単にrailsの起動確認を行う


# その他関連URL

[Rails] APサーバの比較検証（Puma, Unicorn, Passenger）
http://blog.s21g.com/articles/2346
apache,nginx × passenger,unicornのベンチをとってみた
http://spring-mt.tumblr.com/post/19282358465/apache-nginx-x-passenger-unicorn