Les serveurs possèdent-ils un seul site Web?

80

D'après ce que je comprends du lien DNS, le nom de domaine avec l'adresse IP du serveur sur lequel le site Web est stocké, cela signifie-t-il que chaque serveur ne peut contenir qu'un seul site Web? Si ce n'est pas le cas, comment appeler l'adresse IP du serveur sait-il quel site Web je veux s'il y en a beaucoup sur le même serveur?

utilisateur3407319
la source
13
Wikipedia a une bonne introduction à l' hébergement Web partagé . Si vous entrez http: // <IP_ADDR> / dans votre navigateur, la requête HTTP n'aura pas de domaine dans l'en- Host:tête. En cas d'hébergement partagé, le serveur Web peut être configuré par le fournisseur pour le gérer de différentes manières (par exemple, avoir une valeur par défaut, rediriger le fournisseur, etc.).
Jedi
J'ai cliqué sur des liens qui rompent avec des messages tels que "ce serveur n'a jamais / n'héberge actuellement pas le site Web que vous recherchez".
Jesvin Jose
1
Si vous recherchez un moyen d'exécuter plusieurs applications sur un seul serveur, supposez que vous avez deux applications, MyApp et YourApp, sur les ports 8001 et 8002 respectivement. Vous pouvez avoir deux équilibreurs de charge ou serveurs mandataires d'application sur: myapp.com et yourapp.com. Demandez-leur de recevoir des demandes sur les ports par défaut (80/443) et de les transmettre au (x) serveur (s) actuel (s) aux ports 8001 et 8002 respectivement.
Rohithpr
6
Excellente question. Auparavant, chaque site Web avait besoin de sa propre adresse IP (un serveur peut avoir plusieurs adresses IP). L'en-tête Host dans HTTP / 1.1 a été introduit pour résoudre le problème exact que vous décrivez. Voir "Conservation des adresses Internet" dans www8.org/w8-papers/5c-protocols/key/key.html
AE
6
Si http 1.1 n'avait pas l'en-tête host, ipv6 serait déjà implémenté ;-) :-(
Lenne

Réponses:

149

Fondamentalement: le navigateur inclut le nom de domaine dans la requête HTTP afin que le serveur Web connaisse le domaine demandé et puisse répondre en conséquence.


Requêtes HTTP

Voici comment se passe votre requête HTTP typique:

  1. L'utilisateur fournit une URL, sous la forme http://host:port/path.

  2. Le navigateur extrait la partie hôte (domaine) de l'URL et la traduit si nécessaire en adresse IP, dans le cadre d'un processus appelé résolution de nom . Cette traduction peut se faire via DNS, mais cela n’est pas obligatoire (par exemple, le hostsfichier local sur les systèmes d’exploitation courants contourne DNS).

  3. Le navigateur ouvre une connexion TCP sur le port spécifié ou sur le port 80 par défaut pour cette adresse IP.

  4. Le navigateur envoie une requête HTTP. Pour HTTP / 1.1, cela ressemble à ceci:

    GET /path HTTP/1.1
    Host: example.com
    

    (L'en- Hosttête est standard et requis dans HTTP / 1.1. Il n'a pas été spécifié dans les spécifications HTTP / 1.0, mais certains serveurs le prennent en charge de toute façon.)

À partir de là, le serveur Web dispose de plusieurs informations qu'il peut utiliser pour décider de la réponse. Notez qu'il est possible qu'un seul serveur Web soit lié à plusieurs adresses IP.

  • L'adresse IP demandée, à partir du socket TCP
    • L'adresse IP du client est également disponible, mais elle est rarement utilisée - parfois pour le blocage / filtrage
  • Le port demandé, depuis le socket TCP
  • Le nom d'hôte demandé, tel que spécifié dans l'en- Hosttête par le navigateur dans la requête HTTP.
  • Le chemin demandé
  • Tout autre en-tête (cookies, etc.)

Comme vous semblez l'avoir remarqué, la configuration d'hébergement mutualisé la plus commune de nos jours met plusieurs sites Web sous une seule adresse IP: combinaison de port, ne laissant que la Hostdifférence entre les sites Web.

Ceci s'appelle un hôte virtuel basé sur un nom dans Apache-land, tandis que Nginx les appelle noms de serveur dans des blocs de serveur et qu'IIS préfère Virtual Server .


Qu'en est-il de HTTPS?

HTTPS est un peu différent. Tout est identique jusqu'à l'établissement de la connexion TCP, mais après cela, un tunnel TLS crypté doit être établi. L'objectif est de ne pas divulguer d'informations sur la demande.

Afin de vérifier que le serveur possède réellement ce domaine, le serveur doit envoyer un certificat signé par un tiers de confiance. Le navigateur comparera ensuite ce certificat avec le domaine demandé.

Cela pose un problème. Comment le serveur sait-il quel certificat d'hôte (site Web) envoyer, s'il doit le faire avant la réception de la demande HTTP?

Traditionnellement, cela était résolu en ayant une adresse IP dédiée (ou un port) pour chaque site Web nécessitant HTTPS. Évidemment, cela devient problématique lorsque nous commençons à manquer d'adresses IPv4.

Entrez SNI (Indication du nom du serveur). Le navigateur transmet maintenant le nom d'hôte lors des négociations TLS. Le serveur dispose donc de ces informations suffisamment tôt pour envoyer le certificat correct. Du côté du serveur, la configuration est très similaire à la configuration des hôtes virtuels HTTP.

L'inconvénient est que le nom d'hôte est maintenant passé en texte brut avant le cryptage et constitue essentiellement une fuite d'informations. Cela est généralement considéré comme un compromis acceptable, étant donné que le nom d’hôte est normalement exposé dans une requête DNS.


Et si vous demandez un site par adresse IP uniquement?

Ce que le serveur fait lorsqu'il ne sait pas quel hôte spécifique vous avez demandé dépend de la mise en œuvre et de la configuration du serveur. En règle générale, un site "par défaut", "catchall" ou "fallback" est spécifié et fournira des réponses à toutes les demandes ne spécifiant pas explicitement un hôte.

Ce site par défaut peut être son propre site indépendant (affichant souvent un message d'erreur) ou l'un des autres sites du serveur, en fonction des préférences de l'administrateur du serveur.

Bob
la source
1
En outre, un site peut être divisé sur plusieurs serveurs, comme c'est le cas avec les équilibreurs de charge, tels que ceux utilisés par Heroku et Amazon.
phyrfox
1
@phyrfox Oui, j'ai pensé à ajouter cela, mais c'est seulement lié de manière tangentielle à la question et je ne voulais pas donner la réponse trop longtemps. Pourrait encore finir par ajouter une section pour cela plus tard.
Bob
La légende dit que les sous-domaines désignent des ordinateurs spécifiques à l'intérieur d'un réseau. En théorie
Loupax
"Traditionnellement, cela était résolu en ayant une adresse IP dédiée (ou un port) pour chaque site Web nécessitant HTTPS. Évidemment, cela devient problématique lorsque nous commençons à manquer d'adresses IPv4." Donc, sans cette invitation, nous aurions tous déjà ipv6 .
Lenne
92

J'ai cette explication pour les non-techniciens.

Jack, Jill et Joe vivent dans un dortoir et ils n'ont pas de téléphone portable.

Dans le répertoire, ils sont tous répertoriés avec le même numéro. (Un enregistrement)

Vous composez le numéro et quelqu'un décroche le téléphone; vous dites "j'aimerais parler à Jill" et vous la mettez en ligne.

Au lieu d'un enregistrement A (numéro de téléphone / adresse IP) dans le répertoire, il peut simplement indiquer "Dormitory X", vous devez alors rechercher plus avant le numéro du Dormitory X. Il s'agit d'un enregistrement CNAME.

Si Jill n'est pas disponible, vous pourriez obtenir

  • 404 Jill n'est pas là
  • 410 Jill est morte.
  • 301 Jill est emménagée avec Peter
  • 302 Jill rend visite à Peter, appelle-le à la place

  • 400 Je ne peux pas vous comprendre.

  • 401 Qui es-tu? Quel est le mot de passe? ou Nous n'autorisons pas les appelants après 22h
  • 402 Paiement requis (Êtes-vous sûr que Jill est son vrai nom ;-))
  • 403 Non, ce n'est pas le bon mot de passe.
  • 418 Jill est une théière :-)
  • 429 Jill ne peut plus prendre d'appels.
  • 451 Vous violez votre ordonnance d'interdiction.

  • 500 Notre système téléphonique est tombé en panne.

