




ウェブサーバーは、 HTTP(ウェブコンテンツを配信するために開発されたネットワークプロトコル)またはその安全な派生形であるHTTPSを介してリクエストを受け入れるコンピュータ ソフトウェアおよび基盤ハードウェアです。ユーザーエージェント(通常はウェブブラウザまたはウェブクローラー)は、HTTPを使用してウェブページまたはその他のリソースをリクエストすることで通信を開始し、サーバーはそのリソースのコンテンツまたはエラーメッセージで応答します。ウェブサーバーは、設定されている場合、ユーザーエージェントから送信されたリソースを受け入れ、保存することもできます。[1] [2] [3] [4] [5]
ウェブサーバーを稼働させるハードウェアは、処理すべきリクエストの量に応じて異なります。低価格帯のハードウェアとしては、ルーターなどの組み込みシステムがあり、ルーターの設定インターフェースとして小規模なウェブサーバーが稼働しています。トラフィック量の多いインターネットウェブサイトでは、高速コンピュータをラックに搭載した数百台のサーバーでリクエストを処理することもあります。[6]
ウェブサーバーから送信されるリソースは、ウェブサーバーが利用可能な既存のファイル(静的コンテンツ)である場合もあれば、サーバーソフトウェアと通信する別のプログラムによってリクエスト時に生成されるもの(動的コンテンツ)である場合もあります。前者は通常、より高速に提供され、繰り返しのリクエストに対してキャッシュされやすいのに対し、後者はより幅広いアプリケーションをサポートします。
一般的なコンピュータ間通信の基盤として HTTP を使用するRESTやSOAPなどのテクノロジや、 WebDAV拡張機能のサポートにより、Web サーバーの用途は、人間が読めるページを提供するという本来の目的をはるかに超えて拡張されました。

これはウェブサーバープログラムの非常に簡潔な歴史であり、一部の情報はウェブブラウザ、ワールドワイドウェブ、インターネットの歴史と必然的に重複します。したがって、明確さと理解しやすさを考慮して、以下に報告するいくつかの重要な歴史情報は、上記の歴史記事の1つまたは複数に記載されている情報と類似している可能性があります。[7]
1989年3月、ティム・バーナーズ=リー卿は、ハイパーテキストシステムを用いて科学者間の情報交換を容易にすることを目的とした新たなプロジェクトを、雇用主である欧州原子核研究機構(CERN )に提案しました。 「ハイパーテキストとCERN」と題されたこの提案は、意見を求め、複数の関係者によって読み上げられました。1990年10月、この提案は(ロバート・カイヨー氏を共同執筆者として)改訂・拡充され、最終的に承認されました。[8] [9] [10]
1990年後半から1991年初頭にかけて、このプロジェクトではバーナーズ=リーとその開発者たちがいくつかのソフトウェアライブラリと3つのプログラムを書き、テストしました。これらのプログラムは当初NeXTワークステーションにインストールされたNeXTSTEP OS上で動作しました。[11] [12] [10]
これらの初期のブラウザは、HTTP 0.9という新しい基本通信プロトコルを使用して、Web サーバーから単純な初期の HTML 形式で記述された Web ページを取得しました。
1991年8月、ティム・バーナーズ=リーはWWW技術の誕生を宣言し、科学者たちにその採用と開発を奨励しました。[13]その後まもなく、これらのプログラムとそのソースコードは、その利用に関心のある人々に公開されました。[11]ソースコードは正式にライセンスされておらず、パブリックドメインにもなっていませんでしたが、CERNは非公式にユーザーと開発者が実験を行い、さらに開発を進めることを許可しました。バーナーズ=リーは、これらのプログラムの採用と利用、そして他のオペレーティングシステムへの移植を促進し始めました。[10]
1991年12月、ヨーロッパ以外で最初のウェブサーバーがSLAC(米国)に設置されました。[12]これは、ウェブブラウザとウェブサーバー間の大陸間ウェブ通信の始まりとなったため、非常に重要な出来事でした。
1991年から1993年にかけて、CERN Webサーバープログラムはwwwグループによって引き続き積極的に開発され、同時に、ソースコードとHTTPプロトコルの公開仕様が利用可能になったことにより、他の多くのWebサーバーの実装が開発され始めました。
1993年4月、CERNは、Webソフトウェアの3つのコンポーネント(基本的なラインモードクライアント、Webサーバー、共通コードのライブラリ)とそのソースコードがパブリックドメインになったという公式声明を発表しました。[14]この声明により、Webサーバーの開発者は、そのソースコードに基づく派生作品の開発に関するあらゆる法的問題から解放されました(実際にはそのような脅威は存在しませんでした)。
1994年初頭、新しいウェブサーバーの中で最も注目を集めたのはNCSA httpdでした。これは様々なUnixベースのOS上で動作し、HTTPメソッドとCGIを実装することで外部プログラムとの通信を可能にし、動的に生成されるコンテンツを提供できました。これらの機能と、NCSAのMosaicブラウザのマルチメディア機能( HTMLフォームを管理してウェブサーバーにデータを送信することも可能)は、出版や分散コンピューティングアプリケーションにおけるウェブ技術の可能性を浮き彫りにしました。POST
1994年後半、NCSA httpdの開発は停滞し、NCSA httpdのソースコードがパブリックドメインで公開されていたことを受けて、外部のソフトウェア開発者、ウェブマスター、その他このサーバーに興味を持つ専門家グループがパッチの作成と収集を開始しました。1995年初頭、これらのパッチはすべてNCSAソースコードの最終リリースに適用され、数回のテストを経てApache HTTPサーバープロジェクトが開始されました。[17] [18]
1994年末、Netsiteという名の新たな商用ウェブサーバーが、独自の機能を備えてリリースされました。これは、 Netscape社、Sun Microsystems社、そして最終的にOracle社によって開発された、多くの類似製品の最初の製品でした。
1995年半ば、MicrosoftはWindows NT OS向けにIISの最初のバージョンをリリースしました。これは、Webのクライアント側とサーバー側の両方で重要な役割を果たしてきた、非常に重要な商用開発者兼ベンダーのWorld Wide Webテクノロジー分野への参入を意味しました。
1995 年後半には、以前のものよりも多くの機能、より多くの修正、より高いパフォーマンスを備え、開発サイクルがはるかに速い新しい Web サーバーが広く採用されたため、CERN および NCSA Web サーバーは (世界全体の使用率で) 減少し始めました。

