web-dev-qa-db-ja.com

サーバーには1つのWebサイトしかありませんか?

私が理解していることから、DNSリンクはWebサイトが保存されているサーバーのIPアドレスとドメイン名をリンクしていますが、それは各サーバーが1つのWebサイトしか保持できないことを意味しますか?そうでない場合は、サーバーのIPアドレスを呼び出すことで、同じサーバー上に多数のWebサイトがある場合にどのWebサイトを希望するかがどのようにわかりますか?

80
user3407319

基本的に、ブラウザはHTTPリクエストにドメイン名を含めるので、Webサーバはどのドメインがリクエストされたかを認識し、それに応じて応答することができます。


HTTPリクエスト

一般的なHTTPリクエストは次のようになります。

  1. ユーザーはhttp://Host:port/pathの形式でURLを提供します。

  2. ブラウザはURLのHost(ドメイン)部分を抽出し、必要に応じてそれを名前解決として知られるプロセスでIPアドレスに変換します。この変換はDNS経由で行うことができますが、必須ではありません(たとえば、一般的なOS上のローカルのhostsファイルはDNSをバイパスします)。

  3. ブラウザは、そのIPアドレスで指定されたポートへのTCP接続を開くか、デフォルトでポート80を開きます。

  4. ブラウザがHTTPリクエストを送信します。 HTTP/1.1の場合、これは次のようになります。

    GET /path HTTP/1.1
    Host: example.com
    

    Hostヘッダは標準でHTTP/1.1では必須です。HTTP/ 1.0仕様では指定されていませんでしたが、とにかくサポートしているサーバもあります。)

ここから、Webサーバーは、応答がどうあるべきかを決定するために使用できるいくつかの情報を持ちます。単一のWebサーバーを複数のIPアドレスにバインドすることが可能です。

  • TCPソケットからの要求されたIPアドレス
    • クライアントのIPアドレスも利用可能ですが、これはめったに使用されません - 時々ブロック/フィルタリングのために
  • TCPソケットからの要求されたポート
  • HTTPリクエストでブラウザによってHostヘッダーに指定された、リクエストされたホスト名。
  • 要求されたパス
  • その他のヘッダ(クッキーなど)

お気づきのとおり、最近の最も一般的な共有ホスティング設定では、複数のWebサイトを単一のIPアドレス:ポートの組み合わせに配置し、Webサイトを区別するためにHostを残しています。

これはApache-landでは 名前ベースの仮想ホスト として知られていますが、Nginxはそれらをサーバーブロック内の サーバー名 およびIISは Virtual Server を優先します。


HTTPSはどうですか?

HTTPSは少し異なります。 TCP接続が確立されるまではすべて同じですが、その後暗号化されたTLSトンネルを確立する必要があります。目標は、要求に関する情報を漏らさないことです。

サーバーが実際にこのドメインを所有していることを確認するために、サーバーは信頼できる第三者によって署名された証明書を送信する必要があります。ブラウザはこの証明書を要求したドメインと比較します。

これは問題を提起します。 HTTPリクエストを受信する前にサーバーがこれを行う必要がある場合、サーバーはどのホスト(Webサイト)の証明書をどのようにして送信するのかをどのように認識しますか?

これまでは、HTTPSを必要とするすべてのWebサイトに専用のIPアドレス(またはポート)を割り当てることでこれを解決していました。明らかに、IPv4アドレスが不足し始めると、これは問題になります。

SNI (サーバー名表示)を入力します。ブラウザはTLSネゴシエーション中にホスト名を渡すようになりました。そのため、サーバは正しい証明書を送信するのに十分早くこの情報を取得します。サーバー側では、構成はHTTP仮想ホストの構成方法と非常によく似ています。

欠点は、ホスト名が暗号化の前にプレーンテキストとして渡されるようになり、本質的に情報が漏洩することです。とにかくホスト名が通常DNSクエリで公開されていることを考えると、これは通常許容できるトレードオフと見なされます。


IPアドレスのみでサイトをリクエストした場合はどうなりますか?

どの特定のホストが要求されたのかがわからない場合のサーバーの動作は、サーバーの実装と構成によって異なります。通常、ホストを明示的に指定していないすべての要求に対して応答を提供する「デフォルト」、「キャッチオール」、または「フォールバック」サイトが指定されています。