Lenne
la source
Pour les curieux, le RFC derrière 418 est tools.ietf.org/html/rfc2324 et un article intéressant sitesdoneright.com/blog/2013/03/… :)
Wordzilla le
6

D'après ce que je comprends du lien DNS, le nom de domaine avec l'adresse IP du serveur sur lequel le site Web est stocké, cela signifie-t-il que chaque serveur ne peut contenir qu'un seul site Web?

Tout d'abord, vous devez comprendre qu'il existe un certain nombre de concepts distincts ici.

  • Site Web, groupe de pages Web formant un tout cohérent.
  • Adresse IP, adresse numérique (32 bits pour IPv4, 128 bits pour IPv6) utilisée par le protocole Internet comme source ou destination du trafic.
  • Serveur, une machine dont le travail consiste à répondre aux demandes des clients.
  • Nom d'hôte, un nom utilisé pour identifier une machine dans le DNS (par exemple, "www.example.com" ou "en.wikipedia.org")

Il n'y a pas de relation un-à-un entre ces choses. Un serveur peut avoir plusieurs adresses IP. plusieurs noms d'hôte peuvent pointer vers une seule adresse IP; un nom d'hôte peut pointer vers plusieurs adresses IP. Plusieurs sites Web peuvent être sous le même nom d'hôte. Un site Web peut être réparti sur plusieurs noms d'hôte.

