Apacheよりnginxの方が早い、という話を聞きました。それぞれのメリット/デメリットや速度比較について調べた内容をまとめます。
そもそもApacheとnginxは駆動方式が違う
- Apacheとnginxの大きな違いは駆動方式の違い。詳しくは下記サイトがわかりやすい。
http://dream-web.info/2013/12/19/533/ - Apacheは、プロセス駆動アーキテクチャでマルチプロセス。これは、各リクエストをプロセスに割り当てて処理を行う。リクエストが大量に来た際、プロセスが同時に起動するのでオーバーヘッドが非常に大きくなるというデメリットがある。
- nginxは、イベント駆動アーキテクチャ、シングルスレッドモデル。
シングルスレッドでループ処理をまわし、キューに溜まったイベントを処理していく処理方式(イベントループ方式)(node.jsなどでも採用)。プロセス数はCPUコア数と基本的には同じに設定。 - イベントループ方式を採用することで、少量のプロセスだけで大量のリクエストを処理することが可能。「C10K問題(ハード性能的には問題ないが、クライアントの数が多くなるとサーバがパンクする場合がある。プロセス番号が足りなくなる。UNIX系OSだと最大32767。)」が解決される。
- 参考 http://www.slideshare.net/yujiotani16/nginx-16850347
http://www.slideshare.net/ttkzw/nginx-intro
駆動方式の違いが具体的にどのように影響するか
- nginxの方が、処理が軽く、大量のリクエストを処理するのに向いている。
- nginxの方が、設定ファイル(nginx.conf)がApacheと比較してもより直感的で柔軟に設定を行うことが可能。
- nginxは、CPUリソースがたくさん必要な処理には向いていない。処理時間が長くなる処理を実行した際、そこでプロセスがブロックされてしまい処理能力が落ちてしまう。
比較調査例
- 単純に考察するとApacheよりもnginxの方が1.47倍処理能力が高い結果
引用元) http://webkaru.net/linux/nginx-apache/ - 同時10接続の20回アクセス条件であれば、圧倒的にApacheよりNGINXが優位。
Apacheが機能拡充を目指したのに対して、NGINXは大量処理、スピード重視を徹底的に追求
引用元) http://d.hatena.ne.jp/omiyan/20101213/1292187680 - しかしながらApacheもマルチプロセッシングモジュール(event_mpm)の設定を正しくチューニングすることで、nginxに及ばないまでも、かなりのパフォーマンスを期待出来る
引用元) http://blog.matsumoto-r.jp/?p=2996
考察
負荷が高くなく、早期セットアップが必要な場合は「Apache」
負荷が高く、スケーラビリティが要求される場合は「nginx」
静的ページに同時多数のアクセスが想定される場合は「nginx」
動的ページは処理内容やサーバスペックによるため現状では判断できない(要調査)
ある程度の同時アクセスが見込めない場合は「Apache」
同時アクセス数は小さく、単純にリクエスト数が多い場合は「Apache」
http://vitalify.jp/blog/2012/08/apache%E3%81%A8nginx%E3%82%92%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E6%84%9F%E6%83%B3.html
※ http://www.slideshare.net/ttkzw/nginx-intro のサイトによると動的コンテンツはapacheの方が早いっぽい。