1996年末には、インターネットドメイン名を所有したり、ウェブサイトをホストしたりしたい人なら誰でも利用できる、50種類以上のウェブサーバーソフトウェアプログラムが既に存在していました。[20]それらの多くは短期間で廃止され、他のウェブサーバーに置き換えられました。
プロトコルバージョンHTTP/1.0(1996年)およびHTTP/1.1(1997年、1999年)に関するRFCの公開により、ほとんどのWebサーバーはこれらの標準に(必ずしも完全ではないものの)準拠せざるを得なくなりました。TCP/IP持続接続(HTTP/1.1)の使用により、Webサーバーは同時接続の最大数を増やすとともに、スケーラビリティを向上させる必要に迫られました。
1996 年から 1999 年にかけて、Netscape Enterprise Serverと Microsoft の IIS が主要な商用オプションとして登場しましたが、無料で利用できるオープン ソースプログラムの中では、Apache HTTP Server が (信頼性と豊富な機能により) 推奨サーバーとしてリードしていました。
当時、Zeus (現在は廃止) と呼ばれる、非常に革新的で注目に値する商用 Web サーバーもありました。このサーバーは、使用率が低かったにもかかわらず、少なくとも 2000 年代の最初の 10 年間までは、市場で入手可能な最も高速で、最もスケーラブルな Web サーバーの 1 つとして知られていました。
Apacheは1996年半ばから2015年末まで、最も利用されているウェブサーバーでした。その後数年間の衰退を経て、まずIISに、そしてNginxに追い抜かれました。その後、IISの利用率はApacheを大きく下回りました(市場シェアも参照)。
2005年から2006年にかけて、Apacheは新しいパフォーマンス機能(イベントMPMや新しいコンテンツキャッシュなど)を導入することで、速度とスケーラビリティレベルの向上に取り組み始めました。[21] [22]これらの新しいパフォーマンス改善は当初実験的なものとされていたため、長い間ユーザーには有効にされず、Apacheは商用サーバー、そしてとりわけ他のオープンソースサーバーとの競争でさらに苦しむことになりました。これらのサーバーは開発当初から(主に静的コンテンツを提供する場合)はるかに優れたパフォーマンスを実現しており、Apacheの衰退時には、十分にテストされた高度な機能を豊富に提供できました。
2000 年に入って数年後には、他の商用かつ競争力の高い Web サーバー ( LiteSpeedなど) だけでなく、 Hiawatha、Cherokee HTTP サーバー、Lighttpd、Nginxなどの他のオープンソース プログラムや、商用サポート付きの派生製品や関連製品も数多く登場しました。
2007年から2008年頃、多くの人気ウェブブラウザは、従来のデフォルトの持続接続数制限(ホストドメインあたり2つ、RFC-2616で推奨されている制限)[23]を、4、6、または8に引き上げました。これは、大量の画像を含む重いウェブページの表示速度を向上させ、ウェブページ内のイベントの双方向通知に使用される動的オブジェクト専用の持続接続が不足する問題を緩和するためでした。[24]これらの変更により、1年以内にウェブサーバーが管理する必要のある持続接続の最大数は平均で3倍近くに増加しました。この(持続接続数の増加)傾向は、低速ウェブサーバーへのリバースプロキシ導入を強力に後押しするとともに、大量のハードウェアリソース(大量のCPU、RAM、高速ディスクを搭載した高価なコンピュータ)を必要とせずに、そのスピードと膨大な同時接続処理能力を最大限に発揮できる新興のウェブサーバーに新たなチャンスを与えました。[25]
2015年にRFCで新しいプロトコルバージョン[HTTP/2]が公開されましたが、新しい仕様の実装は決して簡単ではなかったため、あまり人気のないウェブサーバー(例えば、使用率が1%~2%未満)の開発者の間で、新しいプロトコルバージョンのサポートを追加するかどうかというジレンマが生じました。[26] [27]
実際、HTTP/2をサポートするには、多くの要因(実質的に常に必要な暗号化された接続、同じTCPポートでのHTTP/1.xとHTTP/2の接続を区別する機能、HTTPメッセージのバイナリ表現、メッセージの優先度、HTTPヘッダーの圧縮、TCP/IPサブ接続とも呼ばれるストリームの使用と関連するフロー制御など)により、内部実装に根本的な変更が必要になることがよくありました。そのため、これらのWebサーバーの開発者の中には、新しいHTTP/2バージョンをサポートしないことを選択した人もいました(少なくとも近い将来は)。主な理由は次のとおりです。[26] [27]
その代わりに、人気のウェブサーバーの開発者たちは、新しいプロトコルの提供を急いでいた。それは、彼らにはそのための時間や人員があったからというだけでなく、SPDYプロトコルの以前の実装を出発点として再利用できたことと、同じ理由でほとんどのウェブブラウザがそれを非常に迅速に実装したからである。開発者たちが迅速に行動したもう1つの理由は、ウェブマスターたちが増え続けるウェブトラフィックのプレッシャーを感じており、TCP/IP接続数を大幅に削減し、ホストされているウェブサイトへのアクセスを高速化できるものを、できるだけ早くインストールして試したかったからである。[28]
2020年から2021年にかけて、 HTTP/3プロトコルに関する将来のRFCの高度なドラフトが公開された後、HTTP/2の実装(主要なWebサーバーと一般的なWebブラウザーによる)に関する動向が部分的に再現されました。

