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分ぐらいでデプロイされた。
ブラウザでみると、こんなページができました。
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便利!