Warning: count(): Parameter must be an array or an object that implements Countable in /home/xs638785/agile-software.site/public_html/wp-content/plugins/rich-table-of-content/functions.php on line 490
ミドルウェアとは
- コンピュータを制御するオペレーティングシステム(OS)と、特定の処理を行うアプリケーションソフトウェアとの仲立ちをするソフトウェアのこと
- OSの基本的な機能だけでは、アプリケーションソフトが必要とする機能(サーバやデータベースとのやり取りなど)をカバーできない場合があり、必要な機能を集約してパッケージとしてまとめたものがミドルウェア
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と呼ばれるシングルスレッドのプロセスを複数利用している
- リバースプロキシ(特定のサーバへの要求を必ず経由するように設置されたプロキシサーバ)やロードバランサ(負荷分散装置)の機能も有している
- キャッシュ付きのリバースプロキシ機能によって、メインサーバの代理としてコンテンツの送信を行い負荷を分散することができる
- 詳しいアーキテクチャについてはNginxのアーキテクチャについて理解するの記事を参照
起動してみる(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を選択する場合
- 負荷が低く、早期または簡易的なセットアップが必要な場合
- 同時アクセス数が小さく、単純にリクエスト数が多いような場合