Halten Server nur eine Website?

80

Nach meinem Verständnis des DNS-Links ist der Domainname mit der IP-Adresse des Servers verknüpft, auf dem die Website gespeichert ist. Bedeutet das, dass jeder Server nur eine Website enthalten kann? Wenn nicht, woher weiß der Aufruf der IP-Adresse des Servers, welche Website ich haben möchte, wenn sich viele auf demselben Server befinden?

user3407319
quelle
13
Wikipedia hat eine gute Einführung in Shared Web Hosting . Wenn Sie in Ihrem Browser http: // <IP_ADDR> / eingeben, enthält die HTTP-Anforderung keine Domäne im Host:Header. Im Falle von Shared Hosting kann der Webserver vom Anbieter so konfiguriert werden, dass dies auf unterschiedliche Weise behandelt wird (z. B. Standard, Weiterleitung an den Anbieter usw.).
Jedi
Ich habe auf Links geklickt, die mit Nachrichten wie "Dieser Server hat die gesuchte Website noch nie / derzeit nicht gehostet" brechen.
Jesvin Jose
1
Wenn Sie nach einer Möglichkeit suchen, mehrere Anwendungen auf einem einzigen Server auszuführen, nehmen wir an, Sie haben zwei Anwendungen, MyApp und YourApp, auf den Ports 8001 bzw. 8002. Sie können zwei Load Balancer oder Anwendungs-Proxys unter myapp.com und yourapp.com einrichten. Lassen Sie sie Anforderungen an den Standardports (80/443) empfangen und an die tatsächlichen Server an den Ports 8001 bzw. 8002 weiterleiten.
Rohithpr
6
Gute Frage. Jede Website benötigt eine eigene IP-Adresse (ein Server kann mehrere IP-Adressen haben). Der Host-Header in HTTP / 1.1 wurde eingeführt, um das von Ihnen beschriebene Problem zu umgehen. Siehe " Aufbewahrung von
AE
6
Wenn http 1.1 den Host-Header nicht hätte, wäre ipv6 jetzt implementiert ;-) :-(
Lenne

Antworten:

149

Grundsätzlich gilt: Der Browser bezieht den Domainnamen in die HTTP-Anfrage ein, sodass der Webserver weiß, welche Domain angefordert wurde und entsprechend reagieren kann.


HTTP-Anfragen

So passiert Ihre typische HTTP-Anfrage:

  1. Der Benutzer gibt im Formular eine URL an http://host:port/path.

  2. Der Browser extrahiert den Host- (Domain-) Teil der URL und übersetzt ihn bei Bedarf in eine IP-Adresse. Dies wird als Namensauflösung bezeichnet . Diese Übersetzung kann über DNS erfolgen, muss jedoch nicht (z. B. hostsumgeht die lokale Datei auf gängigen Betriebssystemen DNS).

  3. Der Browser öffnet eine TCP-Verbindung zu dem angegebenen Port oder verwendet standardmäßig Port 80 für diese IP-Adresse.

  4. Der Browser sendet eine HTTP-Anfrage. Für HTTP / 1.1 sieht das so aus:

    GET /path HTTP/1.1
    Host: example.com
    

    (Der HostHeader ist Standard und in HTTP / 1.1 erforderlich. Er wurde in der HTTP / 1.0-Spezifikation nicht angegeben, wird jedoch von einigen Servern trotzdem unterstützt.)

Von hier aus kann der Webserver anhand mehrerer Informationen entscheiden, wie die Antwort lauten soll. Beachten Sie, dass ein einzelner Webserver an mehrere IP-Adressen gebunden sein kann.

  • Die angeforderte IP-Adresse aus dem TCP-Socket
    • Die IP-Adresse des Clients ist ebenfalls verfügbar, wird jedoch selten verwendet - manchmal zum Blockieren / Filtern
  • Der angeforderte Port vom TCP-Socket
  • Der angeforderte Hostname, wie im HostHeader des Browsers in der HTTP-Anforderung angegeben.
  • Der angeforderte Pfad
  • Alle anderen Header (Cookies usw.)

Wie Sie anscheinend bemerkt haben, werden beim derzeit am häufigsten verwendeten Shared-Hosting-Setup mehrere Websites auf eine einzige Kombination aus IP-Adresse und Port gelegt, sodass nur Hostzwischen Websites unterschieden werden muss.

Dies wird in Apache-land als namensbasierter virtueller Host bezeichnet , während Nginx sie Servernamen in Serverblöcken nennt und IIS den virtuellen Server bevorzugt .


Was ist mit HTTPS?

HTTPS ist ein bisschen anders. Bis zum Aufbau der TCP-Verbindung ist alles identisch, danach muss jedoch ein verschlüsselter TLS-Tunnel aufgebaut werden. Ziel ist es, keine Informationen über die Anfrage zu verlieren.

Um zu überprüfen, ob der Server tatsächlich Eigentümer dieser Domäne ist, muss der Server ein von einem vertrauenswürdigen Dritten signiertes Zertifikat senden. Der Browser vergleicht dieses Zertifikat dann mit der von ihm angeforderten Domain.

Dies ist ein Problem. Woher weiß der Server, welches Zertifikat des Hosts (der Website) gesendet werden soll, wenn dies erforderlich ist, bevor die HTTP-Anforderung empfangen wird?

Traditionell wurde dies dadurch gelöst, dass für jede Website, die HTTPS benötigt, eine eigene IP-Adresse (oder ein eigener Port) eingerichtet wurde. Offensichtlich wird dies problematisch, wenn uns die IPv4-Adressen ausgehen.

Geben Sie SNI (Server Name Indication) ein. Der Browser übergibt jetzt den Hostnamen während der TLS-Verhandlungen, sodass der Server diese Informationen früh genug hat, um das richtige Zertifikat zu senden. Auf der Serverseite ist die Konfiguration der Konfiguration der virtuellen HTTP-Hosts sehr ähnlich.

Der Nachteil ist, dass der Hostname jetzt vor der Verschlüsselung als Klartext übergeben wird und im Wesentlichen Informationen verloren gehen. Dies wird normalerweise als akzeptabler Kompromiss angesehen, da der Hostname normalerweise ohnehin in einer DNS-Abfrage offengelegt wird.


Was ist, wenn Sie eine Site nur über die IP-Adresse anfordern?

Was der Server tut, wenn er nicht weiß, welchen bestimmten Host Sie angefordert haben, hängt von der Serverimplementierung und -konfiguration ab. In der Regel ist eine "Standard" -, "Catchall" - oder "Fallback" -Site angegeben, die Antworten auf alle Anforderungen liefert, die keinen Host explizit angeben.

Bei dieser Standardwebsite kann es sich um eine eigene unabhängige Site handeln (die häufig eine Fehlermeldung anzeigt), oder es kann sich um eine beliebige andere Site auf dem Server handeln, je nach den Vorlieben des Serveradministrators.

Bob
quelle
1
Außerdem kann ein Standort auf mehrere Server aufgeteilt sein, wie dies bei Load Balancern wie Heroku und Amazon der Fall ist.
Phyrfox
1
@phyrfox Ja, ich habe darüber nachgedacht, das hinzuzufügen, aber es hängt nur tangential mit der Frage zusammen und ich wollte die Antwort nicht zu lang machen. Möglicherweise wird später noch ein Abschnitt hinzugefügt.
Bob
Die Legende besagt, dass Unterdomänen auf bestimmte Computer in einem Netzwerk verweisen. In der Theorie
Loupax
"Traditionell wurde dies dadurch gelöst, dass für jede Website, die HTTPS benötigt, eine dedizierte IP-Adresse (oder ein dedizierter Port) eingerichtet wurde. Offensichtlich wird dies problematisch, da uns die IPv4-Adressen ausgehen." .
Lenne
92

Ich habe diese Erklärung für Nicht-Tech-Leute.

Jack, Jill und Joe leben in einem Schlafsaal und haben keine Handys.

Im Telefonbuch werden sie alle mit derselben Nummer aufgelistet. (Ein Rekord)

Sie wählen die Nummer und jemand nimmt den Hörer ab. Sie sagen "Ich würde gerne mit Jill sprechen" und bringen sie in die Leitung.

Anstelle eines A-Eintrags (A-Telefonnummer / IP-Adresse) im Telefonbuch wird möglicherweise nur "Schlafsaal X" angezeigt. Sie müssen dann weiter nach der Nummer für Schlafsaal X suchen. Dies ist ein CNAME-Eintrag.

Wenn Jill nicht verfügbar ist, erhalten Sie möglicherweise

  • 404 Jill ist nicht hier
  • 410 Jill ist tot.
  • 301 Jill ist bei Peter eingezogen
  • 302 Jill besucht Peter, ruft ihn stattdessen an

  • 400 Ich kann dich nicht verstehen.

  • 401 Wer bist du? Wie lautet das Passwort? oder Wir erlauben keine männlichen Anrufer nach 22 Uhr
  • 402 Zahlung erforderlich (Sind Sie sicher, dass Jill ihr richtiger Name ist ;-))
  • 403 Nein, das ist nicht das richtige Passwort.
  • 418 Jill ist eine Teekanne :-)
  • 429 Jill kann keine Anrufe mehr entgegennehmen.
  • 451 Sie verletzen Ihre einstweilige Verfügung.

  • 500 Unsere Telefonanlage ist ausgefallen.

