Question Les serveurs ne contiennent-ils qu'un seul site Web?


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 l'appel de l'adresse IP du serveur permet-il de savoir quel site Web je souhaite s'il y en a beaucoup sur le même serveur?


79
2018-06-18 03:02


origine


Wikipedia a une bonne introduction à Hébergement Web partagé. Si vous entrez http: // <IP_ADDR> / dans votre navigateur, la requête HTTP n’aura pas de domaine dans le Host: entête. En cas d'hébergement partagé, le serveur Web peut être configuré de différentes manières (par exemple, par défaut, rediriger vers le fournisseur, etc.). - Jedi
J'ai cliqué sur des liens qui rompent avec des messages comme "ce serveur n'a jamais / actuellement hébergé le site Web que vous recherchez". - aitchnyu
Au cas où vous chercheriez à exécuter plusieurs applications sur un seul serveur, dites que vous avez deux applications MyApp et YourApp sur les ports 8001 et 8002 respectivement. Vous pouvez avoir deux équilibreurs de charge ou proxys d'application sur: myapp.com et yourapp.com. Demandez-leur de recevoir des requêtes sur les ports par défaut (80/443) et de les transférer au (x) serveur (s) réel (s) aux ports 8001 et 8002 respectivement. - rohithpr
Bonne question Chaque site Web avait besoin de sa propre adresse IP (un serveur peut avoir plusieurs adresses IP). L'en-tête de l'hôte dans HTTP / 1.1 a été introduit pour contourner le problème exact que vous décrivez. Voir "Conservation des adresses Internet" dans www8.org/w8-papers/5c-protocols/key/key.html - A E
Si http 1.1 n'avait pas d'en-tête d'hôte, ipv6 serait implémenté maintenant ;-) :-( - Lenne


Réponses:


Fondamentalement: le navigateur inclut le nom de domaine dans la requête HTTP, donc le serveur Web sait quel domaine a été demandé et peut répondre en conséquence.


Requêtes HTTP

