nginx
Apache
ミドルウェア

ApacheとNginxについて比較

まずはじめに。


ミドルウェアとは


  • コンピュータを制御するオペレーティングシステム(OS)と、特定の処理を行うアプリケーションソフトウェアとの仲立ちをするソフトウェアのこと。

  • OSの基本的な機能だけでは、アプリケーションソフトが必要とする機能(サーバやデータベースとのやり取りなど)をカバーできない場合があり、必要な機能を集約してパッケージとしてまとめたものがミドルウェア。

image.png

image.png


WEBサーバーソフトウェアとは


  • ミドルウェアの一つ。

  • HTTPリクエストを送った時に、何かしらのレスポンスを返すプログラム。


Apacheとは


  • アパッチと読む。

  • 正式名称は「Apache HTTP Server」。

  • オープンソースソフトウェア(OSS)で、無償で誰でも利用可能。

  • マルチプロセスモデル(接続ごとにプロセスをフォーク≒コピーする)なのでメモリがいっぱいになりやすい。


    • つまり、リクエストを処理するごとにリソースが枯渇していってしまう。



  • モジュールにより基本機能を拡張可能できるようになっている。


    • これを利用すればイベント駆動モデルにもできるが、Nginxの方が性能には及ばないらしい。



  • CMS(Contents Management System)を利用する際に、比較的簡単な設定で済む。

  • 約20年間OSSとして公開され、バージョンアップした結果により信頼性が高い。

  • 最近はnginxと同じぐらいのシェア率。


起動してみる(Mac)

$ php -v

$ httpd -v
$ sudo apachectl start[stop]

確認 : localhost:80 にアクセス

設定ファイル : /etc/apache2/httpd.conf


Nginxとは


  • えんじんえっくすと読む。

  • Apacheと同じく、OSS。

  • Apacheと比較して、Nginxは速くて高負荷に強い

  • C10K問題をはじめ、大容量のデータ配信や大量同時接続に耐えることを目的に設計された


    • C10K問題について、「C」は「Client(クライアント)」、「10K」は「1万台」を表し、(ハードウェアやネットワーク性能に問題がなくても)同時クライアント接続数がある一定数を超えるとサーバがパンクしてしまう問題のこと。



  • ノンブロッキングI/Oと非同期のイベント駆動アーキテクチャを採用することで、同時接続数がApacheの10~100倍ぐらいになる。


    • nginxはworkerと呼ばれるシングルスレッドのプロセスを複数利用している。



  • リバースプロキシ(特定のサーバへの要求を必ず経由するように設置されたプロキシサーバ)やロードバランサ(負荷分散装置)の機能も有している。


    • キャッシュ付きのリバースプロキシ機能によって、メインサーバの代理としてコンテンツの送信を行い負荷を分散することができる。




起動してみる(Mac)

$ brew install nginx

$ nginx
$ nginx -s stop

確認 : localhost:8080 にアクセス

設定ファイル : /usr/local/etc/nginx/nginx.conf


それぞれのメリット/デメリット


  • Apacheとnginxの主な違いは駆動方式にある。

  • Apacheは、マルチプロセスのプロセス駆動アーキテクチャ


    • 各リクエストをプロセスに割り当てて処理を行うため、リクエストが大量に来た際に、プロセスが同時に起動するのでオーバーヘッド(負荷処理)が非常に大きくなるというデメリットがある。



  • Nginxはシングルスレッドモデルのイベント駆動アーキテクチャ


    • Node.jsと同じく、イベントループ方式(シングルスレッドでループ処理をまわし、キューに溜まったイベントを処理していく処理方式)。

    • イベントループ方式を採用することで、少量のプロセスだけで大量のリクエストを処理することが可能。

    • これにより、C10K問題を解決できている。




考察


  • Nginxの方が、処理が軽く大量のリクエストを処理するのに向いていおり、設定ファイルがより直感的で柔軟に設定を行うことが可能。

  • 一方、NginxはCPUリソースがたくさん必要な処理には向いていない。


    • これは、処理時間が長くなる処理を実行した際、そこでプロセスがブロックされてしまい処理能力が落ちてしまうため。



  • 処理能力に関して、ApacheよりもNginxの方が1.47倍高い結果もでている。


    • ※Apacheもモジュール(event_mpm)の設定を正しくチューニングすることで、Nginxに及ばないまでも、かなりのパフォーマンスを期待することができる。




結論


Nginxを選択する場合


  • 負荷が高く、スケーラビリティが要求されるような場合。

  • 静的ページに同時多数のアクセスが想定されるような場合。


Apacheを選択する場合


  • 負荷が低く、早期または簡易的なセットアップが必要な場合。

  • 同時アクセス数が小さく、単純にリクエスト数が多いような場合。


参考文献