ruby on rails触ってみる。(時々unicorn) その1

Ruby on Railsを触ってみたい。 手始めにこれをやりたい!

openbook4.me

今回の参考サイト

さくらのVPS を改めて使いはじめる 9 – Ruby、Redmine、Subversion – アカベコマイリ

http://henteco-labs.com/labs/2014/04/11/rails-app-server/#sec2-4

Rails x unicorn のアプリをサブディレクトリで動かす - @Konboi memo

次世代Ruby on RailsサーバーUnicorn(汎用のRackアプリケーションサーバ)を使ってみた

関連パッケージのインストール

$ sudo yum install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel mysql-devel httpd-devel ImageMagick ImageMagick-devel

Rubyソースダウンロード

$ cd
$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.3.tar.gz
$ tar zxvf ruby-2.1.3.tar.gz
$ rm ruby-2.1.3.tar.gz

ソースのコンパイル

$ cd ruby-2.1.3/
$ ./configure
$ make

checkinstallを使用したRPM

$ sudo checkinstall --fstrans=no

あ、checkinstallの導入について触れてなかった。。。 アカベコマイリさん参照

さくらのVPS を改めて使いはじめる 9 – Ruby、Redmine、Subversion – アカベコマイリ

インストール&バージョン確認

$ sudo rpm -ivh /root/rpmbuild/RPMS/x86_64/ruby-2.1.3-1.x86_64.rpm
$ ruby -v

ゴミ掃除

$ cd
$ sudo rm -rf ruby-2.1.3/

Gemバージョン確認

$ gem -v
2.2.2

Gemバージョン最新化

$ sudo gem update --system

Gemバージョン確認(再)

$ gem -v
2.4.2

Bundlerインストール

$ sudo gem install bundler --no-rdoc --no-ri

Railsインストール

$ sudo gem install rails

Railsバージョン確認

$ rails -v
Rails 4.1.6

node.jsインストール

$ cd
$ wget http://nodejs.org/dist/v0.10.32/node-v0.10.32.tar.gz
$ tar zxvf node-v0.10.32.tar.gz
$ rm node-v0.10.32.tar.gz

ソースのコンパイル

$ cd node-v0.10.32/
$ ./configure
$ make

checkinstallを使用したRPM

$ sudo checkinstall --fstrans=no

インストール&バージョン確認

$ sudo rpm -ivh /root/rpmbuild/RPMS/x86_64/node-v0.10.32-1.x86_64.rpm
$ node -v
v0.10.32

ゴミ掃除

$ cd
$ rm -rf node-v0.10.32/

アプリ生成(ここでは/var/rails/フォルダにtwitter-practiceというアプリを作成することとする)

$ sudo mkdir /var/rails/
$ cd /var/rails/
$ sudo rails new twitter-practice
・
つらつらと生成ログが出てくるけど読み飛ばす。
・

nginxとrailsの橋渡し役となるunicorn導入

$ cd twitter-practice
$ sudo vi Gemfile
-- ファイルの末尾に下記内容を追記する
# unicorn
gem 'unicorn', group: :development
-- ファイル編集終了後に下記コマンドを実行するとunicornがダウンロードされる
$ sudo bundle install

Railsの設定変更(今回作成するアプリをサブディレクトリとして公開するための設定)

$ sudo vi /var/rails/twitter-practice/config.ru
--以下の内容に書き換える
## run Rails.application
require ::File.expand_path('../config/environment',  __FILE__)

if ENV['RAILS_RELATIVE_URL_ROOT']
  map ENV['RAILS_RELATIVE_URL_ROOT'] do
    run Rails.application
  end
else
  run Rails.application
end

unicorn設定ファイルを編集する。

$ sudo touch config/unicorn.rb
$ sudo vi /var/rails/twitter-practice/config/unicorn.rb
--以下の内容に書き換える
rails_root = `pwd`.chomp

worker_processes 3
timeout 15
preload_app true

# TCPソケットで使う場合
# listen 3000
# Unixドメインソケットを使う場合(WEBサーバーと連携する場合)※1
listen "#{rails_root}/tmp/sockets/unicorn.sock"

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

# ログの設定方法.
stderr_path "#{ rails_root }/log/unicorn.log"
stdout_path "#{ rails_root }/log/unicorn.log"

before_fork do |server, worker|
  ActiveRecord::Base.connection.disconnect!
  old_pid = "#{ server.config[:pid] }.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # someone else did our job for us
    end
  end
end

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

  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end
end

※1 後述のnginxの設定と合わせる。

nginxの設定変更1(unicornとの連携)

$ sudo vi /etc/nginx/nginx.conf
-- httpブロック内に下記内容を追記
# プロキシサーバーを指定※1
upstream backend {
  server unix:/var/rails/twitter-practice/tmp/sockets/unicorn.sock;
}

※1 前述のnginxの設定と合わせる。

nginxの設定変更2(サブディレクトリ"twitter"アクセス時の挙動の設定)

$ sudo vi /etc/nginx/conf.d/default.conf
-- serverブロック内に下記内容を追記
  location ^~ /twitter/ {
    try_files $uri @proxy;
  }

  # プロキシに渡す設定
  location @proxy {
    proxy_set_header Host               $http_host;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host   $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_set_header Connection         "";

    proxy_http_version 1.1;
    proxy_redirect     off;
    proxy_pass         http://backend;
  }

  # 静的ファイルはNginxでレスポンス
  location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
    expires 1y;
  }

  location ~ /\..+ {
    deny  all;
  }

サンプルのビューとコントローラ生成。

$ cd /var/rails/twitter-practice/
$ sudo rails g controller users index show

アプリ起動

$ sudo bundle exec unicorn_rails -c config/unicorn.rb -E development -D --path /twitter

これでhttp://www.negimiso.net/twitter/users/showにアクセスできるようになった。

アプリ停止

$ sudo ps aux | grep unicorn
$ sudo kill -QUIT $PID

・頭が混乱してきたので自問自答コーナー

Q,今更だけどunicornって何よ。

A,HTTPサーバ

Q,わざわざ用意しないといけないの?

A,WEBrickというHTTPサーバがrubyに同梱されてて、こっちを使えばunicornは不要。

RailsWEBrickをデフォルトで使用するらしい。

Q,なんで突然unicorn導入したの?

A,興味本位としか言いようがない。

Q,本当に高性能なの?

A,WEBrickと違って、複数のプロセスが立ち上がって暇なプロセスがリクエストに対応する結果、快適らしい。

とはいっても、そもそもWEBrick使ってないし、ガッツリRailsアプリ作ったわけでもないので快適さが判らん上に比較もできない。 まずはバカ正直に標準的な手法で行くべきだったかなぁ?

小学生が5時間くらいで実装できたアプリを作るつもりが unicornとかに寄り道したおかげですでに5時間近く費やした気もするが、気にしないでおこう。

次回、改めて本題のRuby on Railsのアプリを作成してみませう。