Cent OS 5.8(64bit版)にRuby on Railsをインストール。以下、方針。
- Ruby 1.9はソースコードからコンパイル
- Webサーバーは ngix + unicorn
- データベース管理ソフトは PostgreSQL
CentOSのバージョン確認方法
% more redhat-release
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
alternativeでrubyを有効にする。
% 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
PostgreSQL
続く。