🙌

Apache Server、Nginx Serverはなんでしょうか

2022/10/26に公開

初めまして、Junior Back-end Developer、SIMOKITAZAWAです。
色々と足りないところがあるかと思いますがよろしくお願い致します。

私がZENNを始めた理由は、

  1. 私が勉強したことをまとめたい
  2. 勉強の内容を共有して一緒に成長したい
  3. 私が間違って理解している部分について先輩たちに教えてもらいたい

このような理由で始めることになりました。
たくさんの教えをお願いします。

Apache Server

Apache Serverの前にはNCSA HTTPdというものありましたが、バグが多くて出たのがApache Serverです。Apache ServerはClientからRequestが来るたびにConnectionを形成するProcessを生産します。Requestが来るたびにProcessを生産するので、生産の時間がかなりかかりました。

これを解決するためApache ServerはあらかじめProcessを作って使うPREFORK方式にしました。この方式でApache Serverは優れた確定性と動的コンテンツを処理できるようになりました。また、Requestを受けてResponseを返す過程を一つのServerで解決するのに良かったです。

しかし世界的にコンピューターの普及が多くなり、インターネット使用量が増加し始めるにつれ、数多くのRequestが入ってくるようになりました。そのによって、Serverに同時に接続されたConnectionが多くなり、接続されている以上のConnectionを形成できない問題が生じました。この問題が”C10K”問題です。

Apache Serverは、Connectionを形成するためにProcessを生成すると述べました。その意味はRequestが多くなればなるほど、より多くのConnectionを形成することを意味します。そうするとConnectionと同じ数であるProcessを作ることになります。これはまもなくメモリ不足につながることになリます。
また、拡張性によりProcessのリソースをさらに増やす状態となり、これはCPUの負荷につながるようになります。

Nginx Server

Apache Serverの問題を解決するために作られたものがNginxです。

NginxをApache Serverの前に置いて数多くの同時ConnectionをNginxが耐えさせることです。また、NginxはWeb Serverであるため、静的コンテンツを処理することができます。そのため、動的コンテンツのRequestが来る時だけにApache ServerとConnectionを形成します。その結果、Apache ServerのリソースをConnection維持ではなく、ビジネスロジック処理に使用できるようになります。

Nginxが数多くの同時Connectionを受けられることは、作られるProcess数に関連しています。 NginxはMaster ProcessとWorker Processがあります。Master Processは設定Fileを読んで働くWorker Processを生産します。Worker Processは、働くときに指定されたListen Socketを割り当てられます。このSocketにRequestが入ってくるとRequestを処理して、形成されたConnectionは決められたkeep alive時間だけ維持されてなくなります。

NginxのEvent Driven

もちろんConnection一つだけ担当せずに作られたConnectionに何のRequestもなければ新しいConnection形成したり、すでに作られた他のConnectionからRequestを処理します。これをEvent Drivenと言います。そして、このEvent DrivenはQUEUEの方式でWorker Processに伝達されます。

Worker Processは一つのThreadでEventを一個ずつとって処理します。こうすると、Worker Processは休まず動きます。ApacheのProcessはRequestがないと放置され動かないですが、このWorker Processはずっと動くので効率的です。もし長い時間がかかるEventがあったらこのWorker ProcessはThread Poolに担当させて他のEventを処理します。この結果CPUの負荷が減ります。

それぞれの長点

Nginx Serverはプログラマーがモジュールを作るのが難しいです。しかし、Master Processに設定ファイルをうまく作成できれば、設定に合ったWorker Processが生成されるため、動的設定の変更が可能です。

Apache Serverは互換性と拡張性が良い、Server自体が多様なOSに安定的です。また、モジュールで様々な機能を追加可能な拡張性が良いです。長い歴史があるのでモジュールの種類が多いです。NginxはWindowsで性能を発揮するのが大変だと言われていますが。同時Connectionの問題、Webサーバのセキュリティなどで使っています。

結論

Apache ServerもNginx Serverもそれぞれの長点があります。
自分がどんなApplicationをどんなアーキテクチャにするかを考えて使ったら良いと思います。

私の場合は、私が作ったApplicationは動的なコンテンツがあまりない
NginxのSSL Terminationを使ってServerのリソースを減らすという考えでNginx Serverを使いました。

** SSL Termination

SSL TerminationはClientとはHTTPS、ServerとはHTTP通信ができることです。
Serverの復号化プロセスを回避することによりServerのリソースを削減することができます。

Discussion