Si ce n'est pas le cas, comment appeler l'adresse IP du serveur sait-il quel site Web je veux s'il y en a beaucoup sur le même serveur?

Auparavant (HTTP 1.0 et antérieur), chaque nom d'hôte que le serveur souhaitait gérer différemment devait avoir sa propre adresse IP. C'était plutôt inutile.

HTTP 1.1 ajoutait l'en- Hosttête "en tant que champ obligatoire dans la requête HTTP (IIRC, certains fournisseurs l'avaient précédemment prise en charge en tant qu'extension). Cela indiquait au serveur quel nom d'hôte avait été demandé et l'autorisait donc à servir un contenu différent pour différents noms d'hôte sur le même serveur. Adresse IP: la prise en charge de HTTP 1.1 par les clients est désormais omniprésente.

Malheureusement, SSL (plus tard TLS) a ajouté une ride. Pour établir une session SSL / TLS, le serveur doit présenter au client un certificat couvrant le nom d'hôte demandé, mais la demande HTTP n'arrive qu'après que la session SSL / TLS ait été établie.

Il est possible de faire en sorte qu'un seul certificat couvre plusieurs noms d'hôte via l'utilisation du SubjectAltNamechamp ou l'utilisation de caractères génériques dans le CommonNamechamp. Toutefois, cela pose des problèmes d’administration, en particulier si les noms d’hôte impliqués appartiennent à des domaines avec des propriétaires différents.

TLS a donc introduit l’extension "SNI" (Server Name Indication). Avec cette extension, le client envoie le nom d'hôte demandé au serveur au cours de la procédure de négociation TLS. Le serveur peut alors présenter le certificat approprié. Malheureusement, bien que les versions actuelles de toutes les principales implémentations SSL / TLS prennent en charge SNI, il a fallu beaucoup de temps pour que les anciennes versions tombent en panne.

plugwash
la source
Vous avez oublié de mentionner que TCP peut écouter sur de nombreux ports, exécutant différents serveurs sur ...
Toby Speight
Oui, mais vous n'avez pas de numéro de port dans DNS, et vous ne pouvez pas vous attendre à ce que joe.p.user aille à notre.fabulous.site:81 En outre, certains pare-feu bloquent l'accès sortant à des numéro de port non standard.
Lenne
3

