Webサーバーソフトウェアを選ぶうえで、ApacheとNginxは必ず候補に上がってくるもの、といっても過言ではないと思います。この記事では、初心者の方でもわかりやすいようにWebサーバーソフトウェアについての説明をし、ApacheとNginxのアーキテクチャの違いを中心に両者を紹介しています。ぜひともご確認ください。
Contents
Webサーバーソフトウェアのおさらい
NginxとApacheはWebサーバーソフトウェアとなっていますので、それぞれの違いを説明する前に、Webサーバーソフトウェアについておさらいをしておきましょう。
Webサーバーソフトウェアとは?
Webサーバーソフトウェアとは、パソコンやスマートフォンでブラウザ検索などをする際に、ユーザー(クライアント)がクリックしたWebサイトなどの情報を提供するソフトウェアのことです。
インターネット上では、Webサイトなどの情報を格納しているWebサーバーソフトウェアがあり、クライアントのクリック(リクエスト)に応じたHTMLや画像などのデータをHTTP/HTTPS通信(※1)を通して提供することで、目的となるWebページをクライアントが利用してる端末画面に映し出すことができるようになっています。
Webサーバーソフトウェアで特に有名なものが今回ご紹介するApacheとNginxになっており、オーストリアにあるソフトウェア品質管理コンサルティング会社のQ-Successの調査によると、市場の約65%がApacheかNginxを利用しています。
また、かつては長い期間に渡りApacheが世界シェアNo. 1でしたが、最近ではNginxが最も人気のあるWebサーバーソフトウェアになっています。加えて、日本でのシェアはApacheがNo. 1になっています。(2022年9月現在)
出典:Nginx is now the most popular web server, overtaking Apacheを日本語に翻訳
(※1)HTTP/HTTPS通信とは、ブラウザとWebサーバーでインターネット上のデータをやり取りするための通信規約(通信プロトコル)のひとつです。HTTPは暗号化されていないデータ、HTTPSは暗号化されたデータのやり取りをおこないます。
WebサーバーソフトウェアとOSの仕組み
サーバーと聞くと、下の画像のような縦長のサーバーラックに入ったコンピューターをイメージする方も多いと思います。
これらのようなコンピューターは基本的には家庭用パソコンなどに入っているものと変わらず、Linuxや UNIX、Windows ServerなどのOSをインストールしています。そして、コンピューターをWebサーバーとして利用するためには、Apacheや NginxなどのWebサーバーソフトウェアを導入する必要があります。
そのため、画像のようなサーバー用のコンピューターを準備しても、OSをインストールし、Webサーバーソフトウェアを導入しなければWebサーバーとして利用することができません。WebサーバーをWebサーバーとして利用するためにはApacheや NginxなどのWebサーバーソフトウェアが必要になり、Webサーバーソフトウェアを利用するためにはOSが必要になる、といった具合です。
逆にいえば、WebサーバーソフトウェアがLinuxやWindows、macOSなどのOSに対応していれば、画像のようなサーバー用のコンピューターを用意しなくとも、家庭用パソコンをWebサーバーとして使うことができます。
コンピューターの基本となるOSのうえに、 ApacheやNginxなどのWebサーバーソフトウェアを導入することでWebサーバーとして利用できることになる、と覚えておきましょう。
Apacheとは
1995年にApache Groupという有志の集団がリリースし、現在はApacheソフトウェア財団が支援をしているオープンソースで無料のWebサーバーソフトウェアで、正式名称はApache HTTP Serveといいます。
Apacheは1995年にリリースされてから急激にシェアを広め、Nginxに抜かれるまではシェアNo. 1に君臨し続けたWebサーバソフトウェアです。主な特徴は以下のものになります。
・Linux、UNIX、macOS、Windows、Windows Serverと、数多くのOSに対応しているクロスプラットフォーム
・無料でありながら多くの機能を有しており、カスタマイズ性が高い
・過去の利用実績から信頼性や安全性が高く動作が安定している
・動的コンテンツの処理速度が速い
・多くのLinuxディストリビューションで標準搭載されている
・情報が多い
数多くの優れた特徴を持つApacheですが、オープンソースで無料となっているためにカスタマーサポートがなく、トラブル発生時は自身で対応しなければなりません。そのため、トラブルシューティングの情報は多くあるものの、最終的には対応するエンジニアの知識やスキルが必要不可欠になっています。
また、Apacheはユーザーの同時接続に弱いという特徴があり、複数の処理を同時におこなうとメモリ消費量が増加し、動作が遅くなってしまいます。そのような理由から、同時アクセス数が多く見込まれるWebサイトやWebアプリケーションの作成にはあまり向いていません。
Nginxとは
2004年にNGINX社からリリースされたオープンソースで無料のWebサーバーソフトウェアです。(NGINX社は2019年にF5ネットワークス社に買収され、現在は同社の一部となっています)
NginxはApacheの同時接続の弱さ(C10K問題|クライアントのアクセスが1万を超えるとサーバー処理がパンクする問題)を解決させるために設計されたWebサーバーソフトウェアになっているため、同時アクセスの強さを最大の特徴として挙げることができます。それ以外の特徴は以下のものになります。
・Apacheと同じく、多くのOSに対応しているクロスプラットフォーム
・サーバーの負荷を分散させる『リバースプロキシ』などによりWebサーバーとしての機能に特化している
・イベント駆動型モデルを採用しているため、HTMLや画像などの静的コンテンツの処理速度が速い(※詳しくは後述します)
・シングルスレッドのプロセスで並列処理をしているため、メモリ消費量が少ない
Apacheにはない特徴を持つNginxですが、いくつかのマイナス面も持ち合わせています。具体的には、PHPなどを利用した動的Webページや動画などの処理速度が遅い、Apacheに比べて機能が少なく機能追加もしにくい、Apacheに比べると情報が少なく初心者では設定が難しくなる可能性がある、などになっています。
ApacheとNginxの違い
ここではApacheとNginxの違いを、採用しているアーキテクチャ(設計思想や構成、構造)からご紹介します。
Apacheはマルチプロセスまたはマルチスレッドのプロセス駆動型アーキテクチャ
プロセスやスレッドについて説明をしてから、Apacheのアーキテクチャを紹介します。
- プロセスとマルチプロセス
パソコンやWebサーバー用コンピューターなどがプログラムを実行する際は、『メモリ』という作業場を利用して処理をおこなっています。Webサーバーであれば、Webサーバー用コンピューターのメモリを使ってHTMLなどのデータを送信するかたちになり、『メモリを利用して何らかのプログラムを実行すること』をIT用語では『プロセス』といいます。
マルチプロセスとは、複数のプロセスを同時に実行することです。いくつものプロセスがそれぞれの処理をおこない、内容の異なる処理を同時に、並行して進めます。Webサーバー用コンピューターでは、クライアントAの要求に応えながら、並行してクライアントBの要求に応える処理をおこなう、といったイメージです。
- スレッドとマルチスレッド
プロセスよりも細かいプログラムの処理単位のことをスレッドといいます。たとえば、プログラム1にはAの処理単位、Bの処理単位、Cの処理単位が必要だとします。この場合、プログラム1のA、B、Cそれぞれの処理単位がスレッドとなり、プログラム1を完了させるためにはA、B、Cのスレッドがすべて必要になる、と説明することができます。つまり、『スレッドはプロセスに内包されている処理単位』ということです。
プログラム1のA、B 、Cのスレッドですが、A→B→Cと順番に処理をする場合と、AとBを同時処理してからCの処理をする、Aを処理してからBとCを同時処理する、などといった場合があります。
A→B→Cと順番に、ひとつづつスレッドの処理をしていくことをシングルスレッド、AとBを同時処理→C、A→BとCを同時処理など、複数のスレッドを同時に、並行して進める処理をマルチスレッドといいます。
- プロセス駆動型アーキテクチャとは
Apacheはマルチプロセッシングモジュール(MPM)というものを採用しており、利用するWebサイトやWebアプリケーションなどに合わせてモジュール(機能や使い道がはっきりとした部分)を変更することができるようになっています。
MPMにはprefork、worker、perchild、eventなどがあり、Apache2.4からはデフォルトのモジュールはevent(イベント駆動型)になっていますが、それまではprefork(プロセス駆動型)がApacheのデフォルトモジュールでした。
preforkはひとつのプロセスをひとつのスレッドで処理をするシングルスレッド機能を持っているモジュールで、複数の同時接続があった場合は接続数に応じてプロセスを増やしていくマルチプロセス方式になります。また、workerは1つのプロセスが複数のスレッドを持つマルチスレッドで、preforkと同じくマルチプロセス方式も採っているため両者のハイブリットとなります。
先述したApacheは同時接続に弱いという点は、preforkやworkerでマルチプロセス方式を採っているため、同時接続数が増えるたびにプロセスが増え、プロセスが増えることでWebサーバーの消費メモリも増加し、動作が遅くなってしまう、という原因があります。
また、ApacheのeventモジュールもNginxと同じくイベント駆動型になっています。しかしながら、Nginxとは処理の仕組みが違うため、一般的にはNginxのほうが同時接続の処理速度が速くなっています。
NginxはノンブロッキングI/Oを用いたイベント駆動型アーキテクチャ
I/O(アイオー)やブロッキングI/O・ノンブロッキングI/Oについて説明をしてから、Nginxのアーキテクチャについて説明をします。
- I/O
I/Oは、InputとOutputの略で『入出力』のことです。Webサーバーに限らず、すべてのコンピューターは情報を入力(Input)し、処理結果を出力(Output)するようになっており、これらの入力/出力の処理を総称してI/Oといいます。
- ブロッキングI/O・ノンブロッキングI/O
ブロッキングI/O・ノンブロッキングI/Oとは、I/Oの処理の仕方で区分されているものです。ブロッキングI/Oはプログラム1の処理にA、B、Cの処理が必要だった場合、Aの処理がおこなわれている間はAの処理だけに専念し、BやCの処理をせず、Aの処理が完了することを待って次の処理に進む方式のI/Oです。そのため、Aの処理が完了してからBへ、Bの処理が完了してからCへ、といった具合に順次処理を進めていくかたちになります。
ノンブロッキングI/Oとは、上記のプログラム1がAの処理をしている間にBやCの処理もおこなう方式のI/Oです。ブロッキングI/OはAの処理をしている際はBやCの処理進行をブロックしていますが、ノンブロッキングI/OはAの処理をしている際にBやCの処理進行をブロックしません。そのため、Aの処理待ち時間を有効活用することができるようになっています。また、NginxではノンブロッキングI/Oに加えノンブロッキングI/O多重化、次に紹介するイベント駆動型アーキテクチャを採用することでC10K問題を解決しています。
- イベント駆動型アーキテクチャとは
イベント駆動型とは、イベントドリブンともいわれるアーキテクチャで、コンピューターの外部からの刺激(ボタンクリックやマウス操作など)を『イベント』としてとらえ、イベントの発生をきっかけにコンピューターが処理を始めるものになります。
また、イベント駆動型はプログラム1を実行するために必要なA、B、Cの処理があった場合、それぞれの処理が実行可能になるまで待機をするようになっています。プログラム1の処理をする際にA、B、Cが必要であっても、それぞれがすぐに処理を実行できる状態になるとは限りません。そのためイベント駆動型は待機をし、実行可能になった処理からおこなっていきます。
イベント駆動型は1つのプロセスを1つのスレッドでおこない、Nginxはイベント駆動やノンブロッキングI/O、ノンブロッキングI/O多重化によって1プロセスで複数の同時接続に対応するようになっています。Apacheのプロセス駆動型では、接続人数が増えることによってプロセスの数も増え、メモリの消費が多くなってしまいますので、この点がApacheとNginxの大きな違いになります。
加えて、Nginxは『マスタープロセス』が全体を管理し、『ワーカープロセス』がクライアントの接続をイベントとして受け付け、上述してきた方法で処理をするようになっています。
出典:NGINXとは? NGINXとNGINX Plusを徹底解説します
ApacheとNginxはどう使い分ける?
ここまでの説明を踏まえて、ApacheとNginxの使い分けについて説明をします。
Apacheは中小規模のサービスに向いている
Apacheもeventモジュールを利用することでネットワークI/Oのみイベント駆動になり、preforkやworkerなどよりは同時接続に強くなります。しかしながら、同時接続を意識した場合はNginxのほうが向いているため、クライアント数が多くなる大規模サービスにはあまり向いておらず、中小規模のサービスに利用したほうがよいでしょう。
加えて、Apacheはできることが多く、Nginxよりも構築が簡単、情報がふんだんにある、といった理由から、大規模サービス以外ではその利点を活かして開発がしやすくなることが予想されます。
Nginxは同時接続数の規模が大きいサービスに向いている
Nginxはその特徴から、同時接続数の規模が大きいサービスに向いています。実際にNetflixやHulu、Airbnbなど、世界規模で展開しているサービスでもWebサーバーアプリケーションにNginxが利用されており、Nginxの速度と安定性は実証されているといえるでしょう。
しかしながら、NginxはWebサーバーとアプリケーションサーバーを同じサーバーに集約する場合やCPU(中央処理装置)を使う処理を苦手としているため、一概にApacheよりも優れているというわけではありません。
まとめ
この記事では、Webサーバーソフトウェアの説明から入り、ApacheとNginxのアーキテクチャの違いから両者を紹介しました。それぞれにメリット・デメリットがありますので、開発するものや開発環境に適したWebサーバーソフトウェアを選択するようにしましょう。
フリーランスの案件をお探しの方はTechReachにご相談ください。
TechReachを運営する株式会社アールストーンはIT・Web業界特化で15年以上の実績がございます。
そのため、高単価・高品質な数多くの案件紹介が可能です。
また一人のコンサルタントが企業と求職者様の担当を行う「両面型エージェント」を採用しているため、あなたの希望に合う案件がきっと見つかるはずです。
TechReachを活用して、理想の案件を見つけましょう!