このデフォルトサイトは、サーバー管理者の好みに応じて、独自の独立したサイト(多くの場合エラーメッセージを表示する)でも、サーバー上の他のサイトでもかまいません。

149
Bob

私はこの技術者以外の人々のための説明を持っています。

ジャック、ジル、ジョーは寮に住んでいて、彼らは携帯電話を持っていません。

電話帳では、それらはすべて同じ番号でリストされています。 (記録)

番号をダイヤルすると、誰かが電話に出ます。あなたは「私はジルに話したいのです」と言って、あなたは彼女を電話に出します。

電話帳のAレコード(電話番号/ IPアドレス)の代わりに、単に「Dormitory X」と表示されている可能性があるので、さらにDormitory Xの番号を探す必要があります。これはCNAMEレコードです。

ジルが利用できない場合は、得るかもしれません

  • 404ジルはここにいません
  • 410ジルは死んでいる。
  • 301ジルはピーターと共に動かされる
  • 302ジルはピーターを訪問している、代わりに彼に電話をする

  • 400あなたが理解できない.

  • 401あなたは誰ですか?パスワードは何ですか?または午後10時以降の男性の発信者を許可しない
  • 402支払いが必要です(ジルは彼女の本名です - ;))
  • 403いいえ、それは正しいパスワードではありません。
  • 418ジルはティーポットです:-)
  • 429ジルはこれ以上電話を取ることができない。
  • 451あなたはあなたの拘束命令に違反しています。

  • 500私たちの電話システムは故障しました。

92
Lenne

私が理解していることから、DNSリンクはWebサイトが保存されているサーバーのIPアドレスとドメイン名をリンクしていますが、それは各サーバーが1つのWebサイトしか保持できないことを意味しますか?

まず、ここにはいくつかの異なる概念があることを理解する必要があります。

  • Webサイト、首尾一貫した全体を形成するWebページのグループ。
  • IPアドレス。トラフィックの送信元または宛先としてインターネットプロトコルで使用される数値アドレス(IPv4では32ビット、IPv6では128ビット)。
  • サーバー、クライアントからの要求を処理することを仕事とするマシン。
  • ホスト名、DNS内のマシンを識別するために使用される名前(例: "www.example.com"または "en.wikipedia.org")

これらのことの間に一対一の関係はありません。 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をサポートしていますが、古いバージョンが使用されなくなるまで長い時間がかかりました。

6
plugwash

その答えは、いくつかの答えがそうであるとしているよりも少し複雑です。 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サイトとページを決定することです。

3
Machavity

DNSを使用すると、個々のIPアドレスに好きなだけ多くの名前を割り当てることができます(たとえば、 hostsファイル では、各名前をスペースで区切ることができます)。 DNSサーバーを使用すると、 単一の名前に複数のIPアドレスを割り当てることもできます 。 1対1の関係に限定されません。

Webサーバーは、 examining によって、要求されたURLによってどのサイトを提供するかを知っています。どのドメインが要求されたか、要求されたポート、およびどのプロトコルが使用されたかを調べます。これはDNSとは関係がなく、HTTPプロトコルによって処理されます。

1
krowe

あなたのサーバのIPアドレスは同時に多くの異なるドメイン名を持つことができます。

Webサイトにアクセスすると、ブラウザからドメイン名を含むHTTPリクエストが送信され、サーバーからどのWebサイトのデータが送信されるのかがわかります。

これは仮想ホストと呼ばれ、とてもシンプルです:)

DNSと仮想ホストの詳細については、 をご覧ください

0
Tim Connor

WebサーバはHostコンテナの概念を持っています(例えば here はTomcatのドキュメントです)。同じbox/ipアドレスに対して複数のHostコンテナを設定し、複数のドメインにサービスを提供することができます。コンテナには、独立した作業ディレクトリ、認証領域、ログディレクトリなどがあります。

サーバーは、新しいHTTP要求に関連するコンテナを見つけ、ドメイン名はこのHTTP要求の一部です。

完全に異なるWebサーバーインスタンスが異なるポートで実行されている場合は、同じIPアドレスを共有できます。本番サーバは任意のポートで実行できないため、これは主にドメイン名が利用できないさまざまな開発およびテスト環境で使用されます。

最後に、Webサイトに厳密に一意のIPアドレスが必要な場合でも、サーバーボックスには複数のネットワークアダプターがあることが多いため、複数のIPアドレスを使用するように構成されています。

0
h22