¿Los servidores tienen un solo sitio web?

80

Según entiendo el enlace DNS, el nombre de dominio con la dirección IP del servidor en el que está almacenado el sitio web, ¿eso significa que cada servidor solo puede contener un sitio web? Si no lo hacen, ¿cómo sabe llamar a la dirección IP del servidor qué sitio web quiero si hay muchos en el mismo servidor?

usuario3407319
fuente
13
Wikipedia tiene una buena introducción al alojamiento web compartido . Si ingresa http: // <IP_ADDR> / en su navegador, la solicitud HTTP no tendrá un dominio dentro del Host:encabezado. En el caso del alojamiento compartido, el proveedor puede configurar el servidor web para que lo gestione de diferentes maneras (por ejemplo, tener un valor predeterminado, redirigir al proveedor, etc.).
Jedi
He hecho clic en enlaces que rompen con mensajes como "este servidor nunca / actualmente no aloja el sitio web que está buscando".
Jesvin Jose
1
En caso de que esté buscando una manera de ejecutar múltiples aplicaciones en un solo servidor, supongamos que tiene dos aplicaciones MyApp y YourApp en los puertos 8001 y 8002 respectivamente. Puede tener dos equilibradores de carga o servidores proxy de aplicación en: myapp.com y yourapp.com. Pídales que reciban solicitudes en los puertos predeterminados (80/443) y los reenvíen a los servidores reales en los puertos 8001 y 8002 respectivamente.
rohithpr
66
Gran pregunta Cada sitio web solía necesitar su propia dirección IP (un servidor puede tener más de una dirección IP). El encabezado Host en HTTP / 1.1 se introdujo para solucionar el problema exacto que usted describe. Consulte "Conservación de direcciones de Internet" en www8.org/w8-papers/5c-protocols/key/key.html
AE
66
Si http 1.1 no tuviera el encabezado de host, ipv6 se implementaría ahora ;-) :-(
Lenne

Respuestas:

149

Básicamente: el navegador incluye el nombre de dominio en la solicitud HTTP, por lo que el servidor web sabe qué dominio se solicitó y puede responder en consecuencia.


Solicitudes HTTP

Así es como ocurre su solicitud HTTP típica:

  1. El usuario proporciona una URL, en el formulario http://host:port/path.

  2. El navegador extrae la parte del host (dominio) de la URL y la traduce a una dirección IP si es necesario, en un proceso conocido como resolución de nombre . Esta traducción puede ocurrir a través de DNS, pero no es necesario (por ejemplo, el hostsarchivo local en sistemas operativos comunes omite DNS).

  3. El navegador abre una conexión TCP al puerto especificado, o por defecto al puerto 80, en esa dirección IP.

  4. El navegador envía una solicitud HTTP. Para HTTP / 1.1, se ve así:

    GET /path HTTP/1.1
    Host: example.com
    

    (El Hostencabezado es estándar y se requiere en HTTP / 1.1. No se especificó en la especificación HTTP / 1.0, pero algunos servidores lo admiten de todos modos).

A partir de aquí, el servidor web tiene varios datos que puede usar para decidir cuál debería ser la respuesta. Tenga en cuenta que es posible que un único servidor web esté vinculado a varias direcciones IP.

  • La dirección IP solicitada, desde el socket TCP
    • La dirección IP del cliente también está disponible, pero rara vez se usa, a veces para bloquear / filtrar
  • El puerto solicitado, desde el socket TCP
  • El nombre de host solicitado, según lo especificado en el Hostencabezado por el navegador en la solicitud HTTP.
  • La ruta solicitada
  • Cualquier otro encabezado (cookies, etc.)

Como parece haber notado, la configuración de alojamiento compartido más común en estos días coloca múltiples sitios web en una sola dirección IP: combinación de puertos, dejando solo Hostdiferenciar entre sitios web.

Esto se conoce como un host virtual basado en nombres en Apache-land, mientras que Nginx los llama nombres de servidores en bloques de servidores e IIS prefiere el servidor virtual .


¿Qué pasa con HTTPS?

HTTPS es un poco diferente. Todo es idéntico hasta el establecimiento de la conexión TCP, pero después de eso se debe establecer un túnel TLS encriptado. El objetivo es no filtrar ninguna información sobre la solicitud.

Para verificar que el servidor realmente posee este dominio, el servidor debe enviar un certificado firmado por un tercero de confianza. El navegador comparará este certificado con el dominio que solicitó.

Esto presenta un problema. ¿Cómo sabe el servidor qué certificado de host (sitio web) enviar, si necesita hacerlo antes de recibir la solicitud HTTP?

Tradicionalmente, esto se resolvió teniendo una dirección IP (o puerto) dedicada para cada sitio web que requiera HTTPS. Obviamente, esto se vuelve problemático cuando comenzamos a quedarnos sin direcciones IPv4.

Ingrese SNI (Indicación del nombre del servidor). El navegador ahora pasa el nombre de host durante las negociaciones de TLS, por lo que el servidor tiene esta información lo suficientemente pronto como para enviar el certificado correcto. En el lado del servidor, la configuración es muy similar a cómo se configuran los hosts virtuales HTTP.

La desventaja es que el nombre de host ahora se pasa como texto sin formato antes del cifrado, y es esencialmente información filtrada. Esto generalmente se considera una compensación aceptable, considerando que el nombre de host normalmente está expuesto en una consulta DNS de todos modos.


¿Qué sucede si solicita un sitio solo por dirección IP?

Lo que hace el servidor cuando no sabe qué host específico solicitó depende de la implementación y configuración del servidor. Normalmente, se especifica un sitio "predeterminado", "general" o "alternativo" que proporcionará respuestas a todas las solicitudes que no especifiquen explícitamente un host.

Este sitio predeterminado puede ser su propio sitio independiente (a menudo muestra un mensaje de error), o podría ser cualquiera de los otros sitios en el servidor, dependiendo de la preferencia del administrador del servidor.

Mover
fuente
1
Además, un sitio puede dividirse en muchos servidores, como es el caso de los equilibradores de carga, como los usos de Heroku y Amazon.
phyrfox
1
@phyrfox Sí, pensé en agregar eso, pero solo está tangencialmente relacionado con la pregunta y no quise responder demasiado. Todavía podría terminar agregando una sección para ello más tarde.
Bob
La leyenda dice que los subdominios apuntan a computadoras tan específicas dentro de una red. En teoría
Loupax
"Tradicionalmente, esto se resolvió teniendo una dirección IP (o puerto) dedicada para cada sitio web que requiere HTTPS. Obviamente, esto se vuelve problemático a medida que comenzamos a quedarnos sin direcciones IPv4". Entonces, sin esa invención, todos tendríamos ipv6 ahora. .
Lenne
92

Tengo esta explicación para personas no tecnológicas.

Jack, Jill y Joe viven en un dormitorio y no tienen teléfonos celulares.

En la agenda telefónica, todos están listados con el mismo número. (Un expediente)

Usted marca el número y alguien levanta el teléfono; dices "Me gustaría hablar con Jill" y la pones en línea.

En lugar de un registro A (número de teléfono / dirección IP) en la agenda, puede decir "Dormitory X", entonces debe buscar más el número de Dormitory X. Este es un registro CNAME.

Si Jill no está disponible, puede obtener

  • 404 Jill no está aquí
  • 410 Jill está muerta.
  • 301 Jill se muda con Peter
  • 302 Jill está visitando a Peter, llámalo

  • 400 No te entiendo.

  • 401 ¿Quién eres? ¿Cual es la contraseña? o No permitimos llamadas masculinas después de las 10 p.m.
  • 402 Pago requerido (¿Estás seguro de que Jill es su nombre real ;-))
  • 403 No, esa no es la contraseña correcta.
  • 418 Jill es una tetera :-)
  • 429 Jill no puede tomar más llamadas.
  • 451 Usted está violando su orden de restricción.

  • 500 Nuestro sistema telefónico se ha averiado.

