ApacheとNginxとPassengerとUnicornの違い【すごい初心者向け】

Amazon EC2の上でRailsアプリケーションを動かそうとして、サーバーを構築しようとしているのだけれど、Apache, Nginx, Passenger, Unicornなど色々な名前が出てくるものの、それぞれの役割がどう分担されているのかが分かりづらいのでメモすることにした。

自分も初心者に毛が生えた程度なので正確性はあんまり保証できないけど分かりやすさ重視でがんばってまとめたよ。

単純にサーバーを立ち上げて動きさえすればよいのであれば、

qiita.com

qiita.com

あたりを参考にすると良さそう。

この記事の対象読者

  • Webサーバってなにそれ?おいしいの?
  • さくらVPSとかEC2とかで泣きながらApacheの設定したことあるけど全く理解してない
  • ぐぐればぐぐるほど意味がわからなくなったのであきらめてる
  • Ruby on Railsをやろうとしているかherokuとかではすでにアプリを公開している

という感じのレベルの人。

すごく当たり前っぽいことも解説したりするし、正確性よりも比喩での分かりやすさを優先したりしているので、わかってる人には冗長かつ曖昧に感じる記述も多いかも。

とはいえ自分も勉強しながら書いているので、明らかに不適切なたとえだったりしたらご教示いただけると嬉しいです。

ことば

サーバ (Server)

プログラムとかファイルを保存しておいたり実行したりできるもの。

お手持ちのMacWindowsそれ自体もサーバとして動かすことができたりする。さくらVPSやEC2は、仮想空間で作ったサーバを外部に向けて貸し出している。

Webサーバ (Web Server)

HTTPリクエストを受け取ったときに、なんらかの反応を返すプログラム。

例えば、localhost/index.htmlにアクセスされると、サーバー内のindex.htmlファイルの中身を返す、という感じ。 VPSやEC2などのサーバにWEBサーバを立てると、そのサーバで外部に向けてWebサイトを公開したりできる。

Rack

Rubyアプリケーションで、URLを生成するときに使われるしくみ。

PHPなどと違って直接ファイルを参照しない場合に、URLに合わせてどの順番でどのファイルを参照するか、などを管理してくれる。RailsではURLに沿って直接ファイルを参照したりしないので、routes.rbで指定された通りにファイルを経由してviewを表示するという経過をたどるわけですが、その裏ではRackの恩恵に与っているわけです。

もうちょっと詳しく知りたい人はこちらがよさそう。

5分でわかるRack - Route 477

Rack Webサーバ(Rack Web Server)

RubyアプリケーションとWebサーバをつなぐための中間サーバ、として扱われることが多い。

通常のWebサーバはRackのような機能をサポートしていないが、Rack Webサーバを挟むことで、RubyアプリケーションなどをWebサーバ上で動作させることができる。

Rack Webサーバ単体でも機能するにはするみたいだけど、Apacheなどの既存のWebサーバはレスポンスの処理がうまいので、それらと組み合わせて使うことが多いらしい。

モジュール (※Webサーバにおけるモジュール)

デフォルトのWebサーバの機能にはないものを、外部から取り込んで使えるようにするもの。

ApacheとNginxとPassengerとUnicornの違い

ApacheとNginxはWebサーバ

Apache

すごく有名で広く使われているオープンソースのWebサーバ。

ドキュメントがwebにいっぱい落ちている。デフォルトの設定だとRailsアプリは使えない。

Nginx

エンジンエックスと読むらしい。すごい優秀なWebサーバ。

以下のsion_cojp氏によるベンチマークを見る限り、Apacheよりかなり速そう。

qiita.com

Apacheと同じくデフォルトだとRailsアプリは使えない。

ApacheとNginxの共通点
ApacheとNginxの違い
  • Apacheは古くから使われていてドキュメントが多い
  • Nginxは比較的速くて高負荷に強い

PassengerはApacheやNginxで使えるモジュール

Passenger

Phusion Passenger(非公式にはmod_railsとmod_rackともいう)はApache HTTP Server及びnginx用のフリー・モジュールである。

引用元: wikipedia

すごくざっくりいうと、ApacheやNginxをちょっと改造してRackアプリ(Railsアプリ)にも対応できるようにしてしまうモジュール。

Apacheとは比較的組み合わせやすい。

Nginxと組み合わせる場合は、ソースコードを改造してコンパイルしなければいけないとのことで、ちょっとめんどくさそう。

UnicornはRack Webサーバ

UnicornはそもそもRackアプリに対応するために作られたRack Webサーバで、単体でも動作する模様。なんだけど、公式が

Designed for Rack, Unix, fast clients, and ease-of-debugging. We cut out everything that is better supported by the operating system, {nginx}http://nginx.org/ or {Rack}http://rack.github.io/.

(超絶意訳:RackとUnixと高速なクライアント向けに簡単にデバッグできるように作ったよ。nginxとかRackとかOSと相性が良くなるように調整したよ。)

defunkt/unicorn · GitHub

と言っているのもあり、nginxと組み合わせて使うことがほとんどのようだ。

Unicorn Workerというものを使ってリクエストに対応しているらしく、サーバのダウンタイムなしでデプロイできるのが強みらしい。

ThinやPumaなども含めてRackアプリの総合的な比較などをしている記事があったので、もっと詳しく知りたい方はどうぞ

www.engineyard.co.jp

ということでNginx + Unicornを使うことにした

なんか速そうなのと、ダウンタイムなしでのデプロイというのが魅力的なので、自分はNginx + Unicornを使うことにします。

標準的なAmazon EC2環境でのNginx + Unicorn環境構築も、既存記事などに過不足を感じれば作るかもしれません。

ということで、Railsアプリ関連のサーバ構築に関する悩みが少しでも解消されれば幸いです。