Lenne
quelle
Für die Neugierigen ist der RFC hinter 418 tools.ietf.org/html/rfc2324 und ein interessanter Artikel sitesdoneright.com/blog/2013/03/… :)
Wordzilla
6

Nach meinem Verständnis des DNS-Links ist der Domainname mit der IP-Adresse des Servers verknüpft, auf dem die Website gespeichert ist. Bedeutet das, dass jeder Server nur eine Website enthalten kann?

Zunächst müssen Sie verstehen, dass es hier eine Reihe von unterschiedlichen Konzepten gibt.

  • Website, eine Gruppe von Webseiten, die ein zusammenhängendes Ganzes bilden.
  • IP-Adresse, eine numerische Adresse (32-Bit für IPv4, 128-Bit für IPv6), die vom Internetprotokoll als Quelle oder Ziel für den Datenverkehr verwendet wird.
  • Server, eine Maschine, deren Aufgabe es ist, Anforderungen von Clients zu bedienen.
  • Hostname, ein Name, der zur Identifizierung eines Computers in DNS verwendet wird (z. B. "www.example.com" oder "en.wikipedia.org")

Es gibt keine Eins-zu-Eins-Beziehung zwischen diesen Dingen. Ein Server kann mehrere IP-Adressen haben. Mehrere Hostnamen können auf eine IP-Adresse verweisen. Ein Hostname kann auf mehrere IP-Adressen verweisen. Mehrere Websites können unter demselben Hostnamen sein. Eine Website kann auf mehrere Hostnamen verteilt sein.

