お名前.com VPS(KVM)にRVM+Ruby1.9.3+Rails3+Capistrano+Unicorn+nginxな環境を作ったお話

自鯖が入用だったので、いい機会だったのでVPSを契約することにしました。で、Rails環境を整える必要があったので、色々挑戦してみた記録です。契約から2日がかりで、正直結構大変でした。

メモは一切とってなかったので思い出しながら書いています。

サーバの環境

今回、お名前.com VPSに契約してみることにしました。これは、GMOが運営しているVPSで、レンタルサーバーの方は散々なクソ評価だったりするのですが、VPSについてはそれ程ひどい話は聞いていない*1ので2Gプランを12ヶ月契約しました。もっとも今は15日間無料トライアル中です。

以下、適当なメモです。

  1. 契約には電話認証が必要。契約処理を終えると、VPSのコントロールパネルにログイン出来ます。
  2. 初めに、標準OSとしてCentOS6がインストールされます。これは強制です。
  3. Debianが良かったので、即「OS再インストール」しました。
    • この時点で、VPS上のOSに関してはコントロールパネルのSSH Key Pairの意味がなくなります。VPSの稼働しているサーバへISOなどを送る時にはまだ使えるようです。
    • ディスク構成という項目があって、この時「基本ディスク」と「追加ディスク」というオレオレ用語が出てきます。これが謎です。とりあえずカスタムで40GBにしてみましたが、全部(200GB)でもいいのだと思います。
  4. Debinaのインストールディスクが差された状態になるので、起動するとコンソール画面にインストールの初期画面が出てきます。あとは普通にインストール。
    • LVMにしたので、とりあえずrootとswap以外はパーティションは分けませんでした*2
    • GUIは要らないし、Webサーバなども後で自分で入れることにし、sshdだけDebianに入れてもらいました。
  5. sshが繋がるか確認
    • 鍵の設定
  6. パッケージを色々
    • まずはGCCとかmakeとかgitとか。
    • Rubyについては、apt-getは使わずrvmを使いました。
      • インストール済みのRubyをrvmに組み込むことは出来ないので、RVMを使うことが決まっていて、且つまっさらな状態なら、最初からRVMを使うのが良いと思います。
      • 後で問題になるので、rvm install ...する前に、openssl*3などを入れておいた方が良いです*4

Capistrano+Unicorn+nginx

RailsによるアジャイルWebアプリケーション開発」にはApache+Passengerの方法が乗っていますが、風のうわさでUnicorn+nginxが速いという話を聞いたので、挑戦してみました。

一応整理しておくと

Capistrano
効率的にデプロイやサーバの操作をするためのツール。
Apache
言わずと知れたWebサーバの代表格
Passenger (Phusion Passenger)
mod_railsとかmod_rackとも呼ばれるらしい。つまるところRailsApacheモジュール*5
nginx
最近流行りのWebサーバ。だけどリバースプロキシとしての注目度の方が高いようです(?)。
Unicorn
汎用Rackサーバ。とにかく速い(らしい)。

よく見るとUnicornもnginxもWebサーバなのですが、Railsを動かす部分をUnicornに、静的な部分をnginxに担当させることで高速化が達成されているようです。

ということで、以下適当な手順まとめです。

  1. nginxを入れる。# apt-get install nginx
    • nginxの設定は"/etc/nginx/"以下にあります。
      • Apacheと同様なDebian流のファイル構成になってます。sites-availble以下に個別のサーバの設定を書いてsites-enabledからシンボリックリンクを貼ると、有効になる仕組みです。
    • 起動や終了もDebian流に# /etc/init.d/nginx ...でできます。
    • 静的ファイルのルーティングと、それ以外をunicornのsockに丸投げする設定をします。
  2. Capistranoの設定
    • deploy.rbについてはRails本は使えないので適当に調べて設定します。頑張ります。
    • 詰まった点:
      • サーバはRVM使用、ローカルはRVM不使用だったので、エラーが出た→"rvm-capistrano"をgemで入れたら大丈夫だった。
  3. Unicornの設定
    • "config/unicorn.rb"に色々書きました。
    • sockファイルの位置など、色んなところに影響する設定があり、あまりスマートとは言えないような気もします。
    • 詰まった点:
      • working_directoryは"/path/to/deploy/current"と言った感じで"current"が必要でした。
  4. デプロイ(cap deploy)してGemの依存の解決を頑張る
    • deploy.rbでrequire "bundler/capistrano"しておくと、デプロイ時に自動でbundle installされます。
    • imagemagickが足りないだの、opensslがどうだのひたすらtry and errorです。
    • 謎な点:
      • bundle packしても、どうもサーバ側でもインストールとか色々やってるみたい。bundle pack意味あるのか…?

おまけ:Gemfile

一部載せておきます。

gem 'capistrano'
gem 'capistrano_colors'
gem 'rvm-capistrano'

group :production do
  # web server for Rack
  gem 'unicorn'
end

参考

  1. 花見の季節にさくらVPS: Nginx+Unicorn+Rails+Capistrano #nginx #Rails #Ubuntu #unicorn #capistrano - Qiita

他にも、色々見ましたがメモしてないので悪しからず。

*1:さくらより性能がいいとかいう話もあるくらい。

*2:Debianのプリセットで初心者向けというやつを選べば勝手にそうなります

*3:aptではlibssl-dev

*4:zlibとかも多分必要

*5:nginxでも使えるらしい