La réponse est un peu plus compliquée que certaines des réponses ne le prétendent. Lorsque vous effectuez une recherche DNS, vous DEVEZ obtenir une adresse IP ( Aenregistrez pour IPv4, AAAApour IPv6). Vous devez être capable d'ouvrir un socket sur TCP / IP pour communiquer ou tout échoue. Cette adresse peut représenter un serveur ou un équilibreur de charge. Cela pourrait même représenter un proxy. Si l'hôte est derrière CloudFlare, par exemple, l'adresse que vous obtenez est celle d'un serveur CloudFlare. Le vrai serveur est ailleurs. Cela permet à l'hôte d'éviter des problèmes tels que les attaques par déni de service.

L'hébergement virtuel est ce que vous demandez (certaines des questions ont abordé ce sujet, mais pas en détail). L'hébergement virtuel prend la demande Web et examine le nom d'hôte (c'est-à-dire, domain.com) pour déterminer le site Web à desservir. Donc, dans le serveur Web HTTP Apache, vous auriez une configuration comme celle-ci.

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

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

Ceci est simplifié par exemple. Nous demandons donc à Apache d'écouter sur le port 80 de n'importe quelle adresse IP (sur une machine virtuelle moderne hébergeant l'adresse IP de votre machine, celle-ci peut être différente de son adresse IP réelle). Nous lui disons ensuite qu'il s'agit du domain.comsite Web et de l'annuaire sous lequel ce site vit. Nous pouvons ensuite répéter ce blocage encore et encore pour dire à Apache de gérer différents sites Web. Chaque serveur Web prend en charge ce type de système.

Une autre solution consiste à indiquer au serveur Web de diriger tout le trafic Web vers un seul script de programmation (PHP, ASP.NET, etc.), puis ce script déterminera le site Web et la page à afficher.

Machavity
la source
1

En utilisant DNS, vous pouvez attribuer autant de noms que vous le souhaitez à une adresse IP individuelle (dans votre fichier hosts, vous pouvez simplement séparer chaque nom par des espaces, par exemple). À l'aide d'un serveur DNS, vous pouvez également attribuer plusieurs adresses IP à un seul nom . Cela ne se limite pas à une relation un à un.

Un serveur Web sait quel site servir en examinant l'URL demandée. Il regarde quel domaine a été demandé, le port qui a été demandé et quel protocole a été utilisé. Cela n'a rien à voir avec DNS et est géré par le protocole HTTP.

Krowe
la source
0

Le serveur Web utilise le concept de conteneur hôte ( voici la documentation de Tomcat, par exemple). Plusieurs conteneurs hôtes peuvent être configurés pour la même boîte / adresse IP, desservant plusieurs domaines. Les conteneurs ont des répertoires de travail indépendants, des domaines d'authentification, des répertoires de journalisation, etc.

Le serveur trouve le conteneur approprié pour la nouvelle requête. Le nom du domaine fait partie de cette requête HTTP.

Des instances de serveur Web complètement différentes peuvent partager la même adresse IP si elles s'exécutent sur des ports différents. Ceci est principalement utilisé dans divers environnements de développement et de test où les noms de domaine peuvent ne pas être disponibles, car le serveur de production ne peut pas s'exécuter sur un port arbitraire.

Enfin, même si l'adresse IP strictement unique est requise pour un site Web, un serveur possède souvent plusieurs cartes réseau et est donc configuré pour utiliser plusieurs adresses IP.

h22
la source
0

L'adresse IP de votre serveur peut contenir plusieurs noms de domaine différents en même temps.

Lorsque vous accédez au site Web, votre navigateur envoie la requête HTTP contenant le nom de domaine. Le serveur peut alors identifier les données de site Web qu’il doit vous renvoyer.

C'est ce qu'on appelle les hôtes virtuels, si simple que ça :)

Jetez un coup d'oeil ici pour plus d'informations sur le DNS et les hôtes virtuels.

Tim Connor
la source