На серверах хранится только один веб-сайт?

На серверах хранится только один веб-сайт?

Насколько я понимаю, DNS связывает доменное имя с IP-адресом сервера, на котором хранится веб-сайт, означает ли это, что на каждом сервере может храниться только один веб-сайт? Если нет, то как вызов IP-адреса сервера узнает, какой веб-сайт мне нужен, если на одном сервере их много?

решение1

По сути: браузер включает доменное имя в HTTP-запрос, поэтому веб-сервер знает, какой домен был запрошен, и может ответить соответствующим образом.


HTTP-запросы

Вот как происходит типичный HTTP-запрос:

  1. Пользователь предоставляет URL-адрес в формате http://host:port/path.

  2. Браузер извлекает часть URL-адреса, обозначающую хост (домен), и при необходимости преобразует ее в IP-адрес. Этот процесс называетсяразрешение имени. Этот перевод может осуществляться через DNS, но это не обязательно (например, локальный hostsфайл в распространенных ОС обходит DNS).

  3. Браузер открывает TCP-соединение с указанным портом или по умолчанию использует порт 80 на этом IP-адресе.

  4. Браузер отправляет HTTP-запрос. Для HTTP/1.1 это выглядит так:

    GET /path HTTP/1.1
    Host: example.com
    

    ( HostЗаголовок является стандартным и обязательным в HTTP/1.1. Он не был указан в спецификации HTTP/1.0, но некоторые серверы все равно его поддерживают.)

Отсюда веб-сервер имеет несколько фрагментов информации, которые он может использовать, чтобы решить, каким должен быть ответ. Обратите внимание, что один веб-сервер может быть привязан к нескольким IP-адресам.

  • Запрошенный IP-адрес из сокета TCP
    • IP-адрес клиента также доступен, но он используется редко — иногда для блокировки/фильтрации.
  • Запрошенный порт из сокета TCP
  • Запрошенное имя хоста, указанное Hostбраузером в заголовке HTTP-запроса.
  • Запрошенный путь
  • Любые другие заголовки (cookie и т. д.)

Как вы, по-видимому, заметили, в настоящее время наиболее распространенная схема общего хостинга размещает несколько веб-сайтов на одной комбинации IP-адреса и порта, оставляя только Hostвозможность различать веб-сайты.

Это известно какВиртуальный хост на основе именив Apache-land, в то время как Nginx называет ихИмена серверов в блоках серверови IIS предпочитаетВиртуальный сервер.


А как насчет HTTPS?

HTTPS немного отличается. Все идентично до установления TCP-соединения, но после этого должен быть установлен зашифрованный TLS-туннель. Цель — не допустить утечки информации о запросе.

Чтобы проверить, что сервер действительно владеет этим доменом, сервер должен отправить сертификат, подписанный доверенной третьей стороной. Затем браузер сравнит этот сертификат с запрошенным доменом.

Это представляет собой проблему. Как сервер узнает, сертификат какого хоста (веб-сайта) отправлять, если ему нужно сделать это до получения HTTP-запроса?

Традиционно это решалось путем выделения выделенного IP-адреса (или порта) для каждого веб-сайта, требующего HTTPS. Очевидно, это становится проблематичным, когда у нас начинают заканчиваться адреса IPv4.

ВходитьСНИ(Указание имени сервера). Теперь браузер передает имя хоста во время согласования TLS, поэтому сервер получает эту информацию достаточно рано, чтобы отправить правильный сертификат. На стороне сервера конфигурация очень похожа на то, как настраиваются виртуальные хосты HTTP.

Недостатком является то, что имя хоста теперь передается как обычный текст перед шифрованием и по сути является утечкой информации. Обычно это считается приемлемым компромиссом, учитывая, что имя хоста обычно раскрывается в DNS-запросе в любом случае.


Что делать, если вы запрашиваете сайт только по IP-адресу?

Что делает сервер, когда он не знает, какой именно хост вы запросили, зависит от реализации и конфигурации сервера. Обычно указывается "default", "catchall" или "fallback" сайт, который будет предоставлять ответы на все запросы, в которых явно не указан хост.

Этот сайт по умолчанию может быть отдельным независимым сайтом (часто отображающим сообщение об ошибке) или любым другим сайтом на сервере, в зависимости от предпочтений администратора сервера.

решение2

У меня есть такое объяснение для людей, далеких от технологий.

Джек, Джилл и Джо живут в общежитии, и у них нет мобильных телефонов.

