CentOS で Ruby on Rails

Cent OS 5.8(64bit版)にRuby on Railsをインストール。以下、方針。

CentOSのバージョン確認方法

% more redhat-release

パッケージ管理ソフト yum

アップデート

% yum update

パッケージ検索

% yum search キーワード

インストール

% yum install パッケージ名

Ruby 1.9.xのインストール

ぷろぐらま:CentOSでのRails環境構築手順を参考にする。

LibYAMLからソースコードをダウンロードし、libyamlをインストールする。

% wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
% tar xvfz yaml-0.1.4.tar.gz
% cd yaml-0.1.4/
%  ./configure |& tee configure.log 
% make |& tee make.log
% sudo make install

zlib、OpenSSLをパッケージでインストール。

% sudo yum install openssl-devel zlib-devel

オブジェクト指向スクリプト言語 Rubyより、Ruby 1.9.3-p194のソースコードをダウンロードする。

% tar xvfj ruby-1.9.3-p194.tar.bz2
% cd ruby-1.9.3-p194
% ./configure --prefix=/usr/local
% make |& tee make.log
% make test
% sudo make install

alternativerubyを有効にする。

% sudo mv /usr/bin/ruby /usr/bin/ruby1.8
% sudo /usr/sbin/alternatives --install /usr/bin/ruby ruby /usr/local/bin/ruby 1000
% sudo /usr/sbin/alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.8 2000
% sudo /usr/sbin/alternatives --config ruby (これで/usr/local/bin/rubyを選ぶ)
% ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

rubygemのインストール

RubyGems.orgからソースコードダウンロードしてコンパイル

% tar xvfz rubygems-1.8.24.tgz
% cd rubygems-1.8.24
% sudo ruby setup.rb
% which gem
/usr/local/bin/gem
% gem -v
1.8.24

Ruby on Railsのインストール

SQLite3をパッケージでインストール

% sudo yum install sqlite.x86_64 sqlite-devel.x86_64

SQLite3とrubyとのパッケージをインストール

% sudo gem install sqlite3

新しいプロジェクトを作成する

% rails new demo
% cd demo
% vi Gemfile

Gemfileに以下を付け加える。

gem 'execjs'
gem 'therubyracer'

必要なgemライブラリーを追加する。

% sudo bundle install

nginxのインストール

事前準備。

% sudo yum install pcre-devel.x86_64


nginxへびにっき:CentOS 5にNginxをインストールするを参考にソースファイルからコンパイルする(Rails用に使う予定なので、 --http-fastcgi-temp-path は省略)。

% sudo /usr/sbin/useradd -s /sbin/nologin -d /usr/local/nginx -M nginx
% tar xvfz nginx-1.2.0.tar.gz
% cd nginx-1.2.0
% ./configure  \
  --prefix=/usr/local \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --with-http_stub_status_module \
  --with-http_ssl_module \
  --with-http_gzip_static_module \
  --with-http_realip_module \
  --http-log-path=/var/log/nginx/access.log \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --with-cc-opt="-O3" |& tee configure.log
% make |& tee make.log
% sudo make install

nginxの起動確認。

% sudo /usr/local/sbin/nginx (起動)
% sudo /usr/local/sbin/nginx -s quit (終了)

http://ホスト名/ でアクセスできなかったら、SU Linuxを疑う(私はそうだった)。以下のコマンドでHTTPとHTTPSを有効にする。

% sudo system-config-securitylevel-tui

起動スクリプトを作成する。Red Hat Nginx Init Scriptから起動スクリプトをダウンロードし、編集する。

% cp -p nginx nginx.org
% vi nginx
% % diff nginx.org nginx
22c22
< nginx="/usr/sbin/nginx"
---
> nginx="/usr/local/sbin/nginx"
29c29
< lockfile=/var/lock/subsys/nginx
---
> lockfile=/var/lock/nginx.lock

有効にする。

% sudo mv nginx /etc/init.d/
% sudo chmod 755 /etc/init.d/nginx
% sudo /sbin/chkconfig --add nginx
% sudo /sbin/chkconfig nginx on

