Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

SqaleでRailsアプリを高速サーバ「Rhebok」を使って起動する

Herokuに続き、Unicornの2倍のパフォーマンス発揮するRackサーバ「Rhebok」をパパボさんのPaaSであるSqaleで動かしてみる。15日間は無料お試しが出来るそうですよ。

Sqale - 開発者のためのホスティングサービス【スケール】 Ruby on Rails 対応。

Gemfileの用意

まず Gemfileを用意します。適当なディレクトリで

$ bundle init

して Gemfileを編集します

cat Gemfile
# A sample Gemfile
source "https://rubygems.org"
gem "rails", "4.2.0"

とりあえず最新のRails 4.2.0で固定して、bundle install

$ bundle install --path vendor/bundle

Railsアプリケーションの作成

$ bundle exec rails new . --skip-bundle

すると、途中でGemfileを上書きするか聞かれるので、そのままリターンで続行

    conflict  Gemfile
Overwrite /Users/kazeburo/Develop/sqale-rhebok/Gemfile? (enter "h" for help) [Ynaqdh]

上書きされたGemfileにRhebokを追加する

$ tail Gemfile
gem 'gctools'
gem 'rhebok', '>= 0.2.1'

OobGCを使う為にgctoolsも入れる。

ここまで出来たらbundle install

$ bundle install

Hello Worldだけでは面白くないので、Scaffoldを使ってアプリケーションのひな形を作る

$ bundle exec rails g scaffold msg nick:string body:text
$ bundle exec rake db:migrate 

ローカル環境で動くかどうか確認します。

$ bundle rails s

ローカルでRhebokを起動するには以下のコマンド

$ bundle exec rackup -s Rhebok -O MaxWorkers=1 -O OobGC=yes -O MaxRequestPerChild=0

Rhebokに変更しても問題なく動作すると思われます。

デプロイ準備

secrets.ymlのsecret_key_baseを設定する必要があります。今回はとりあえず環境変数にて設定してみました。

echo 'SECRET_KEY_BASE="'$(bundle exec rake secret)'"' > .env

Sqaleは.envというファイルに環境変数を書いておくと起動時に読み込んでくれます。ちなみに、SqaleではデータベースにMySQLを使う事ができますが、今回はテストなのでSQLiteのままいきます

Rhebokでアプリケーションを起動したいので、Procfileも書きます。

$ cat Procfile
app: bundle exec rackup -s Rhebok -O Path=/var/run/app/app.sock -O MaxWorkers=3 -O OobGC=yes -O MaxRequestPerChild=1000 -O MinRequestPerChild=500

Sqaleのコンテナはnginxとアプリケーションサーバが起動していて、間の通信にUnix Domain Socketを使うのが大きな特徴。なので、RhebokもUnix Domain SocketをListenさせる。

Rubyのバージョンを2.1.4に変更。ちなみに手元はrbenvを使わずにxbuildで2.1.5をいれてる

echo '2.1.4' > .ruby-version

vendorディレクトリをgitで管理しないようにして、git commit

$ echo '/vendor' >> .gitignore 
$ git init
$ git add .
$ git commit -m 'init'

最後に、sqaleにpush。

$ git remote add sqale ssh://sqale@gateway.sqale.jp:2222/userid/app_name.git
$ git push sqale master

最初は起動までに数分かかりました。2回目からは1分ぐらいでデプロイされた。

ブラウザでみると、こんなページができました。

f:id:kazeburo:20141227233921p:plain

SqaleにSSHして確認

ちゃんとRhebokで起動したか、SSHでコンテナにログインして ps コマンドを打ってみました。

$ ssh -p 2222 sqale@gateway.sqale.jp
sqale@app_name-1:~$ ps fax
  PID TTY      STAT   TIME COMMAND
 6816 ?        S      0:07 sshd: sqale@pts/0   
 6817 pts/0    Ss     0:00  \_ -bash
11236 pts/0    R+     0:00      \_ ps fax
   92 ?        S      0:00 nginx: worker process         
11133 ?        Sl     0:00 foreman: master                                                                                                                
11218 ?        Sl     0:02  \_ ruby /home/sqale/current/vendor/bundle/ruby/2.1.0/bin/rackup -s Rhebok -O Path=/var/run/app/app.sock -O MaxWorkers=3 -O OobGC=yes -O MaxRequestPerC
11223 ?        Sl     0:00      \_ ruby /home/sqale/current/vendor/bundle/ruby/2.1.0/bin/rackup -s Rhebok -O Path=/var/run/app/app.sock -O MaxWorkers=3 -O OobGC=yes -O MaxRequest
11226 ?        Sl     0:00      \_ ruby /home/sqale/current/vendor/bundle/ruby/2.1.0/bin/rackup -s Rhebok -O Path=/var/run/app/app.sock -O MaxWorkers=3 -O OobGC=yes -O MaxRequest
11229 ?        Sl     0:00      \_ ruby /home/sqale/current/vendor/bundle/ruby/2.1.0/bin/rackup -s Rhebok -O Path=/var/run/app/app.sock -O MaxWorkers=3 -O OobGC=yes -O MaxRequest

ちゃんと起動出来ているようですね〜

SSHで入ってログ見たり、straceでデバックしたり、killコマンドでアプリケーションの再起動できたりするのでSqale便利!