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