私が理解しているDNSリンクから、ウェブサイトが保存されているサーバーのIPアドレスとドメイン名をリンクしているので、各サーバーは1つのウェブサイトしか保持できないということですか?そうでない場合、サーバーのIPアドレスを呼び出すと、同じサーバーに多数のWebサイトがある場合にどのWebサイトが必要かがわかりますか?
私が理解しているDNSリンクから、ウェブサイトが保存されているサーバーのIPアドレスとドメイン名をリンクしているので、各サーバーは1つのウェブサイトしか保持できないということですか?そうでない場合、サーバーのIPアドレスを呼び出すと、同じサーバーに多数のWebサイトがある場合にどのWebサイトが必要かがわかりますか?
回答:
基本的に、ブラウザはHTTPリクエストにドメイン名を含めるため、ウェブサーバーはどのドメインがリクエストされたかを認識し、それに応じて応答できます。
典型的なHTTPリクエストの発生方法は次のとおりです。
ユーザーはの形式でURLを提供しますhttp://host:port/path
。
ブラウザーは、URLのホスト(ドメイン)部分を抽出し、必要に応じて、名前解決と呼ばれるプロセスでIPアドレスに変換します。この変換はDNSを介して実行できますが、その必要はありません(たとえば、hosts
一般的なOSのローカルファイルはDNSをバイパスします)。
ブラウザは、そのIPアドレスで、指定されたポートへのTCP接続を開きます。デフォルトはポート80です。
ブラウザはHTTPリクエストを送信します。HTTP / 1.1の場合、次のようになります。
GET /path HTTP/1.1
Host: example.com
(Host
ヘッダーは標準であり、HTTP / 1.1では必須です。HTTP/ 1.0仕様では指定されていませんでしたが、一部のサーバーはそれをサポートしています。)
ここから、ウェブサーバーには、応答を決定するために使用できる情報がいくつかあります。単一のWebサーバーが複数のIPアドレスにバインドされる可能性があることに注意してください。
Host
HTTPリクエストでブラウザがヘッダーに指定した、リクエストされたホスト名。お気づきのように、最近の最も一般的な共有ホスティング設定では、複数のWebサイトを単一のIPアドレスとポートの組み合わせに配置し、Host
Webサイトを区別するためだけに残しています。
これは、Apacheランドでは名前ベースの仮想ホストとして知られていますが、Nginxはそれらをサーバーブロックでサーバー名と呼び、IISは仮想サーバーを好みます。
HTTPSは少し異なります。TCP接続の確立まではすべて同じですが、その後、暗号化されたTLSトンネルを確立する必要があります。目標は、リクエストに関する情報を漏らさないことです。
サーバーが実際にこのドメインを所有していることを確認するには、サーバーは信頼できる第三者によって署名された証明書を送信する必要があります。ブラウザは、この証明書を要求したドメインと比較します。
これには問題があります。HTTPリクエストを受信する前にこれを行う必要がある場合、サーバーはどのホスト(ウェブサイト)の証明書を送信するかをどのように知るのですか?
従来、これはHTTPSを必要とするすべてのWebサイトに専用のIPアドレス(またはポート)を持たせることで解決されていました。明らかに、IPv4アドレスが不足し始めると、これは問題になります。
SNI(サーバー名表示)を入力します。ブラウザはTLSネゴシエーション中にホスト名を渡すようになったため、サーバーは正しい証明書を送信するのに十分早くこの情報を取得しました。サーバー側の構成は、HTTP仮想ホストの構成方法と非常に似ています。
欠点は、ホスト名が暗号化前にプレーンテキストとして渡されるようになり、本質的に情報が漏洩することです。これは通常、ホスト名が通常DNSクエリで公開されることを考慮すると、許容できるトレードオフと見なされます。
要求した特定のホストがわからない場合のサーバーの動作は、サーバーの実装と構成によって異なります。通常、ホストを明示的に指定していないすべての要求に応答する「デフォルト」、「キャッチオール」、または「フォールバック」サイトが指定されています。
このデフォルトサイトは、サーバー管理者の好みに応じて、独自の独立したサイト(多くの場合エラーメッセージを表示)にすることも、サーバー上の他のサイトにすることもできます。
この説明は技術系以外の人向けです。
ジャック、ジル、ジョーは寮に住んでいて、携帯電話を持っていません。
電話帳では、それらはすべて同じ番号でリストされています。(記録)
番号をダイヤルすると、誰かが電話を取ります。「ジルと話をしたい」と言って、彼女に電話をかけます。
電話帳のAレコード(電話番号/ IPアドレス)の代わりに、「ドミトリーX」とだけ言う場合は、ドミトリーXの番号をさらに探す必要があります。これはCNAMEレコードです。
ジルが利用できない場合、あなたは得るかもしれません
302ジルはピーターを訪問しています
400わかりません。
451あなたは自制命令に違反しています。
500電話システムが故障しました。
私が理解しているDNSリンクから、ウェブサイトが保存されているサーバーのIPアドレスとドメイン名をリンクしているので、各サーバーは1つのウェブサイトしか保持できないということですか?
まず、ここにはいくつかの明確な概念があることを理解する必要があります。
これらのいずれかの間には1対1の関係はありません。1つのサーバーに複数のIPアドレスを割り当てることができます。複数のホスト名が1つのIPアドレスを指すことができます。1つのホスト名が複数のIPアドレスを指すことができます。複数のWebサイトを同じホスト名の下に置くことができます。1つのWebサイトを複数のホスト名に広げることができます。
そうでない場合、サーバーのIPアドレスを呼び出すと、同じサーバーに多数のWebサイトがある場合にどのWebサイトが必要かがわかりますか?
昔(HTTP 1.0以前)、サーバーが異なる方法で処理したい各ホスト名には、独自のIPアドレスが必要でした。これはかなり無駄でした。
HTTP 1.1はHost
「ヘッダーをHTTP要求の必須フィールドとして追加しました(IIRC一部のベンダーはこれを以前にこれを拡張としてサポートしていました)。 IPアドレス:クライアントでのHTTP 1.1のサポートは、どこにでもあります。
残念ながら、SSL(後のTLS)はしわを追加しました。SSL / TLSセッションを確立するには、サーバーが要求されたホスト名をカバーするクライアントに証明書を提示する必要がありますが、HTTP要求はSSL / TLSセッションが確立されるまで到着しません。
SubjectAltName
フィールドの使用またはフィールドでのワイルドカードの使用により、1つの証明書で複数のホスト名をカバーすることができCommonName
ます。ただし、これは、特に関連するホスト名が異なる所有権を持つドメインの下にある場合、管理上の課題をもたらします。
そのため、TLSは「サーバー名表示」(SNI)拡張を導入しました。この拡張機能を使用すると、クライアントは、TLSハンドシェイク手順中に要求されたホスト名をサーバーに送信します。サーバーは適切な証明書を提示できます。残念ながら、すべての主要なSSL / TLS実装の現在のバージョンはSNIをサポートしていますが、古いバージョンが使用できなくなるには長い時間がかかりました。
答えは、いくつかの答えが出てきたものよりも少し複雑です。DNSルックアップを実行するとき、IPアドレスを取得する必要があります(A
IPv4、AAAA
IPv6のレコード)。通信するには、TCP / IPを介してソケットを開く必要があります。そうしないと、すべてが失敗します。そのアドレスはサーバーを表すことも、ロードバランサーを表すこともあります。プロキシを表すこともできます。たとえば、ホストがCloudFlareの背後にある場合、取得するアドレスはCloudFlareサーバーのものです。実サーバーはどこかにあります。これにより、ホストはサービス拒否攻撃などの問題を回避できます。
仮想ホスティングとは、あなたが質問していることです(他のいくつかの質問については触れましたが、詳細は触れていません)。仮想ホスティングはWeb要求を受け取り、ホスト名(つまりdomain.com)を参照して、提供するWebサイトを決定します。したがって、Apache HTTP Webサーバーでは、次のような構成になります。
<VirtualHost *:80>
ServerName www.domain.com
ServerAlias domain.com
DocumentRoot /var/www/domain.com
</virtualHost>
たとえば、これは単純化されています。そのため、Apacheに任意のIPのポート80でリッスンするように指示しています(マシンのIPをホストする最新の仮想マシンでは、ライブIPとは異なる場合があります)。次に、これがdomain.com
Webサイトであり、そのWebサイトがどのディレクトリの下にあるかを伝えます。その後、このブロックを何度も繰り返して、さまざまなWebサイトを処理するようにApacheに指示できます。すべてのWebサーバーは、このタイプのシステムをサポートしています。
これを処理する別の方法は、すべてのWebトラフィックを1つのプログラミングスクリプト(PHP、ASP.NETなど)に転送するようWebサーバーに指示し、その1つのスクリプトが表示するWebサイトとページを決定することです。
DNSを使用すると、個々のIPアドレスに必要な数の名前を割り当てることができます(hostsファイルでは、たとえば各名前をスペースで区切るだけです)。DNSサーバーを使用して、複数のIPアドレスを単一の名前に割り当てることもできます。1対1の関係に限定されません。
Webサーバーは、要求されたURLを調べることにより、どのサイトを提供するかを知っています。要求されたドメイン、要求されたポート、使用されたプロトコルを調べます。これはDNSとは関係なく、HTTPプロトコルによって処理されます。
Webサーバは、ホストコンテナ(の概念があり、ここでのTomcatのドキュメントは、例えば、あります)。同じボックス/ IPアドレスに対して複数のホストコンテナを構成し、複数のドメインにサービスを提供できます。コンテナには、独立した作業ディレクトリ、認証領域、ログディレクトリなどがあります。
サーバーは、このHTTPリクエストの一部であるドメインの名前を購入する新しいリクエストに関連するコンテナを見つけます。
完全に異なるWebサーバーインスタンスは、異なるポートで実行される場合、同じIPアドレスを共有できます。これは主に、プロダクションサーバーが任意のポートで実行できないため、ドメイン名が利用できないさまざまな開発およびテスト環境で使用されます。
最後に、ウェブサイトに厳密に一意のIPアドレスが必要な場合でも、サーバーボックスには多くの場合複数のネットワークアダプターがあるため、複数のIPアドレスを使用するように構成されます。
Host:
ヘッダー内にドメインが含まれなくなります。共有ホスティングの場合、プロバイダーはこれをさまざまな方法で処理するようにWebサーバーを構成できます(たとえば、デフォルトを設定する、プロバイダーにリダイレクトするなど)。