2012年8月19日日曜日

Herokuのwebサーバをthinに変更する

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よりサクサクと動くはずです。

今回はちょっと長くなりましたね。お疲れさまでした。
以上です。


参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...