Ruby on Rails3で作成したアプリをHeroku上でthinを利用して動作させるためのまとめです。
環境はruby-1.9.3-p0, rails3.2.2, postgres, Herokuです。
難易度★★★★☆
thinに変更したほうが良い理由
Heroku上のrailsアプリは、デフォルトだとWebrickが動いています。
Webrickはデフォルトで使われるWEBサーバーですが、パフォーマンスがかなり悪いです。
Herokuでも実運用ではthinを使うように推奨しています。
thinはコンパクトでWEBrickよりも速く技術的にも枯れていて、普通のWEBサイトであれば十分な性能をもっています。
フリー(無料)で変更できるの?
現在(2012/8月)確認した限りは無料で変更できます。add-onと異なりクレジットカードの登録をしていなくても大丈夫です。
利用しているWEBサーバーを調べる
Heroku上のrailsアプリは、デフォルトだとWebrickが動作しているはずです。
herokuにログインしてコマンドで確認してみましょう。
heroku ps
以下が結果です。
Process State Command ------- ---------- --------------------------------- web.1 up for 45m bundle exec rails server -p $PORT
上記表示の「bundle exec rails server -p $PORT」の場合はWebrickが動作していることを示しています。
アプリのGemfileにthinを設定
さっそくthinを導入しましょう。アプリのフォルダに移動します。
vi Gemfile gem 'thin' bundle install
installに成功したら、ローカルでthinサーバーの動作を確認すると良いでしょう。
ローカルで動かす場合はrails server thinでthinを起動することができます。
Procfile(プロックファイル)を変更する
HerokuでWebrickをthinに変更するには、Procfileを変更する必要があります。
Procfileには、アプリケーションで動かすプロセスタイプのリストを記述します。
プロセスタイプには、web, worker, urgentworker, clock等があります。
先ほどのWebrickのプロセスはwebプロセスになります。
Process State Command ------- ---------- --------------------------------- web.1 up for 45m bundle exec rails server -p $PORT
foremanを導入
Procfileの変更は、foremanというgemを利用して確認します。
この情報はかなり少なかったので苦労しました(Heroku使っている人はWebrickのままなのかな?)
これは、HerokuのDavid Dollar氏が作成したgemで、Herokuでも採用されています。
このforemanは依存するバックグラウンドプロセスを簡単に管理できます。
それでは、アプリに導入しましょう。
vi Gemfile gem 'foreman' bundle install
installに成功したらProcfileを作成します。
vi Procfile
以下の行を追加します。
web: bundle exec rails server thin -p $PORT -e $RACK_ENV
Procfileが完成したら、内容が正当かどうかをforeman checkコマンドを実行してチェックします。
foreman check valid procfile detected (web)
上記のメッセージが出れば正常です。$RACK_ENVをセットするファイルを作成します。
echo "RACK_ENV=development" >>.env
準備完了です。プロセスを起動します。
foreman start 06:10:13 web.1 | started with pid 2027 06:11:50 web.1 | => Booting Thin 06:11:50 web.1 | => Rails 3.2.2 application starting in development on http://0.0.0.0:5000 06:11:50 web.1 | => Call with -d to detach 06:11:50 web.1 | => Ctrl-C to shutdown server 06:11:50 web.1 | >> Thin web server (v1.4.1 codename Chromeo) 06:11:50 web.1 | >> Maximum connections set to 1024 06:11:50 web.1 | >> Listening on 0.0.0.0:5000, CTRL+C to stop 06:11:50 web.1 | >> Stopping ... 06:11:50 web.1 | >> Stopping ... 06:11:50 web.1 | Exiting 06:11:50 web.1 | exited with code 0
OKですね。ローカルでアプリの動きを確認する場合はportを5000にして接続します。
コミット
確認を終えたら、上記の変更をgitでコミットします。
このとき.envファイルはgitで記録しないようにします。
heroku更新
あとはいつもと同じgit push heroku masterでherokuを更新します。
thinで動作していることを確認
heroku ps Process State Command ------- ---------- ------------------------------------ web.1 up for 43s bundle exec rails server thin -p $..
Commandがbundle exec rails server thinになっています。
thinでアプリが動作しているのが確認できますね。
変更後は動きを確認してみると良いでしょう。Webrickよりサクサクと動くはずです。
今回はちょっと長くなりましたね。お疲れさまでした。
以上です。
参考サイト
- Rubyのhttpサーバまとめ 2012年4月版(thin, Unicorn, Passenger, etc)
- Getting Started with Rails 3.x on Heroku
- Dyno調べた。これが今の限界。
- Introducing Foreman
- Foreman railscast
0 件のコメント:
コメントを投稿