Voici comment se déroule 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 en adresse IP si nécessaire, dans un processus appelé résolution de nom. Cette traduction peut avoir lieu via DNS, mais cela n’est pas nécessaire (par exemple, le local hosts fichier sur les systèmes d'exploitation communs contourne le DNS).

  3. Le navigateur ouvre une connexion TCP sur le port spécifié ou utilise par défaut le port 80 sur 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
    

    (Le Host l'en-tête est standard et requis dans HTTP / 1.1. Il n'était pas spécifié dans la spécification HTTP / 1.0, mais certains serveurs le prennent en charge de toute façon.)

A 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 bloquer / filtrer
  • Le port demandé, à partir du socket TCP
  • Le nom d'hôte demandé, comme spécifié dans le Host en-tê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 partagée la plus courante de nos jours met plusieurs sites Web sur une seule adresse IP: la combinaison de ports, ne laissant que Host différencier les sites Web.

Ceci est connu comme un Hôte virtuel basé sur le nom dans Apache-land, tandis que Nginx les appelle Noms de serveur dans les blocs de serveur et IIS préfère Serveur virtuel.


Qu'en est-il du HTTPS?

HTTPS est un peu différent. Tout est identique jusqu'à l'établissement de la connexion TCP, mais après cela, un tunnel TLS chiffré 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 alors 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 requête HTTP?

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

Entrer SNI (Indication du nom du serveur). Le navigateur transmet maintenant le nom d'hôte pendant les négociations TLS, de sorte que le serveur dispose de ces informations suffisamment tôt pour envoyer le certificat correct. Côté 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 transmis en tant que texte brut avant le chiffrement, et constitue essentiellement une fuite d'informations. Ceci 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 de toute façon.


Que faire si vous demandez un site uniquement par adresse IP?

Ce que le serveur fait lorsqu'il ne sait pas quel hôte spécifique vous avez demandé dépend de l'implémentation et de la configuration du serveur. En règle générale, il existe un site "default", "catchall" ou "fallback" spécifié pour fournir des réponses à toutes les demandes qui ne spécifient 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, selon la préférence de l'administrateur du serveur.


149
2018-06-18 03:11



De plus, un site peut être divisé sur plusieurs serveurs, comme c'est le cas avec les équilibreurs de charge, comme Heroku et Amazon. - phyrfox
@phyrfox Oui, j'ai pensé à ajouter cela, mais cela n'est que tangentiellement lié à la question et je n'ai pas voulu faire la réponse trop longtemps. Pourrait encore finir par ajouter une section pour cela plus tard. - Bob
La légende veut que les sous-domaines indiquent des ordinateurs si spécifiques à l'intérieur d'un réseau. En théorie - Loupax
"Traditionnellement, cela avait été 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 car nous commençons à manquer d'adresses IPv4." . - Lenne


J'ai cette explication pour les personnes non technologiques.

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

Dans l'annuaire, 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 "je voudrais parler à Jill", et vous la mettez en ligne.

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

Si Jill n'est pas disponible, vous pourriez avoir

  • 404 Jill n'est pas là
  • 410 Jill est morte.
  • 301 Jill emménage avec Peter
  • 302 Jill rend visite à Peter, appelle-le plutôt

  • 400 je ne peux pas vous comprendre.

  • 401 Qui êtes-vous? Quel est le mot de passe? ou Nous ne permettons pas aux appelants masculins 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 restrictive.

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


92
2018-06-18 17:15



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


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 plusieurs concepts distincts.

  • Site Web, un groupe de pages Web qui forment 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 à servir les demandes des clients.
  • Nom d'hôte, un nom utilisé pour identifier une machine dans DNS (par exemple, "www.example.com" ou "en.wikipedia.org")

Il n'y a pas de relation univoque entre ces éléments. Un serveur peut avoir plusieurs adresses IP. plusieurs noms d'hôte peuvent pointer sur une adresse IP; un nom d'hôte peut pointer sur 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ôtes.

Si ce n'est pas le cas, comment l'appel de l'adresse IP du serveur permet-il de savoir quel site Web je souhaite s'il y en a beaucoup sur le même serveur?

Autrefois (HTTP 1.0 et avant), chaque nom d'hôte que le serveur voulait gérer différemment devait avoir sa propre adresse IP. C'était plutôt du gaspillage.

HTTP 1.1 a ajouté le Host"En-tête en tant que champ obligatoire dans la requête HTTP (IIRC, certains fournisseurs l’avaient précédemment pris en charge en tant qu’extension). Cela indiquait au serveur quel nom d’hôte avait été demandé et lui permettait de diffuser différents contenus pour différents noms pour HTTP 1.1 chez les clients est maintenant omniprésent.

Malheureusement, SSL (plus tard TLS) a ajouté une ride. L'établissement d'une session SSL / TLS nécessite que le serveur présente un certificat au client qui couvre le nom d'hôte demandé, mais la requête HTTP n'arrive qu'une fois la session SSL / TLS établie.

Il est possible d’avoir un certificat couvrant plusieurs noms d’hôte grâce à SubjectAltName champ ou l'utilisation de caractères génériques dans le CommonName champ. Cependant, cela pose des problèmes administratifs, en particulier si les noms d’hôte impliqués sont dans 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 pendant la procédure de prise de contact TLS. Le serveur peut alors présenter le certificat approprié. Malheureusement, alors 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 ne soient plus utilisées.


6
2018-06-19 05:23



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


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

Hébergement virtuel est ce dont vous parlez (certaines des autres questions ont trait à cela, mais pas en détail). L'hébergement virtuel prend en charge la requête Web et examine le nom d'hôte (par exemple, domain.com) pour déterminer le site Web à servir. Donc dans le Serveur Web Apache HTTP 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 disons donc à Apache d’écouter sur le port 80 de toute adresse IP (sur une machine virtuelle moderne hébergeant l’IP de votre machine peut être différente de son IP en direct). On dit alors que c'est la domain.com site Web et dans quel répertoire ce site Web vit. Nous pouvons alors répéter ce bloc encore et encore pour demander à Apache de gérer différents sites Web. Chaque serveur Web prend en charge ce type de système.

Une autre façon de gérer cela consisterait à demander au serveur Web de diriger tout le trafic Web vers un seul script de programmation (à savoir PHP, ASP.NET, etc.), puis ce seul script déterminera le site Web et la page à afficher.


3
2018-06-20 20:54





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

Un serveur web sait par quel site servir examiner L'URL demandée. Il examine quel domaine a été demandé, le port qui a été demandé et quel protocole a été utilisé. Cela n'a rien à voir avec le DNS et est géré par le protocole HTTP.


1
2018-06-18 03:15





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

Le serveur trouve le conteneur correspondant à la nouvelle demande pour acheter le nom du domaine qui 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 sont exécutées 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 des ports arbitraires.

Enfin, même si une adresse IP strictement unique est requise pour un site Web, une boîte de serveur comporte souvent plusieurs cartes réseau. Elle est donc configurée pour utiliser plusieurs adresses IP.


0
2018-06-20 07:49





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 avec le nom de domaine, et le serveur peut trouver les données du site Web qu'il doit vous envoyer à ce moment-là.

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

Regarde ici pour plus d'informations sur le DNS et les hôtes virtuels.


0
2017-07-23 06:59