以下の技術概要は、このトピックに関する十分に幅広いシナリオを提供するために、Web サーバーに実装できる機能と、Web サーバーが実行できるタスクの一部について、ごく限られた例をいくつか示す試みとしてのみ考えてください。
Webサーバー プログラムは、 HTTP プロトコルの 1 つ以上のバージョンを実装することにより、クライアント サーバー モデルにおけるサーバーの役割を果たします。これには、多くの場合、HTTPS セキュア バリアントや、計画されている用途に役立つと考えられるその他の機能や拡張機能が含まれます。
ウェブサーバープログラムの複雑さと効率は、以下の要因によって大きく異なります。[1]
Web サーバー プログラムの実装方法はそれぞれ異なりますが、ほとんどのプログラムは次の共通機能を備えています。
これらは、ほとんどの Web サーバーが通常備えている 基本機能です。
その他のより高度で人気のある機能(ごく一部) は次のとおりです。
ウェブサーバープログラムは、実行時に、通常、いくつかの一般的なタスクを実行します。[1]
ウェブサーバープログラムは以下を実行できます: [29] [30] [31]
HTTPリクエストメッセージがデコードされ検証されると、その値を用いてリクエストが満たされるかどうかを判断できます。これには、セキュリティチェックを含む多くのステップが必要です。
Web サーバー プログラムは通常、次の目的で 何らかのURL 正規化(ほとんどの HTTP 要求メッセージにあるURL ) を実行します。
URL正規化とは、URLを一貫した方法で変更および標準化するプロセスを指します。実行可能な正規化には、スキームとホストを小文字に変換することなど、いくつかの種類があります。最も重要な正規化には、「.」および「..」パスセグメントの削除、および空でないパスコンポーネントの末尾にスラッシュを追加することなどがあります。
URLマッピングとは、URLを分析して参照先のリソースを特定し、そのリソースをリクエスト元のクライアントに返すプロセスです。このプロセスは、ウェブサーバーへのリクエストごとに実行されます。リクエストによっては、HTML文書やGIF画像などのファイルが提供される場合もあれば、CGIプログラムの実行結果が提供される場合もあり、また、組み込みモジュールハンドラ、PHPドキュメント、Javaサーブレットなどの他のプロセスによって提供される場合もあります。[32] [要更新]
実際には、単純な静的コンテンツの提供(URL 書き換えエンジン、動的コンテンツの提供など) を超えた高度な機能を実装する Web サーバー プログラムでは、通常、その URL を次のように処理する方法を理解する必要があります。
ウェブサーバーの1つ以上の設定ファイルは、 URLパスの一部(例えば、ファイルパスの最初の部分、ファイル名の拡張子、その他のパスコンポーネント)を特定のURLハンドラー(ファイル、ディレクトリ、外部プログラム、または内部モジュール)にマッピングすることを指定する場合がある。[33]
ウェブ サーバーが上記の高度な機能の 1 つ以上を実装している場合、有効な URL のパス部分は、動的リクエストの内部または外部のモジュール プロセッサの仮想名を参照する可能性があるため、ウェブサイトのディレクトリ ツリー (ファイル システム内のファイルまたはディレクトリ) の下の既存のファイル システム パスと必ずしも一致しないことがあります。
ウェブサーバープログラムは、物理ファイルシステムパスを参照するURLパス(全体または一部)を、対象ウェブサイトのルートディレクトリ下の絶対パスに変換することができます。 [33]
ウェブサイトのルートディレクトリは、設定ファイルまたはウェブサーバーの内部ルールによって、HTTPクライアントリクエストに含まれるURLのホスト部分であるウェブサイト名を使用して指定されることがあります。 [33]
ファイル システムへのパス変換は、次の種類の Web リソースに対して実行されます。
ウェブサーバーは、要求されたURL(HTTPリクエストメッセージ)で見つかったパスを、(ホスト)ウェブサイトのルートディレクトリのパスに追加します。Apacheサーバーでは、これは通常 です/home/www/website(Unixマシンでは通常 です/var/www/website)。結果の例を以下に示します。
静的ファイルリクエストのURLパス変換
次の URL で指定された既存ファイルの 静的リクエストの例:
http://www.example.com/path/file.html
クライアントのユーザー エージェントはに接続しwww.example.com、次のHTTP /1.1 要求を送信します。
GET /path/file.html HTTP/1.1 ホスト: www.example.com 接続: キープアライブ
結果はローカル ファイル システム リソースになります。
/home/www/www.example.com/path/file.html
ウェブサーバーは、ファイルが存在する場合はそれを読み取り、クライアントのウェブブラウザに応答を送信します。応答にはファイルの内容とファイル自体が含まれます。そうでない場合は、ファイルが存在しない、またはアクセスが禁止されているというエラーメッセージが返されます。
ディレクトリ要求の URL パス変換 (静的インデックス ファイルなし)
次の URL で指定された既存のディレクトリの 暗黙的な動的要求の例:
http://www.example.com/directory1/directory2/
クライアントのユーザー エージェントはに接続しwww.example.com、次のHTTP /1.1 要求を送信します。
GET /ディレクトリ1/ディレクトリ2 HTTP/1.1 ホスト: www.example.com 接続: キープアライブ
結果はローカル ディレクトリ パスになります。
/home/www/www.example.com/ディレクトリ1/ディレクトリ2/
ウェブサーバーはディレクトリの存在を確認し、ディレクトリが存在しアクセス可能な場合はインデックスファイル(この場合は存在しません)を検索します。そして、ディレクトリ一覧表示専用の内部モジュールまたはプログラムにリクエストを渡し、最終的に出力データを読み取り、クライアントのウェブブラウザに応答を送信します。応答にはディレクトリの内容(含まれるサブディレクトリとファイルのリスト)が記載されるか、ディレクトリが存在しない、またはアクセスが禁止されていることを示すエラーメッセージが返されます。
動的プログラムリクエストのURLパス変換
動的リクエストの場合、クライアントが指定したURLパスは、Webサーバーが動的コンテンツを生成するために使用する既存の外部プログラム(通常はCGIを含む実行可能ファイル)を参照する必要があります。[34]
プログラム ファイルを使用して出力を生成する 動的リクエストの例:
http://www.example.com/cgi-bin/forum.php?action=view&orderby=thread&date=2021-10-15
クライアントのユーザー エージェントはに接続しwww.example.com、次のHTTP /1.1 要求を送信します。
GET /cgi-bin/forum.php?action=view&ordeby=thread&date=2021-10-15 HTTP/1.1 ホスト: www.example.com 接続: キープアライブ
結果は、プログラム (この例ではPHPプログラム) のローカル ファイル パスです。
/home/www/www.example.com/cgi-bin/forum.php
ウェブサーバーは、そのプログラムを実行し、パス情報とクエリ文字列 action=view&orderby=thread&date=2021-10-15を渡して、プログラムの実行に必要な情報を取得します。(この場合、2021年10月15日のスレッド順に並べられたフォーラムエントリのビューを含むHTMLドキュメントを返します。)さらに、ウェブサーバーは外部プログラムから送信されたデータを読み取り、リクエストを送信したクライアントにそのデータを再送信します。
リクエストが読み取られ、解釈され、検証されると、そのメソッド、URL、およびパラメータ(HTTP ヘッダーの値が含まれる場合があります)に応じて管理される必要があります。
実際には、ウェブサーバーは次のいずれかの応答パスを使用してリクエストを処理する必要があります。[33]
OPTIONS) がある場合、成功した応答が送信されます。
ウェブサーバープログラムが静的コンテンツを提供でき、そのように構成されている場合、リクエストメッセージに有効なURLパス(URLマッピング、URL変換、URLリダイレクト後)がウェブサイトのルートディレクトリの下にある既存のファイルのパスと一致し、ファイルがウェブサーバープログラムの内部ルールで要求される属性と一致する場合、ファイルコンテンツを送信できます。[33]
このような種類のコンテンツは、通常、クライアントに送信されるときに Web サーバーによって変更されず、何らかのプログラムによって変更 (ファイルの変更) されるまで同じままであるため、 静的と呼ばれます。
注:静的コンテンツのみを提供する場合、Web サーバー プログラムは通常、提供される Web サイトのファイル コンテンツを変更しません(読み取りのみが行われ、書き込まれることはないため)。そのため、次のHTTP メソッドのみをサポートすれば十分です。
OPTIONSHEADGET静的ファイル コンテンツの応答は、ファイル キャッシュによって高速化できます。
Web サーバー プログラムが、既存のディレクトリの 1 つに一致するパスを持つ URL を含むクライアント要求メッセージを受信し、そのディレクトリがアクセス可能であり、ディレクトリ インデックス ファイルの提供が有効になっている場合、Web サーバー プログラムは、そのディレクトリ内で見つかった最初の既知の (または構成された) 静的インデックス ファイル名 (通常のファイル) を提供しようとします。インデックス ファイルが見つからないか、その他の条件が満たされていない場合は、エラー メッセージが返されます。
静的インデックス ファイルで最もよく使用される名前は、、index.htmlおよびindex.htmですDefault.htm。
Web サーバー プログラムが、パスが既存ファイルのファイル名と一致する URL を含むクライアント要求メッセージを受信し、そのファイルが Web サーバー プログラムからアクセス可能であり、その属性が Web サーバー プログラムの内部規則と一致する場合、Web サーバー プログラムはそのファイルをクライアントに送信できます。
通常、セキュリティ上の理由から、ほとんどのウェブサーバープログラムは、通常のファイルのみを提供するように、またはデバイスファイルなどの特殊なファイルタイプや、それらへのシンボリックリンクやハードリンクの使用を避けるように事前設定されています。これは、静的なウェブリソースを提供する際に望ましくない副作用を回避することを目的としています。[35]

