NginxとApacheを比較!メリット・デメリットも紹介
数多くあるWebサーバの中でも根強い人気がある「Apache(アパッチ)」と人気急上昇中の「Nginx(エンジンエックス)」。Webサーバはシステムの基盤の重要な部分です。理解せずに使うとクライアントへのレスポンスにも影響を与えます。本記事では「Apache」と「Nginx」のWebサーバを比較しながらメリット・デメリットを紹介します。
目次
ApacheとNginxの基本情報
Apacheとは?
ApacheはApacheソフトウェア財団によって開発されたOSSです。元々は米国立スーパーコンピュータ応用研究所 (NCSA) が開発したNCSA HTTPdに改良という形で開発が行われていました。
その後、2000年頃にBrian Behlendorf(ブライアン・ベレンドルフ)の手によってソースコードは完全に書き換えられました。彼はApacheの基盤を作成した主要開発者です。
Apacheの正式名称はApache HTTP Server(アパッチ エイチティーティーピー サーバ)。
名前の由来はアメリカインディアンの一民族であるアパッチ族への尊敬の念を込めて付けられたのことです。
Nginxとは?
NginxはNginx,Inc.のCTOのIgor Vladimirovich Sysoev(イーゴリ・ウラジーミロヴィチ・シソエフ)によって開発されたOSSです。2002年に開発が始まり、2004年に初公開されました。
その頃もApacheのWebサーバが絶大な人気がありました。しかし、Apacheの仕組み上どうしても発生しうる問題がありました。それがC10K問題です。
その問題をきっかけにNginxが開発され始めました。
C10K問題とは?
「C10K問題」(クライアント1万台問題)とは、同時接続するクライアントが多すぎるとソフトウェア上の問題によりサーバーがパンクしてしまうことです。
例えば想定されるのがプロセス番号です。
UNIX系のOSの場合、メモリ上でプログラムに与えられるプロセス番号は符号付き16ビット整数と決まっています。言い換えるとプロセスは1~32767までの番号が割り付けられます。つまり、1リクエストに対して1つのプロセスを生成するWebサーバ(Apache)の場合、約3万リクエストが最大の同時接続数となります。
ハードウェアの性能上問題がなくてもアーキテクチャ(設計)によってはソフトウェアで上限が決まっているということです。
Apacheについて詳しく知る
ApacheとNginxの違いを説明する前に、もう少しApacheの詳細について見ていきましょう。
ここでは、Apacheが使われるWEBサーバーとは何かという基本的な部分からモジュールを使った機能拡張、WEBサイトの開発言語であるPHPとの関係性などの少し踏み込んだ内容まで解説します。
これらを知っておくことで、WEBサーバーに導入されるソフトウェア全体を理解しやすくなります。
WEBサーバーとは何か?
WEBサーバーとはWEBサイトの閲覧者とアプリケーションの間に立って、双方のリクエストを処理し、閲覧に必要なファイルを配置するサーバーです。
アプリケーションが動作するAPサーバー、データーベースが搭載されたDBサーバーと比べて、一番ユーザーに近いものです。
WEBサーバーで使うハードウェア自体は特別なものは必要なく、ApacheなどのWEBサーバー用ソフトウェアをインストールすることで、WEBサーバーとしての役割を与えます。
WEBサーバーを介したやりとりで使われるプロトコル(通信を行う際の手順やルールを決めたもの)をHTTPと呼びます。皆さんはWEBサイトのURLの先頭にあるhttpはプロトコルの名前から来ているのです。
モジュールを使った機能拡張
Apacheは特定の企業や組織によってサポートされていないオープンソースのソフトウェアですが、世界中のユーザーによって日々機能が改善されています。
そのため、モジュールといった形で配布されたプログラムを使って、機能拡張が可能です。モジュールはこれまでで120種類以上がリリースされています。
モジュールの名前は、「mod_拡張対象となる機能」といった書式で記載され、例えばキャッシュ(よくアクセスするデータをアクセスしやすい場所に一時的に配置すること)の仕組みを持ったモジュールは、「mod_cache」という名前になります。
PHPとApache
PHPはWEBサイトの開発で使われるバックエンドのプログラミング言語です。逆にHTMLはWEBサイトの画面などフロントエンドの開発で使う言語として有名ですね。
ApacheとPHPはいずれもWEBサーバー上で動作するという点で共通します。WEB開発ではApacheにPHPをインストールするケースが多々あります。
PHP自体もApache上での開発を可能にするため、数多くのApache関数を持っているのです。
Apacheの設定ファイル
Apacheへの設定は、httpd.confというファイルに記入されています。Apacheで使われる設定はこのファイルに記述されることが多いです。
具体的にはWEBサーバーのドメイン名やポート番号、ディレクトリのパス、障害時の通知先メールアドレスなどが含まれます。
ApacheとNginxを比較
Webサーバのアーキテクチャ
上述しましたが、Apacheでは1リクエストに対して1プロセスが処理されます。
例えば100の同時接続があれば、100のプロセスが必要となります。数多くのプロセスが立ち上がるとプロセス番号の限界やメモリが大量に消費されてしまうという問題があります。
対してNginxでは1プロセスで複数のリクエストに対応します。
同時接続数の上限が設定可能で、具体的な設定パラメータを挙げると「プロセス数」と「プロセス内で最大の同時処理数」の乗算で上限が決まります。
例えば「プロセス数」を2つ、「プロセス内で最大の同時処理数」を1000に設定すると最大同時接続数は2×1000=2000となります。
処理能力
軽量なコンテンツの同時接続100アクセス状況下の実験結果、ApacheよりもNginxの方が1.2倍~1.5倍ほど高いという情報が出ています。更に同時接続数が増えれば増えるほど処理能力差が顕著に出てきます。
同時接続数
マルチプロセス(Apache)とシングルスレッド(Nginx)の違いからNginxはApacheの10~100倍ほど対応できると言われています。
適したコンテンツ
マルチプロセス(Apache)は動的コンテンツのような重たい処理が得意ですが、シングルスレッド(Nginx)は向いていません。
軽量なコンテンツはどちらも得意と言えますが、同時処理数が増えるとシングルスレッド(Nginx)が有利になります。
メモリ消費量
シングルスレッド(Nginx)は同時処理数が増えてもそれほどメモリ使用量は変わりませんが、マルチプロセス(Apache)はリクエストの量に応じてメモリが消費されます。同時処理数が少ない場合には両者にあまり違いはありません。
Apacheのメリット
Apacheのメリットについて紹介します。大きく以下の通りです。
- 簡単に機能拡張できる
- 信頼性・安定性が高い
- 開発者向け技術情報を入手しやすい
- 重い処理が得意
① 簡単に機能拡張できる
Apacheはモジュールを使用することで必要な機能を簡単に追加できます。
標準でもさまざまなモジュールが用意されていますが、インターネット上で数多く配布されており、更に自作したモジュールも追加することが可能です。
② 信頼性・安定性が高い
OSSは多くの場合、保証などはないため利用者数や開発年数などが信頼性や安定性を判断材料になります。
W3Techsの調査によるとApacheは50%以上のシェア率を誇っており、世界で最も使用されているWebサーバです。
つまり、それだけ実用的な安定性を持ち、信頼できるサーバであるということです。
③ 開発者向け技術情報を入手しやすい
20年以上も第一線で使われ続けたシステムであるため、開発者向けの技術情報が簡単に手に入りやすいのも大きなメリットです。
④ 重い処理が得意
アプリケーション、データベース、動的コンテンツなどの重い処理はCPUの使用率は高くなります。マルチプロセスの場合は処理が重いものでも他のプロセスに影響を与えることがないため、スムーズに処理が実行できます。
Apacheのデメリット
Apacheのデメリットは以下の通りです。
- メモリを大量に消費する
- 同時処理数が多くなると耐えられない
① メモリを大量に消費する
マルチプロセスは接続ごとにプロセスをコピーします。プロセスを大量に作成するため、メモリも大量に消費するデメリットがあります。
② 同時処理数が多くなると耐えられない
3万の同時接続数でプロセス番号の上限と上述しましたが、その前にハイスペックPCでもない限り、先にメモリが食い尽くされてしまいます。
メモリ対策として、event MPMというマルチスレッドモデルとマルチプロセスモデルとイベント駆動モデルのハイブリッドモデルを使用することでパフォーマンスの向上する場合があります。
また、event MPMはクライアントとのネットワークI/Oのみイベント駆動モデルで実装されています。
Nginxのメリット
続いてNginxのメリットについて紹介します。
- 速くて高負荷に強い
- リバースプロキシやロードバランサの機能がある
- 柔軟にカスタマイズ可能
① 速くて高負荷に強い
シングルスレッドのため大量の同時接続数に耐えることができ、イベント駆動のため活動的なリクエストのみを処理することで速い速度でコンテンツを提供することができます。
② リバースプロキシやロードバランサの機能がある
特定のサーバへの要求を必ず経由するように設置されたプロキシサーバであるリバースプロキシや負荷分散装置であるロードバランサの機能があります。
Nginxは、静的データの配信や、プロキシなどに特化させ、アプリケーションの実行などは別途アプリケーションサーバ等で行わせることで有効活用できます。
③ 柔軟にカスタマイズ可能
多くの機能がモジュール化されています。機能の取り外しができるため、使用しない機能を外して軽量化したり、独自の機能を開発して追加したりすることができます。
Nginxのデメリット
続いてNginxのデメリットについて紹介します。
- CPUリソースがたくさん必要な処理は不向き
- Nginx単体で完結させるのは難しい
- 機能が少ない
- ソースコードが複雑
① CPUリソースがたくさん必要な処理は不向き
イベント駆動で非同期処理のため、リクエストを完全に処理することを待たずに次々と処理を実行していきます。
そのため、アプリケーション実行・データベース処理・動画などの重たいデータの扱いには向いていません。その処理に多くのリソースを要します。
② Nginx単体で完結させるのは難しい
Nginxは単一のメモリ空間で動作するため、PHPなどのスクリプト言語を処理する機能などはありません。解決策としてはNginxをリバースプロキシとして使用して配下に別途アプリケーションサーバを採用することが望ましいです。
③ 機能が少ない
ApacheはデフォルトのモジュールでPHPなどのスクリプト言語など使用できますがNginxはリクエストに対して静的ファイルを返すかリバースプロキシとして配下のアプリケーションに渡すかのどちらかとして使用する用途となります。
④ ソースコードが複雑
処理の流れを淡々と並べるマルチプロセスに比べて、シングルスレッドはイベント毎にソースコードを書くため、複雑でわかりにくくなってしまいます。
最後に~結局ApacheとNginxどっちがいいの?~
ApacheとNginxを比較した結果、Webサーバの用途によってどちらを選択する必要があることが分かりました。
Apacheは少量の同時接続数で重い処理を担当させ、Nginxには大量の同時接続数や軽い静的コンテンツを担当させることで効果的なサーバ構築ができます。
また、Nginxには大量の同時接続数で重たい処理の場合はNginxをリバースプロキシサーバーとして利用して、動的コンテンツはApacheに処理させるという相互の利用も効果的です。
- Apacheは広く使われているオープンソースのWebサーバー
- Nginxは同時接続数が多くなるとパンクする問題を解決したWebサーバー
- Apacheは少量の同時接続数で重い処理が向いている
- Nginxは同時接続数が多く軽い静的コンテンツが向いている
- 構築するコンテンツの特性に合わせてApacheとNginxどちらを選択するか決めると良い
Webサーバー「Nginx」と「Apache」の違いや特徴についてご紹介しました。それぞれの異なった用途がありますので利用するWebコンテンツに合わせて目的に沿ったサーバ構築をしましょう!
\ IT転職のプロが無料でサポート! /
あわせて読みたい関連記事
この記事を読んでいる人におすすめの記事