ログローテートの設定(参考

% cd /etc/logrotate.d
% sudo touch nginx
% sudo vi nginx
% more nginx
 more nginx
/var/log/nginx/*log {
    missingok
    notifempty
    delaycompress
    sharedscripts
    postrotate
        /usr/local/sbin/nginx -s reopen
    endscript
}
% sudo /usr/sbin/logrotate -d /etc/logrotate.conf (設定ファイルの確認)

unicornの設定

passengerではなくunicornを使ってみることに。

milk1000cc:nginx + Unicorn を試してみたを参考に設定する。

unicornをインストール

% sudo gem install unicorn

続いて、RailsアプリのGemfileに追加し、読み込ませる。 /path/rails_app にRailsアプリがあるとき

% vi /path/rails_app/Gemfile
% cd /path/rails_app/
% bundle install

http://unicorn.bogomips.org/examples/unicorn.conf.rb をダウンロードし、 Tech Racho:次世代RailsサーバーUnicornを使ってみたmilk1000cc:nginx + Unicorn を試してみたを参考に書き直した(ほとんどそのまま。ログの吐き出し先だけ違う)。

% wget http://unicorn.bogomips.org/examples/unicorn.conf.rb
% mv unicorn.conf.rb /path/rails_app/config/unicorn.rb.org
% cd /path/rails_app/config/
% cp -p unicorn.rb.org unicorn.rb
% vi unicorn.rb
% diff unicorn.rb.org unicorn.rb
24c24
< working_directory "/path/to/app/current" # available in 0.94.0+
---
> #working_directory "/path/to/app/current" # available in 0.94.0+
28c28
< listen "/tmp/.sock", :backlog => 64
---
> #listen "/tmp/unicorn.sock", :backlog => 64
35c35
< pid "/path/to/app/shared/pids/unicorn.pid"
---
> pid File.expand_path('log/unicorn.pid', ENV['RAILS_ROOT'])
40,41c40,41
< stderr_path "/path/to/app/shared/log/unicorn.stderr.log"
< stdout_path "/path/to/app/shared/log/unicorn.stdout.log"
---
> stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
> stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
64,71c64,71
<   # 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
---
>    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

稼働しているかどうかを確認する。ポート番号8080で動いていたらOK。

% unicorn_rails -c config/unicorn.rb -E development (開発環境&プロセスとして起動)
% unicorn_rails -c config/unicorn.rb -E production -D (公開環境&デーモンとして起動)

nginxとunicornを連動させる

/etc/nginx.confの設定を該当部分だけ抜粋。

〜前略〜

http {
〜中略〜
    upstream backend-unicorn{
  	server localhost:8080;
    }
   
    server {
        listen       80;
        server_name  hogehoge.jp;

	# keep less damage of XSS
	# http://blog.monoweb.info/article/2012021823.html
	add_header X-XSS-Protection "1; mode=block";

	# keep less damage of Clicking jack
	# http://blog.monoweb.info/article/2012021823.html
	add_header X-Frame-Options DENY;

	# Prevent sniffing of IE
	# http://blog.monoweb.info/article/2012021823.html
	add_header X-Content-Type-Options nosniff;
	root /path/rails_app/public;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
		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_redirect off;
		if (!-f $request_filename) { proxy_pass http://backend-unicorn; }
                # proxy_passは上のupstreamで指定しているもの。

        #アクセス制限
		allow xxx.xxx.xxx.xxx/yy;
		deny all;	
        }

        # Asset pipelineの対応
        # http://d.hatena.ne.jp/milk1000cc/20100804/1280893810 
        location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
		expires 1y;
		add_header Cache-Control public;
		
		add_header Last-Modified "";
		add_header ETag "";
        }
   〜中略〜
}

こうした上で起動。

% cd /path/rails_app/
% unicorn_rails -c config/unicorn.rb -E production -D
% sudo /etc/init.d/nginx start

80番ポートで無事にアクセスできたら成功。サーバーの再起動時にunicorn自動起動させる方法を見つけないと。

PostgreSQL

続く。