Apache HTTP Server

Apache HTTP Server（アパッチ エイチティーティーピー サーバ）は、Apache License2.0の条件でリリースされるフリーでオープンソースのクロスプラットフォームのWebサーバソフトウェアである。Apache はApacheソフトウェア財団の支援のもと、開発者のオープンコミュニティによって開発・保守されている。 Apache HTTP サーバのインスタンスの大部分は Linuxディストリビューション上で動作するが、現在のバージョンは Microsoft Windows や様々な Unixライクなシステム上でも動作する。過去のバージョンでは、OpenVMS、NetWare、OS/2、メインフレームへの移植を含む他のオペレーティングシステムでも動作した。 元々は NCSA HTTPdサーバをベースにしていたが、NCSAコードの作業が停滞した後、1995 年初頭にApache の開発が始まった。Apache はWorld Wide Webの最初の成長において重要な役割を果たし、支配的な HTTP サーバとしてすぐに NCSA HTTPd を追い抜き、1996 年 4 月以来、最も人気のあるサーバであり続けている。2009年には、1億以上のウェブサイトにサービスを提供する最初のウェブサーバーソフトウェアとなった。2020年4月現在、Netcraftの推定では、Apacheは最もアクセスの多い100万のウェブサイトの29.12％のサーバーで利用され、Nginxは25.54％で利用されている。W3Techsによると、Apacheは上位1000万サイトの39.5％で利用され、Nginxは31.7％で利用されている。 1995年 Webサーバソフトウェアは欧州原子核研究機構 (CERN) のティム・バーナーズ＝リーが開発したCERN httpdと米国立スーパーコンピュータ応用研究所 (NCSA) が開発したNCSA HTTPdの2種類があった。NCSA HTTPdは初めてCGIを採用するなど、非常に普及していたが、その後ほとんどメンテナンスが行われなくなり、放置されていた。そこで、何人かの有志が改良とサポートを行うためのグループを作り、自分たちを「Apache Group」と名付けた。しかし、彼等もその後プロジェクトに興味を失ってしまい、再度放置されかけた。 1999年以降 放置されかけたのち、1999年にユーザーの一人だったBrian Behlendorfが自分のサーバを使ってユーザーのためのメーリングリストを立ち上げた。これが現在のApacheソフトウェア財団の母体になっている。ただし、現在のApacheのソースコードはApacheソフトウェア財団によって完全に書き換えられており、NCSA HTTPdのコードは残っていない。 2018年3月現在、Apacheの公式ページでは2.4系のみを推奨リリースとしている 。 1.3系、2.0系、2.2系を含む古い系列は、アーカイブ・サイトからダウンロードできる。 Apacheの機能はモジュールを追加することで拡張できる。Apacheの核となる「Core」がまずあり、そこへモジュールを追加して機能を拡張する。モジュール名は慣習的に「mod_XXX」と付けられる。XXXは機能の概要名である。例えば「mod_dir」「mod_alias」「mod_setenvif」などとなる。 モジュールは「静的リンク」または「動的リンク」により追加できる。静的リンクとは、Apacheの実行ファイルそのものにモジュールを組み込む方式である。つまりApacheとモジュールはバイナリ的に一体化して動作する。動的リンクとは、モジュールを別ファイルとして作成し、必要に応じてモジュールのファイルから機能を呼び出す方式である。この機能を「DSO（Dynamic Shared Object＝動的共有オブジェクト）」と呼ぶ。動的リンクの機能を利用するためには、あらかじめ「mod_so」モジュールを静的リンクしておく必要がある。 動的リンクはモジュール機能の呼び出しで静的リンクよりも負荷が高くなる（オーバーヘッドがかかる）デメリットがあるが、再起動のみでモジュールを組み入れたり外したりできるメリットがある。 逆に静的リンクは高速にモジュール機能を呼び出せるが、モジュールを入れたり外すためにはApache本体を再コンパイルする必要がある。 Apacheは数多くのOSをサポートするために、MPM（マルチ プロセッシング モジュール）という仕組みをとっている。これにより、利用するOSに最適化されたApacheを容易に組み込むことができる。 Unix系においては、プロセス・スレッドの挙動が異なる3つのMPMが利用できる。 prefork preforkは「スレッドを使わず、先行して fork を行なうウェブサーバ」である。Apacheは伝統的に親プロセスを1つ持ち、クライアントからリクエストが来ると自分自身をコピーして子プロセスを起動する（これをforkという）。実際の通信は子プロセスが受け持つ。そのため、通信している数だけ子プロセスが起動することになる。この時、クライアントからリクエストを受けたあとでforkするとfork完了までに待ち時間が出来て通信のパフォーマンスが遅くなる。そのため、あらかじめいくつかの子プロセスをforkしておき、forkの待ち時間をなくす方式をとっている。この方式が「prefork」である。すなわち“pre（＝前もって・先行して）”forkしておく、という意味である。 preforkのメリットは、forkされた子プロセス1つ1つが対応する通信を受け持つため、ある子プロセスが何らかの原因でフリーズしたとしても、他の子プロセスには影響を及ぼすことが無く通信を継続できる。このため安定した通信を行うことが出来る。一方、クライアントが多くなればなるほど子プロセスの数も増えるため、使用メモリ量やCPU負荷が比例的に増大していく。preforkで多数のクライアントをさばくには、それに応じた大量のメモリと高速なCPUが必要となる。 worker workerは「マルチスレッドとマルチプロセスのハイブリッド型サーバ」である。Apacheの子プロセス1つ1つがマルチスレッドで動作し、スレッド1つが1つのクライアントを受け持つ方式である。すなわち、1つのプロセスがマルチスレッドを利用して複数の通信の面倒を見る。この点で1つのプロセスが1つの通信をみるpreforkとは異なる。また多くの子プロセスを起動せずに済むため、メモリの使用量も減らすことが出来る。 event eventはworkerの一種でマルチスレッドで動作する。workerとの違いはKeep-Alive（持続的接続）の処理方法である。workerやpreforkは、Keep-Aliveの持続性を保つために一度利用したスレッド・プロセスをそのまま待機させている。しかしクライアントからの接続が持続的に行われる可能性は保証されているわけではないから、待機していること自体が無駄になる可能性もある。そこで、Keep-Aliveの処理を別のスレッドに割り振って通信を処理する。 この方式は長らく実験的サポートであったが、2.4.1にて正式に採用された。 このほか、Netware、OS/2、Windows向けにそれぞれ専用のMPMが用意されている。 Apacheは、主にワールドワイドウェブ上で静的または動的なコンテンツを公開するために使われる。多くのウェブアプリケーションは、Apacheが提供する環境と機能を想定して設計されている。また、ApacheはLAMP (Linux、Apache、MySQL、PHP/Perl/Python) や LAPP (Linux、Apache、PostgreSQL、PHP/Perl/Python) と呼ばれる非常に人気のあるウェブサーバコンポーネントの一つでもある。読み方はそれぞれLAMP（ランプ）、LAPP（ラップ）である。さらに、Apacheはいろいろな商用パッケージ、例えばOracle Databaseに組み込まれており、macOSやNetWare 6.5の標準Webサーバにもなっている。 Apacheでは、FreeBSDのカーネルと連動し、最高の性能を引き出す特殊な動作形態をサポートしている。 これはFreeBSDをHTTPサーバに特化するという運用形態を想定したもので、FreeBSD及びApacheの両者に設定が必要であり、共にインストール直後の標準設定ではサポートされない。 基本的な動作は、LinuxのTUX web serverやWindowsのInternet Information Servicesなどに近い実装であり、通信バッファのカーネルからの直接的な読込やkqueueなど多岐にわたり、一部のみ利用ということも可能になっている。 同形態はLinuxにおけるサポートも検討されたが、あまりに特殊であるため未実装となっている。[独自研究?]