Lenne
fuente
Para los curiosos, el RFC detrás de 418 es tools.ietf.org/html/rfc2324 y un artículo interesante sitesdoneright.com/blog/2013/03/… :)
Wordzilla
6

Según entiendo el enlace DNS, el nombre de dominio con la dirección IP del servidor en el que está almacenado el sitio web, ¿eso significa que cada servidor solo puede contener un sitio web?

Primero, debe comprender que hay una serie de conceptos distintos aquí.

  • Sitio web, un grupo de páginas web que forman un todo coherente.
  • Dirección IP, una dirección numérica (32 bits para IPv4, 128 bits para IPv6) utilizada por el protocolo de Internet como origen o destino del tráfico.
  • Servidor, una máquina cuyo trabajo es atender las solicitudes de los clientes.
  • Nombre de host, un nombre utilizado para identificar una máquina en DNS (por ejemplo, "www.example.com" o "en.wikipedia.org")

No hay una relación uno a uno entre ninguna de estas cosas. Un servidor puede tener múltiples direcciones IP; múltiples nombres de host pueden apuntar a una dirección IP; un nombre de host puede apuntar a múltiples direcciones IP. Varios sitios web pueden estar bajo el mismo nombre de host. Un sitio web puede distribuirse entre múltiples nombres de host.

Si no lo hacen, ¿cómo sabe llamar a la dirección IP del servidor qué sitio web quiero si hay muchos en el mismo servidor?

En los viejos tiempos (HTTP 1.0 y anteriores) cada nombre de host que el servidor quería manejar de manera diferente tenía que tener su propia dirección IP. Esto fue bastante derrochador.

HTTP 1.1 agregó el Host"encabezado como un campo obligatorio en la solicitud HTTP (IIRC algunos proveedores habían admitido esto anteriormente como una extensión). Esto le dijo al servidor qué nombre de host se había solicitado y, por lo tanto, le permitió servir contenido diferente para diferentes nombres de host en el mismo Dirección IP. El soporte para HTTP 1.1 en clientes ahora es omnipresente.

