サーバーは1つのWebサイトのみを保持していますか?


80

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


13
ウィキペディアには、共有Webホスティングに関する優れた紹介があります。ブラウザにhttp:// <IP_ADDR> /と入力すると、HTTPリクエストのHost:ヘッダー内にドメインが含まれなくなります。共有ホスティングの場合、プロバイダーはこれをさまざまな方法で処理するようにWebサーバーを構成できます(たとえば、デフォルトを設定する、プロバイダーにリダイレクトするなど)。
ジェダイ

「このサーバーは、探しているウェブサイトをホストしていない/現在持っていない」などのメッセージが表示されるリンクをクリックしました。
ジェスビン・ホセ

1
単一のサーバーで複数のアプリケーションを実行する方法を探している場合-たとえば、ポート8001と8002にそれぞれMyAppとYourAppの2つのアプリがあるとします。myapp.comとyourapp.comで2つのロードバランサーまたはアプリケーションプロキシを使用できます。デフォルトのポート(80/443)でリクエストを受信し、それぞれポート8001と8002の実際のサーバーに転送するようにします。
rohithpr

6
いい質問ですね。以前はすべてのWebサイトに独自のIPアドレスが必要でした(サーバーは複数のIPアドレスを持つことができます)。HTTP / 1.1のHostヘッダーは、説明した正確な問題を回避するために導入されました。で「インターネットアドレスの保全」を参照してください。www8.org/w8-papers/5c-protocols/key/key.html
AE

6
http 1.1にホストヘッダーがなかった場合、今のところipv6が実装されています;-) :
Lenne June

回答:


149

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


HTTPリクエスト

典型的なHTTPリクエストの発生方法は次のとおりです。

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

  2. ブラウザーは、URLのホスト(ドメイン)部分を抽出し、必要に応じて、名前解決と呼ばれるプロセスでIPアドレスに変換します。この変換はDNSを介して実行できますが、その必要はありません(たとえば、hosts一般的なOSのローカルファイルは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サーバーが複数のIPアドレスにバインドされる可能性があることに注意してください。

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

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

これは、Apacheランドでは名前ベースの仮想ホストとして知られていますが、Nginxはそれらをサーバーブロックでサーバー名と呼び、IISは仮想サーバーを好みます


HTTPSはどうですか?

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

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

これには問題があります。HTTPリクエストを受信する前にこれを行う必要がある場合、サーバーはどのホスト(ウェブサイト)の証明書を送信するかをどのように知るのですか?

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

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

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


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

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

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


1
また、HerokuやAmazonが使用するロードバランサーの場合のように、1つのサイトが多数のサーバーに分割される場合があります。
phyrfox

1
@phyrfoxええ、私はそれを追加することを考えましたが、それは質問に正接的に関連しているだけで、私はあまり長く答えたくありませんでした。後でセクションを追加することになるかもしれません。
ボブ

伝説では、サブドメインがネットワーク内の特定のコンピューターを指すようになっています。理論的には
ルーパック

「従来、これはHTTPSを必要とするすべてのWebサイトに専用のIPアドレス(またはポート)を持たせることで解決しました。明らかに、IPv4アドレスがなくなると問題になります。」 。
レンネ

92

この説明は技術系以外の人向けです。

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

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

番号をダイヤルすると、誰かが電話を取ります。「ジルと話をしたい」と言って、彼女に電話をかけます。

電話帳のAレコード(電話番号/ IPアドレス)の代わりに、「ドミトリーX」とだけ言う場合は、ドミトリーXの番号をさらに探す必要があります。これはCNAMEレコードです。

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

  • 404ジルはここにいない
  • 410ジルが死んだ。
  • 301ジルはピーターと一緒に引っ越しました
  • 302ジルはピーターを訪問しています

  • 400わかりません。

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

  • 500電話システムが故障しました。


不思議なことに、418の背後にあるRFCはtools.ietf.org/html/rfc2324であり、興味深い記事sitesdoneright.com/blog/2013/03/… :)
Wordzilla

6

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

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

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

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


あなたは、各...上の異なるサーバーを実行して、TCPは、多くのポートで待機できることを言及するのを忘れてしまった
トビースパイツ

はい、しかし、あなたがDNSでportnumbersを持っていない、とあなたはjoe.p.userに行くことを期待することはできませんour.fabulous.site:81のほか、一部のファイアウォールは、非標準portnumbersへの発信アクセスをブロックします。
レンネ

3

答えは、いくつかの答えが出てきたものよりも少し複雑です。DNSルックアップを実行するとき、IPアドレスを取得する必要があります(AIPv4、AAAAIPv6のレコード)。通信するには、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.comWebサイトであり、そのWebサイトがどのディレクトリの下にあるかを伝えます。その後、このブロックを何度も繰り返して、さまざまなWebサイトを処理するようにApacheに指示できます。すべてのWebサーバーは、このタイプのシステムをサポートしています。

これを処理する別の方法は、すべてのWebトラフィックを1つのプログラミングスクリプト(PHP、ASP.NETなど)に転送するようWebサーバーに指示し、その1つのスクリプトが表示するWebサイトとページを決定することです。


1

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

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


0

Webサーバは、ホストコンテナ(の概念があり、ここでのTomcatのドキュメントは、例えば、あります)。同じボックス/ IPアドレスに対して複数のホストコンテナを構成し、複数のドメインにサービスを提供できます。コンテナには、独立した作業ディレクトリ、認証領域、ログディレクトリなどがあります。

サーバーは、このHTTPリクエストの一部であるドメインの名前を購入する新しいリクエストに関連するコンテナを見つけます。

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

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


0

サーバーのIPアドレスは、同時に多くの異なるドメイン名を保持できます。

Webサイトにアクセスすると、ブラウザはドメイン名を含むHTTPリクエストを送信します。サーバーは、どのWebサイトデータを送信するかを見つけることができます。

これは仮想ホストと呼ばれ、とても簡単です:)

DNSおよび仮想ホストの詳細については、こちらをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.