Wenn nicht, woher weiß der Aufruf der IP-Adresse des Servers, welche Website ich haben möchte, wenn sich viele auf demselben Server befinden?

Früher (HTTP 1.0 und früher) musste jeder Hostname, mit dem der Server anders umgehen wollte, eine eigene IP-Adresse haben. Das war ziemlich verschwenderisch.

HTTP 1.1 fügte den Host"Header" als obligatorisches Feld in die HTTP-Anfrage ein (IIRC, das einige Anbieter zuvor als Erweiterung unterstützt hatten). Dadurch wurde dem Server mitgeteilt, welcher Hostname angefordert wurde, und er durfte daher unterschiedliche Inhalte für unterschiedliche Hostnamen auf demselben Server bereitstellen IP-Adresse: Die Unterstützung von HTTP 1.1 in Clients ist jetzt allgegenwärtig.

Leider hat SSL (später TLS) eine Falte hinzugefügt. Das Einrichten einer SSL / TLS-Sitzung erfordert, dass der Server dem Client ein Zertifikat vorlegt, das den angeforderten Hostnamen abdeckt, die HTTP-Anforderung jedoch erst nach dem Einrichten der SSL / TLS-Sitzung eingeht.

Es ist möglich, dass ein Zertifikat mehrere Hostnamen über das SubjectAltNameFeld oder die Verwendung von Platzhaltern im CommonNameFeld abdeckt . Dies ist jedoch mit administrativen Herausforderungen verbunden, insbesondere wenn sich die beteiligten Hostnamen unter Domänen mit unterschiedlichen Eigentümern befinden.

Aus diesem Grund führte TLS die Erweiterung "Server Name Indication" (SNI) ein. Mit dieser Erweiterung sendet der Client den angeforderten Hostnamen während des TLS-Handshake-Vorgangs an den Server. Der Server kann dann das entsprechende Zertifikat vorlegen. Obwohl aktuelle Versionen aller wichtigen SSL / TLS-Implementierungen SNI unterstützen, hat es leider lange gedauert, bis ältere Versionen nicht mehr verwendet wurden.

Plugwash
quelle
Sie haben vergessen zu erwähnen, dass TCP viele Ports überwachen kann, auf denen jeweils unterschiedliche Server ausgeführt werden ...
Toby Speight
Ja, aber Sie haben keine Portnummern in DNS, und Sie können nicht erwarten, dass joe.p.user zu unserer fabelhaften Site wechselt: 81 Außerdem blockieren einige Firewalls den ausgehenden Zugriff auf nicht standardmäßige Portnummern.
Lenne
3