В телефонной книге они все указаны под одним и тем же номером. (A-запись)

Вы набираете номер, и кто-то снимает трубку; вы говорите: «Я хотел бы поговорить с Джилл», и она подключается.

Вместо записи A (номер телефона/IP-адрес A) в телефонной книге может быть просто указано «Общежитие X», в таком случае вам придется искать номер общежития X. Это запись CNAME.

Если Джилл недоступна, вы можете получить

  • 404 Джилл здесь нет
  • 410 Джилл мертва.
  • 301 Джилл переезжает к Питеру
  • 302 Джилл навещает Питера, позвоните ему вместо этого.

  • 400 Я вас не понимаю.

  • 401 Кто вы? Какой пароль? или Мы не разрешаем мужчинам звонить после 22:00
  • 402 Требуется оплата (Вы уверены, что Джилл — ее настоящее имя ;-) )
  • 403 Нет, это неверный пароль.
  • 418 Джилл — чайник :-)
  • 429 Джилл больше не может принимать звонки.
  • 451 Вы нарушаете запретительный судебный приказ.

  • 500 Наша телефонная система вышла из строя.

решение3

Насколько я понимаю, DNS связывает доменное имя с IP-адресом сервера, на котором хранится веб-сайт. Означает ли это, что на каждом сервере может храниться только один веб-сайт?

Во-первых, вам нужно понять, что здесь существует ряд различных концепций.

  • Веб-сайт — группа веб-страниц, образующих единое целое.
  • IP-адрес — числовой адрес (32-битный для IPv4, 128-битный для IPv6), используемый интернет-протоколом в качестве источника или пункта назначения трафика.
  • Сервер — машина, задачей которой является обслуживание запросов клиентов.
  • Имя хоста, имя, используемое для идентификации машины в DNS (например, «www.example.com» или «en.wikipedia.org»).

Между этими вещами нет однозначного соответствия. Один сервер может иметь несколько IP-адресов; несколько имен хостов могут указывать на один IP-адрес; одно имя хоста может указывать на несколько IP-адресов. Несколько веб-сайтов могут находиться под одним и тем же именем хоста. Один веб-сайт может быть распределен по нескольким именам хостов.

Если нет, то как вызов IP-адреса сервера узнает, какой веб-сайт мне нужен, если на одном сервере их много?

В старые времена (HTTP 1.0 и ранее) каждое имя хоста, которое сервер хотел обрабатывать по-разному, должно было иметь свой собственный IP-адрес. Это было довольно расточительно.

HTTP 1.1 добавил Host«заголовок» как обязательное поле в HTTP-запросе (IIRC, некоторые поставщики ранее поддерживали это как расширение). Это сообщало серверу, какое имя хоста было запрошено, и, следовательно, позволяло ему обслуживать разный контент для разных имен хостов на одном и том же IP-адресе. Поддержка HTTP 1.1 в клиентах теперь повсеместна.

К сожалению, SSL (позже TLS) добавил изъян. Установление сеанса SSL/TLS требует, чтобы сервер предоставил клиенту сертификат, который покрывает запрошенное имя хоста, но HTTP-запрос не поступает до тех пор, пока сеанс SSL/TLS не будет установлен.

Можно иметь один сертификат, охватывающий несколько имен хостов, используя поле SubjectAltNameили используя подстановочные знаки в CommonNameполе. Однако это создает административные проблемы, особенно если вовлеченные имена хостов находятся в доменах с разным владельцем.

Поэтому TLS ввел расширение «указание имени сервера» (SNI). С этим расширением клиент отправляет запрошенное имя хоста на сервер во время процедуры установления связи TLS. Затем сервер может предоставить соответствующий сертификат. К сожалению, хотя текущие версии всех основных реализаций SSL/TLS поддерживают SNI, прошло много времени, прежде чем старые версии вышли из употребления.

решение4

Используя DNS, вы можете назначить столько имен одному IP-адресу, сколько захотите (в вашемфайл хостоввы можете просто разделить каждое имя пробелами, например). Используя DNS-сервер, вы также можетеназначить несколько IP-адресов одному имени. Он не ограничивается отношениями один к одному.

Веб-сервер знает, какой сайт обслуживатьизучениезапрошенный URL. Он смотрит, какой домен был запрошен, какой порт был запрошен и какой протокол использовался. Это не имеет ничего общего с DNS и обрабатывается протоколом HTTP.

Связанный контент