by 佐藤高志 氏
- Apache はマルチプロセス、マルチスレッド
- 単純な HTTP の仕組み accept() -> read() -> write() の loop
- このままでは複数接続を同時に扱えない
- 上記の処理を複数走らせることで複数処理を実現させる
- prefork, worker
- 利点
- シンプルでわかりやすい
- 欠点
- プロセスもスレッドもそれ自体のオーバーヘッドが大きい(メモリ Cpuのコンテキストスイッチ)
- 大きな同時接続に対応しようとすれば、それだけ上記負荷が増える
- thread を新規で作ると 1MB ほど使う(Linux の場合)
- Nginx はイベント駆動アーキテクチャ
- accept(), write(), read() に分割する
- TCP接続の状態を調べて、処理可能になった処理を呼び出すイベント駆動マシンを用意する
- 各処理の後、イベント駆動マシンに戻る
- 各プロックの処理の間は他の接続を処理できない
- 利点
- 同時接続数が増えてもプロセスやスレッドは増えないため、オーバーヘッドが少ない
- 欠点
- イベントをバラバラと書くためソースコードが複雑でわかりにくいという意見がある
- あらゆる時間のかかる処理をイベント駆動している
- Apache EventMPM は残念ながらイベント駆動化されているのはクライアントとネットワークI/Oのみ
- それを補うため、マルチプロセス・マルチスレッドとイベント駆動のハイブリッド
- イベント駆動は 1 つの CPU しか使用できない
- イベント駆動のスレッドを複数用意することが多い
- read() が可能かどうか確認してから read() する (I/O 多重化)
- nginx は非同期 I/O も使用している
- Apache Software Foundation
- 営利企業ではなくコミュニティにおいて開発意欲のある人が開発に参加
- 営利企業による開発
- 一般の開発者はコミット権をもっていない(社員のみ)
- ドキュメントについてはコミュニティベース
- メーリングリスト、バグ管理システムは公開されている
- 両者とも同じような機能を持っている
- Nginx のほうが後発なこともあるのか、Apache にない視点での機能がある(動画のストリーミング機能等)
- Apache の標準にはない SPDY 対応がある(Apacheは標準には入る予定は今のところ無い)
- マニアックなところまで module 化している
- ロードバランシングのアルゴリズムを module 化していたりとか
- Nginx は無停止で設定変更や version up ができる機能がある
- Apache には graceful があるが・・・version up まではできない
- Nginx のほうがソースコードが読みやすい感がある
- Apache は非常に長かったり。ネストしすぎな関数がちらほらあったりする
- API 仕様が不明確だったりする
- Nginx は後発なこともあってよく考えられて作られている
- Apache 3.0 構想がちょいちょいメーリングリストで出てきている