Die Antwort ist etwas komplizierter als einige der Antworten es sich vorgestellt haben. Wenn Sie eine DNS-Suche durchführen, MÜSSEN Sie eine IP-Adresse erhalten ( AAufzeichnung für IPv4, AAAAfür IPv6). Sie müssen in der Lage sein, einen Socket über TCP / IP zu öffnen, um zu kommunizieren, oder das Ganze schlägt fehl. Diese Adresse kann einen Server oder einen Lastenausgleich darstellen. Es könnte sogar einen Proxy darstellen. Befindet sich der Host beispielsweise hinter CloudFlare, handelt es sich bei der erhaltenen Adresse um einen CloudFlare-Server. Der reale Server ist woanders. Auf diese Weise kann der Host Probleme wie Denial-of-Service-Angriffe vermeiden.

Virtuelles Hosting ist das, wonach Sie fragen (einige der anderen Fragen haben dies angesprochen, aber nicht im Detail). Virtuelles Hosting nimmt die Webanforderung entgegen und ermittelt anhand des Hostnamens (dh domain.com), welche Website bereitgestellt werden soll. Auf dem Apache HTTP-Webserver hätten Sie also eine solche Konfiguration

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias domain.com

    DocumentRoot /var/www/domain.com
</virtualHost>

Dies ist zum Beispiel vereinfacht. Wir fordern Apache daher auf, Port 80 einer IP-Adresse abzuhören (in modernen virtuellen Maschinen, auf denen die IP-Adresse Ihrer Maschine gehostet wird, kann sich diese von der Live-IP-Adresse unterscheiden). Wir sagen dann, dass dies die domain.comWebsite ist und in welchem ​​Verzeichnis sich diese Website befindet. Wir können diesen Block dann immer wieder wiederholen, um Apache anzuweisen, mit verschiedenen Websites umzugehen. Jeder Webserver unterstützt diesen Systemtyp.

Eine andere Möglichkeit, dies zu handhaben, besteht darin, den Webserver anzuweisen, den gesamten Webdatenverkehr an ein einziges Programmierskript (z. B. PHP, ASP.NET usw.) weiterzuleiten, und dann mit diesem einzigen Skript zu bestimmen, welche Website und Seite angezeigt werden soll.

Machavity
quelle
1

Mithilfe von DNS können Sie einer einzelnen IP-Adresse beliebig viele Namen zuweisen (in Ihrer Hosts-Datei können Sie beispielsweise jeden Namen einfach durch Leerzeichen trennen). Mit einem DNS-Server können Sie auch einem Namen mehrere IP-Adressen zuweisen . Es ist nicht auf eine Eins-zu-Eins-Beziehung beschränkt.

Ein Web - Server weiß , welche Seite durch dienen die Prüfung der angeforderten URL. Es wird geprüft, welche Domain angefordert wurde, welcher Port angefordert wurde und welches Protokoll verwendet wurde. Dies hat nichts mit DNS zu tun und wird vom HTTP-Protokoll behandelt.

krowe
quelle
0

Der Webserver hat das Konzept des Host-Containers ( hier ist zum Beispiel die Dokumentation für Tomcat). Für dieselbe Box / IP-Adresse können mehrere Host-Container konfiguriert werden, die mehrere Domänen bedienen. Container verfügen über unabhängige Arbeitsverzeichnisse, Authentifizierungsbereiche, Protokollverzeichnisse und dergleichen.

Der Server findet den relevanten Container für den neuen Anforderungskauf. Der Name der Domäne ist Teil dieser HTTP-Anforderung.

Völlig verschiedene Webserver-Instanzen können dieselbe IP-Adresse verwenden, wenn sie an verschiedenen Ports ausgeführt werden. Dies wird hauptsächlich in verschiedenen Entwicklungs- und Testumgebungen verwendet, in denen Domänennamen möglicherweise nicht verfügbar sind, da der Produktionsserver nicht auf einem beliebigen Port ausgeführt werden kann.

Selbst wenn die streng eindeutige IP-Adresse für eine Website erforderlich ist, verfügt eine Server-Box häufig über mehrere Netzwerkadapter und ist daher für die Verwendung mehrerer IP-Adressen konfiguriert.

h22
quelle
0

Die IP-Adresse Ihres Servers kann gleichzeitig viele verschiedene Domänennamen enthalten.

Wenn Sie auf die Website zugreifen, sendet Ihr Browser die HTTP-Anfrage mit dem darin enthaltenen Domainnamen, und der Server kann feststellen, welche Website-Daten er Ihnen damals senden soll.

Es heißt die virtuellen Hosts, so einfach ist das :)

Schauen Sie hier für weitere Informationen über DNS und virtuelle Hosts.

Tim Connor
quelle