ウェブサーバープログラムが動的コンテンツを提供でき、そのように構成されている場合、適切な内部モジュールまたは外部プログラム(要求されたURLパスに関連付けられている)と通信し、クライアントからのリクエストのパラメータを渡すことができます。その後、ウェブサーバープログラムはそこからデータ応答(多くの場合、その場で生成されます)を読み取り、リクエストを送信したクライアントプログラムに再送信します。[要出典]
注:静的および動的コンテンツを提供する場合、Web サーバー プログラムは通常、クライアントからデータを安全に受信できるようにするために、また、大量のデータ セット (大量のデータ入力やファイルのアップロードなど) を Web サーバー、外部プログラム、またはモジュールに 送信する可能性のある対話型フォームを備えた Web サイトもホストできるようにするために、次の HTTP メソッドもサポートする必要があります。
POST内部モジュールまたは外部プログラムと通信できるようにするには、Web サーバー プログラムに、使用可能な多数のゲートウェイ インターフェイスの 1 つ以上を実装する必要があります(動的コンテンツに使用される Web サーバー ゲートウェイ インターフェイスも参照)。
標準的かつ歴史的なゲートウェイ インターフェイスは次の 3 つです。

ウェブサーバープログラムは、ファイルとサブディレクトリのディレクトリインデックスリストを動的に(オンザフライで)生成する機能を持つ場合があります。 [36]
ウェブサーバープログラムが動的に生成するように設定されており、要求されたURLパスが既存のディレクトリと一致し、そのディレクトリへのアクセスが許可され、かつそのディレクトリ内に静的インデックスファイルが見つからない場合、上記のディレクトリ内のファイルまたはサブディレクトリのリストを含むウェブページ(通常はHTML形式)が動的に(オンザフライで)生成されます。生成できない場合はエラーが返されます。
一部の Web サーバー プログラムでは、Web ページ テンプレートの使用を許可することでディレクトリ リストをカスタマイズできます。Web ページ テンプレートとは、$(FILE_NAME), $(FILE_SIZE)Web サーバーによってディレクトリ内で見つかった各ファイル エントリのフィールド値に置き換えられるプレースホルダ (など) を含む HTML ドキュメントです (例: )。index.tplまた、解釈されて実行される HTML および埋め込みソース コード (例: 、index.asp) の使用や、CGI、SCGI、FCGI などの動的インデックス プログラムの使用をサポートすることでディレクトリ リストをカスタマイズできます (例: index.cgi、index.php、index.fcgi)。
動的に生成されたディレクトリ リストの使用は、静的なインデックス ページを送信するよりもはるかに多くの OS リソースを消費するため、通常は回避されるか、Web サイトの選択されたいくつかのディレクトリに制限されます。
ディレクトリリストの主な用途は、ファイル(通常、ファイルの名前、サイズ、変更日時、またはファイル属性がランダムかつ頻繁に変更される可能性がある場合)をそのままダウンロードできるようにすることです。これにより、要求元のユーザーに詳細情報を提供する必要がなくなります。[37]
外部プログラムまたは内部モジュール(処理ユニット)は、1つまたは複数のデータリポジトリからデータを取得したり、データリポジトリにデータを保存したりするために使用できる何らかのアプリケーション関数を実行できます。[引用が必要]
処理ユニットは、データリポジトリから取得したデータを使用して、あらゆる種類のWebコンテンツを返すことができます。[引用が必要]
実際には、クライアント要求または構成設定に含まれる 1 つ以上のパラメータに応じて変化する可能性があるコンテンツがある場合は、通常、そのコンテンツは動的に生成されます。
ウェブサーバープログラムは、クライアントの要求メッセージに対する返答として応答メッセージを送信することができます。[29]
要求メッセージが正常に読み取れなかったり、デコードできなかったり、分析できなかったり、実行できなかったりすると、エラー応答メッセージが送信されることがあります。[30]
注意: 以下のセクションは、Web サーバーがどのような機能を果たすかを理解するための例としてのみ記載されており、網羅的でも完全でもありません。
Web サーバー プログラムは、クライアントの要求メッセージに対してさまざまな種類のエラー メッセージで応答することがあります。これらのエラーは主に 2 つのカテゴリに分類されます。
クライアント ブラウザーがエラー応答またはメッセージを受信すると、それがメインのユーザー要求 (Web ページなどの Web リソースの URL など) に関連している場合、通常、そのエラー メッセージが何らかのブラウザー ウィンドウまたはメッセージに表示されます。
ウェブサーバープログラムは、要求されたURLパスが次のとおりであるかどうかを確認できる場合がある: [40]
承認またはアクセス権機能が実装され、有効になっているが、Web リソースへのアクセスが許可されていない場合、必要なアクセス権に応じて、Web サーバー プログラムは次の処理を実行します。
ウェブサーバープログラムは、新しいURL(新しい場所)へのURLリダイレクトを行う機能を持つ場合があります。これは、クライアントのリクエストメッセージに対して、有効なまたは既存のウェブリソースにアクセスするのに適した新しいURLを含むレスポンスメッセージで応答することです(クライアントは新しいURLでリクエストをやり直す必要があります)。[41]
場所のURLリダイレクトが使用される: [41]
例1:URLパスはディレクトリ名を指していますが、末尾にスラッシュ「/」がないため、Webサーバーはクライアントにリダイレクトを送信し、固定パス名でリクエストをやり直すように指示します。[36]
送信元:
/directory1/directory2
送信先:
/directory1/directory2/
例 2:ファイル システム パスを再編成するために、 ドキュメント セット全体がWeb サイト内で移動されました。
送信元:
/directory1/directory2/2021-10-08/
送信先:
/directory1/directory2/2021/10/08/
例 3: ドキュメントのセット全体が新しい Web サイトに移動されたため、それらにアクセスするには安全な HTTPS 接続を使用する必要がある。
送信元:
http://www.example.com/directory1/directory2/2021-10-08/
送信先:
https://docs.example.com/directory1/2021-10-08/
上記の例は、リダイレクトの可能な種類のほんの一部です。
ウェブサーバープログラムは、有効なクライアント要求メッセージに対して、要求されたウェブリソースデータをオプションで含む成功メッセージで応答することができます。[42]
Web リソース データがクライアントに送り返される場合、そのデータは、取得方法 (ファイルから取得されたか、何らかのプログラムまたはモジュールの出力から取得されたか) に応じて、静的コンテンツまたは動的コンテンツになります。
ウェブサーバーの応答速度を上げるため、HTTPの平均応答時間と使用するハードウェアリソースを削減するために、多くの一般的なウェブサーバーでは、コンテンツカテゴリごとに特化した1つ以上のコンテンツキャッシュを実装しています。[43] [44]
コンテンツは通常、そのオリジンによってキャッシュされます。
歴史的に、頻繁かつランダムに素早くアクセスする必要のあるファイル内の静的コンテンツは、 1960 年代中期から 1970 年代後半にかけて、主に電気機械ディスクに保存されてきました。残念ながら、こうしたデバイスからの読み取りと書き込みは、 RAM の速度と比較すると常に非常に遅い操作であると考えられてきました。そのため、初期のOS以降、頻繁にアクセスされるデータのI/O操作を高速化するために、最初にディスク キャッシュが開発され、次にOSファイルキャッシュサブシステムが開発されました。
OS ファイル キャッシュの支援があっても、ディスクに保存されたディレクトリやファイルに関連する I/O 操作の相対的または偶発的な遅さは、特にインターネットまたはネットワーク回線の速度の継続的な向上に伴い Web インターネット トラフィックが急激に増加し始めた 1990 年代中盤から後半にかけて、トップレベルの Web サーバーに期待されるパフォーマンスの向上のボトルネックになりました。
静的ファイルの提供をさらに効率的に高速化し、1秒あたりのリクエストまたは応答の最大数(RPS)を増やす方法に関する問題は、Webサーバープログラムに実装できる便利なキャッシュモデルを提案することを目的として、1990年代半ばから研究され始めました。[45]
実際には、今日では多くのウェブサーバープログラムには、ウェブサーバーの使用に合わせてカスタマイズされた独自のユーザーランド ファイルキャッシュが含まれており、特定の実装とパラメータを使用しています。 [46] [47] [48]
RAIDと高速ソリッド ステート ドライブ(非常に高い I/O 速度を備えたストレージ ハードウェア)が広く採用されるようになったことで、Web サーバーにファイル キャッシュを組み込むことの利点は若干減少しましたが、もちろん完全になくなったわけではありません。
内部モジュールや外部プログラムによって出力される動的コンテンツは、必ずしも頻繁に変更されるわけではない(キーやパラメータを持つ一意のURLが与えられている場合)。そのため、しばらくの間(例えば1秒から数時間以上)、結果の出力はRAMや高速ディスクにキャッシュされる可能性がある。[49]
動的キャッシュの典型的な使用法は、ウェブサイトがニュース、天気、画像、地図などの動的なウェブページを持ち、頻繁に(例えばn分ごとに)変更されず、毎分毎時間膨大な数のクライアントからアクセスされる場合です。このような場合、クライアントはブラウザのキャッシュに要求されたコンテンツの更新されたコピーを持っていないことが多いため、キャッシュされたコンテンツも返すことが有用です(内部モジュールや外部プログラムを呼び出さずに)。[50]
いずれにせよ、ほとんどの場合、これらの種類のキャッシュは、外部サーバー(例:リバースプロキシ)によって実装されるか、動的なデータ出力を別のコンピューターに保存し、特定のアプリケーション(例:memcached)によって管理されます。これは、Webサーバーとのハードウェアリソース(CPU、RAM、ディスク)の競合を回避するためです。[51] [52]
Web サーバー ソフトウェアは、OSに組み込まれてカーネル空間で実行されるか、または (他の通常のアプリケーションと同様に)ユーザー空間で実行されます。
カーネル モードで実行される Web サーバー(通常はカーネル スペース Web サーバーと呼ばれます) はカーネル リソースに直接アクセスできるため、理論上はユーザー モードで実行されるサーバーよりも高速になりますが、Web サーバーをカーネル モードで実行すると欠点 (ソフトウェアの開発とデバッグが困難になるなど)があり、実行時に 重大なエラーが発生するとOS カーネルに深刻な問題が発生する可能性があります。
ユーザーモードで実行されるウェブサーバーは、メモリやCPUリソースの追加使用許可をシステムに求める必要があります。カーネルへのこれらの要求は時間がかかるだけでなく、システムは自身の使用のためにリソースを予約し、他のすべての実行中のアプリケーションとハードウェアリソースを共有する責任があるため、必ずしも要求が満たされるとは限りません。また、ユーザーモードでの実行は、バッファやデータコピー(ユーザー空間とカーネル空間間)の増加を意味し、ユーザーモードウェブサーバーのパフォーマンス低下につながる可能性があります。
今日では、ほぼすべてのウェブサーバーソフトウェアはユーザーモードで実行されます(前述の小さな欠点の多くは、ハードウェアの高速化、OSの新バージョン、OSシステムコールの大幅な高速化、そして最適化された新しいウェブサーバーソフトウェアによって克服されているためです)。ウェブサーバーソフトウェアの比較も参照して、どのソフトウェアがカーネルモードで実行されるか、どのソフトウェアがユーザーモード(カーネル空間またはユーザー空間とも呼ばれます)で実行されるかを確認してください。
ユーザー エクスペリエンス(クライアント側またはブラウザー側) を向上させるには、Web サーバーはクライアントの要求に対してすばやく (できるだけ早く) 応答する必要があります。一部の種類のファイル (大きいファイルや巨大なファイルなど) に対するコンテンツ応答が (構成によって) 調整されない限り、返されるデータ コンテンツもできるだけ速く (転送速度を上げて) 送信される必要があります。
言い換えれば、Web サーバーは、 Web トラフィックの負荷が高い場合でも、応答に対するユーザーの総待機時間(ブラウザー時間 + ネットワーク時間 + Web サーバーの応答時間の合計) を可能な限り短くするために、常に応答性が高くなければなりません。
ウェブサーバーソフトウェアの場合、主要な主要パフォーマンス指標(さまざまな動作条件下で測定)は通常、少なくとも以下のものになります。[53]
動作条件の中で、テスト中に使用される同時クライアント接続の数(1 .. n ) は、Web サーバーでサポートされる同時実行レベルとテストされたパフォーマンス メトリックの結果を相関させることができるため、重要なパラメーターです。
採用された特定の Web サーバーソフトウェア設計とモデル:
...その他のプログラミング手法としては、次のようなものがあります。
...Web サーバー プログラムを実装するために使用されるものは、パフォーマンスに大きな偏りが生じる可能性があり、特に、高負荷時やハイエンド ハードウェア (多数の CPU、ディスク、大量の RAM) を使用する場合に達成できるスケーラビリティレベルに偏りが生じる可能性があります。
実際には、一部の Web サーバー ソフトウェア モデルでは、正常に動作して目標のパフォーマンスを達成するために、他のモデルよりも多くの OS リソース (特に、より多くの CPU と RAM) が必要になる場合があります。
Web サーバーの パフォーマンスに影響を与える可能性のある動作条件は多数あり、パフォーマンス値は以下の要素に応じて変化する可能性があります。
Web サーバーのパフォーマンスは通常、利用可能な 自動負荷テスト ツールを使用してベンチマークされます。
Web サーバー (プログラムのインストール) には通常、動作条件の組み合わせごとに事前定義された負荷制限があります。これは、OS リソースによって制限され、限られた数のクライアント同時接続しか処理できないためです (通常、アクティブな Web サーバー プロセスごとに 2 ~ 数万。C10k問題とC10M 問題も参照)。
Web サーバーが負荷制限に近づいたり、負荷制限を超えたりすると、過負荷状態になり、応答しなくなる可能性があります。
ウェブ サーバーは、次のいずれかの原因により、いつでも過負荷になる可能性があります。
ウェブ サーバーの過負荷の症状は通常、次のようになります。
平均を超える負荷制限を部分的に克服し、過負荷を防ぐために、ほとんどの人気のある Web サイトでは次のような一般的な手法が使用されています。
download.*static.*www.*https://download.example.comhttps://static.example.comhttps://www.example.com

以下は、 Netcraftによるインターネット上のトップ Web サーバーの全サイトの市場シェアの最新統計です。
注: (*) パーセンテージは、小数値がソースページで公開されていないため、整数に丸められています (グラフでは丸められた値のみが報告されます)。
動的コンテンツに使用される標準 Web サーバー ゲートウェイ インターフェイス:
動的コンテンツに使用されるその他の Web サーバー インターフェイス (サーバーまたはプログラミング言語に固有) は次のとおりです。