Desafortunadamente, SSL (luego TLS) agregó una arruga. El establecimiento de una sesión SSL / TLS requiere que el servidor presente un certificado al cliente que cubra el nombre de host solicitado, pero la solicitud HTTP no llega hasta que se establece la sesión SSL / TLS.

Es posible que un certificado cubra múltiples nombres de host mediante el uso del SubjectAltNamecampo o el uso de comodines en el CommonNamecampo. Sin embargo, esto plantea desafíos administrativos, especialmente si los nombres de host involucrados están bajo dominios con propiedad diferente.

Entonces TLS introdujo la extensión "indicación de nombre de servidor" (SNI). Con esta extensión, el cliente envía el nombre de host solicitado al servidor durante el procedimiento de enlace TLS. El servidor puede presentar el certificado apropiado. Desafortunadamente, si bien las versiones actuales de todas las principales implementaciones SSL / TLS son compatibles con SNI, las versiones anteriores han tardado mucho en dejar de usarse.

lavado
fuente
Olvidó mencionar que TCP puede escuchar en muchos puertos, ejecutando diferentes servidores en cada ...
Toby Speight
Sí, pero no tiene números de puerto en dns, y no puede esperar que joe.p.user vaya a nuestro.fabulous.sit:81 Además, algunos firewalls bloquean el acceso saliente a números de puerto no estándar.
Lenne
3

La respuesta es un poco más complicada de lo que algunas de las respuestas han hecho. Cuando realiza una búsqueda DNS, DEBE obtener una dirección IP ( Aregistro para IPv4, AAAApara IPv6). Debe poder abrir un socket a través de TCP / IP para comunicarse o todo falla. Esa dirección puede representar un servidor o puede representar un equilibrador de carga. Incluso podría representar un proxy. Si el host está detrás de CloudFlare, por ejemplo, la dirección que obtiene es de un servidor CloudFlare. El servidor real está en otro lugar. Esto permite que el host evite problemas como los ataques de denegación de servicio.

El alojamiento virtual es lo que está preguntando (algunas de las otras preguntas se tocaron sobre esto, pero no con ningún detalle). El alojamiento virtual toma la solicitud web y mira el nombre del host (es decir, dominio.com) para determinar qué sitio web debe servir. Entonces, en el servidor web Apache HTTP , tendría una configuración como esta

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

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

Esto se simplifica por ejemplo. Por lo tanto, le estamos diciendo a Apache que escuche en el puerto 80 cualquier IP (en la máquina virtual moderna que aloja la IP de su máquina puede ser diferente de su IP en vivo). Luego le decimos que este es el domain.comsitio web y bajo qué directorio vive ese sitio web. Luego podemos repetir este bloque una y otra vez para decirle a Apache que maneje diferentes sitios web. Todos los servidores web admiten este tipo de sistema.

Otra forma de manejar esto sería decirle al servidor web que dirija todo el tráfico web a un solo script de programación (es decir, PHP, ASP.NET, etc.) y luego ese único script determinará qué sitio web y página mostrar.

Machavity
fuente
1

Con DNS, puede asignar tantos nombres a una dirección IP individual como desee (en su archivo de hosts , simplemente puede separar cada nombre con espacios, por ejemplo). Usando un servidor DNS también puede asignar múltiples direcciones IP a un solo nombre . No se limita a una relación uno a uno.

Un servidor web sabe qué sitio servir al examinar la URL solicitada. Analiza qué dominio se solicitó, el puerto que se solicitó y qué protocolo se utilizó. Esto no tiene nada que ver con DNS y es manejado por el protocolo HTTP.

krowe
fuente
0

El servidor web tiene el concepto de contenedor host ( aquí está la documentación de Tomcat, por ejemplo). Se pueden configurar varios contenedores de host para el mismo cuadro / dirección IP, atendiendo múltiples dominios. Los contenedores tienen directorios de trabajo independientes, reinos de autenticación, directorios de registro y cosas similares.

El servidor encuentra el contenedor relevante para la nueva solicitud. El nombre del dominio es parte de esta solicitud HTTP.

Instancias de servidor web completamente diferentes pueden compartir la misma dirección IP si se ejecutan en diferentes puertos. Esto se usa principalmente en varios entornos de desarrollo y prueba donde los nombres de dominio pueden no estar disponibles, ya que el servidor de producción no puede ejecutarse en un puerto arbitrario.

Finalmente, incluso si se requiere una dirección IP estrictamente única para un sitio web, una caja de servidor a menudo tiene múltiples adaptadores de red, por lo que está configurada para usar múltiples direcciones IP.

h22
fuente
0

La dirección IP de su servidor puede contener muchos nombres de dominio diferentes al mismo tiempo.

Cuando accede al sitio web, su navegador envía la solicitud HTTP con el nombre de dominio, y el servidor puede encontrar qué datos del sitio web debe enviarle en ese momento.

Se llama hosts virtuales, tan simple como eso :)

Eche un vistazo aquí para obtener más información sobre DNS y hosts virtuales.

Tim Connor
fuente