メモ。
Rack
- Rack: a Ruby Webserver Interface
- http://rack.github.io/
Web アプリケーションサーバの共通 API。Python で言うところの WSGI にあたる。
オプションひとつでサーバを切り替えたりできる。
- Ruby Freaks Lounge - 第23回 Rackとは何か(1)Rackの生まれた背景
- http://gihyo.jp/dev/serial/01/ruby/0023
- Ruby Freaks Lounge - 第24回 Rackとは何か(2)Rackの使い方
- http://gihyo.jp/dev/serial/01/ruby/0024
- Ruby Freaks Lounge - 第25回 Rackとは何か(3)ミドルウェアのすすめ
- http://gihyo.jp/dev/serial/01/ruby/0025
gihyo.jp に掲載された連載記事のうち、Rack を紹介している回。
Sinatra
公式サイト。背景画像がフランクな雰囲気を醸し出している。
公式サイトの紹介記事。
- やゆぐ - Sinatra超完全解説 (1) Classic Style と Modular Application
- http://moji.yayugu.net/sinatra01/
- やゆぐ - Sinatra超完全解説 (2) テンプレート
- http://moji.yayugu.net/sinatra02/
紹介記事・入門記事で使われている書き方は Classic Style と呼ばれ、簡単な Web アプリを書くのには便利。
しかし、フレームワークの作りとしては Sinatra::Base を継承したクラスを明示的に作る Modular Application スタイルが基本とのこと。
WEBrick
- Ruby 2.1.0 リファレンスマニュアル - webrickライブラリ
- http://docs.ruby-lang.org/ja/2.1.0/library/webrick.html
Ruby に付属しているライブラリ。Java Servlet を参考にしている?
最初、Rack とかよく知らなくて「わー、標準でこんなライブラリあるんだー」と思って使ってみたんだけど、ファイルアップロードを受けると、ファイル全体を丸ごとメモリに持ってしまうようだ。開発用とか、ちょっとした Web ベースのツールを作りたいとか、そういう時に向いているのかな。
WEBrick も Rack に対応しているので、後々のことを考えると、WEBrick で十分だとしても WEBrick 独自のクラスを使わずに Rack ベースで実装した方がよさそう。それなら後で困ったらサーバだけ変えられるし。
Unicorn
- Unicorn: Rack HTTP server for fast clients and Unix
- http://unicorn.bogomips.org/
Rack に対応した Web アプリケーションサーバ。
- 次世代Ruby on RailsサーバーUnicorn(汎用のRackアプリケーションサーバ)を使ってみた
- http://techracho.bpsinc.jp/piichan1031/2010_07_09/2075
Unicorn は子プロセスを立ち上げてワーカにするらしい。プロセスは作ったり殺したりするのがスレッドより簡単なので、それを活用していろいろできるよ、ということらしい。さらに、プログラムを入れ替える際に無停止でいけるらしい。
2010 年の記事。
- As Sloth As Possible - UnicornとかRainbows!とかの話
- http://faultier.blog.jp/archives/1782956.html
Unicorn のプロセスについて、他の Web サーバとの比較に基づいての解説記事。
どうも、Unicorn についての解説記事の多くはプロセスの扱いについて触れられているようだ。
ワーカがプロセスというかたちで直接さわれるので、色々工夫のしがいがある反面、処理に時間がかかるリクエストがあると 1 プロセス占有されてしまうといった弱点もあるようだ。
Puma
- A Modern, Concurrent Web Server for Ruby - Puma
- http://puma.io/
ピュッ!!
- Develop with pleasure! - ruby on puma
- http://techmedia-think.hatenablog.com/entry/20121115/1352987586
Puma の紹介記事。Unicorn とは異なり、1 プロセスでスレッドプールを使って処理しているらしい。
どの Ruby で動かすかが問題で、「RubiniusやJRubyのような並行性を持つRubyの実装を使うことを前提に設計されてて」「MRIの実装を使うと、GIL(Global Interpreter Lock)の制限があるので結局同時に実行可能なスレッドは1つだけになる」とのこと。
サーバの比較
- uu59のメモ - Rubyのhttpサーバまとめ 2012年4月版(thin, Unicorn, Passenger, etc)
- http://blog.uu59.org/2012-04-18-ruby-httpd.html