79

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

7 ответов7

149

В основном: браузер включает имя домена в запрос 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
  • Запрашиваемое имя хоста, указанное браузером в HTTP-запросе в заголовке Host .
  • Запрашиваемый путь
  • Любые другие заголовки (куки и т.д.)

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

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


Как насчет HTTPS?

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

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

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

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

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

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


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

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

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

92

У меня есть это объяснение для нетехнических людей.

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

В телефонной книге все они перечислены под одним номером. (Запись)

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

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

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

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

  • 400 Я не могу тебя понять.

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

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

6

Насколько я понимаю, 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, старые версии вышли из употребления очень долго.

3

Ответ немного сложнее, чем некоторые из ответов сделали это. При выполнении просмотра DNS вы должны получить IP - адрес (запись для IPv4, IPv6 A для). Вы должны быть в состоянии открыть сокет через TCP/IP для связи, или все это терпит неудачу. Этот адрес может представлять сервер или балансировщик нагрузки. Это может даже представлять прокси. Например, если хост находится за CloudFlare, вы получаете адрес сервера CloudFlare. Настоящий сервер где-то еще. Это позволяет хосту избежать таких проблем, как атаки типа «отказ в обслуживании».

Виртуальный хостинг - это то, о чем вы спрашиваете (некоторые другие вопросы касались этого, но не в деталях). Виртуальный хостинг принимает веб-запрос и просматривает имя хоста (то есть domain.com), чтобы определить, какой веб-сайт обслуживать. Таким образом, на HTTP-сервере Apache у вас будет такая конфигурация

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

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

Это упрощено, например. Поэтому мы советуем Apache прослушивать порт 80 любого IP-адреса (в современной виртуальной машине хост, на котором размещен IP-адрес вашей машины, может отличаться от действующего IP-адреса). Затем мы сообщаем ему, что это веб-сайт domain.com и в каком каталоге он находится. Затем мы можем повторить этот блок снова и снова, чтобы сказать Apache для обработки различных веб-сайтов. Каждый веб-сервер поддерживает этот тип системы.

Другим способом решения этой проблемы может быть указание веб-серверу направлять весь веб-трафик на один единственный программный сценарий (например, PHP, ASP.NET и т.д.), А затем этот единственный сценарий будет определять, какой веб-сайт и страницу отображать.

1

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

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

0

IP-адрес вашего сервера может содержать много разных доменных имен одновременно.

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

Это называется виртуальные хосты, все так просто :)

Посмотрите здесь для получения дополнительной информации о DNS и виртуальных хостах.

0

Веб-сервер имеет концепцию хост-контейнера (вот документация для Tomcat, например). Несколько хост-контейнеров могут быть настроены на один и тот же ящик / IP-адрес, обслуживая несколько доменов. Контейнеры имеют независимые рабочие каталоги, области аутентификации, каталоги журналов и тому подобное.

Сервер находит соответствующий контейнер для нового запроса на покупку, имя домена является частью этого HTTP-запроса.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .