Серверы содержат только один веб-сайт?

80

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

user3407319
источник
13
В Википедии есть хорошее введение в общий веб-хостинг . Если вы введете http: // <IP_ADDR> / в своем браузере, у HTTP-запроса не будет домена в Host:заголовке. В случае общего хостинга провайдер может настроить веб-сервер так, чтобы он обрабатывал это различными способами (например, по умолчанию, перенаправлять на провайдера и т. Д.).
Джедай
Я нажал на ссылки, которые заканчиваются сообщениями типа «этот сервер никогда / в настоящее время не размещает сайт, который вы ищете».
Джесвин Хосе
1
Если вы ищете способ запуска нескольких приложений на одном сервере - скажем, у вас есть два приложения MyApp и YourApp на портах 8001 и 8002 соответственно. У вас может быть два балансировщика нагрузки или прокси приложений: myapp.com и yourapp.com. Пусть они получат запросы через порты по умолчанию (80/443) и перенаправят его на фактические серверы с портами 8001 и 8002 соответственно.
rohithpr
6
Отличный вопрос Каждый сайт имел свой собственный IP-адрес (сервер может иметь более одного IP-адреса). Заголовок Host в HTTP / 1.1 был введен, чтобы обойти именно ту проблему, которую вы описываете. См. «Сохранение интернет-адреса» в www8.org/w8-papers/5c-protocols/key/key.html
AE
6
Если бы в http 1.1 не было заголовка хоста, ipv6 уже был бы реализован ;-) :-(
Lenne

Ответы:

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

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

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


Как насчет HTTPS?

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

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

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

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

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

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


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

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

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

боб
источник
1
Кроме того, один сайт может быть распределен по многим серверам, как в случае с балансировщиками нагрузки, как в Heroku и Amazon.
phyrfox
1
@phyrfox Да, я думал о добавлении этого, но это только косвенно связано с вопросом, и я не хотел делать ответ слишком долго. Возможно, все же в конечном итоге добавим раздел для этого позже.
Боб
Легенда гласит, что субдомены указывают на такие конкретные компьютеры внутри сети. В теории
Loupax
«Традиционно это было решено с помощью выделенного IP-адреса (или порта) для каждого веб-сайта, требующего HTTPS. Очевидно, это становится проблематичным, когда у нас заканчиваются адреса IPv4». Так что без этого изобретения у всех нас был бы ipv6 к настоящему времени ,
Ленн
92

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

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

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

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

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

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

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

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

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

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

Lenne
источник
Для любопытных RFC за 418 - это tools.ietf.org/html/rfc2324 и интересная статья sitesdoneright.com/blog/2013/03/… :)
Wordzilla,
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, старым версиям потребовалось много времени, чтобы выйти из строя.

plugwash
источник
Вы забыли упомянуть, что TCP может прослушивать множество портов, используя разные серверы на каждом ...
Тоби Спайт
Да, но у вас нет номеров портов в dns, и вы не можете ожидать, что joe.p.user перейдет на our.fabulous.site:81 Кроме того, некоторые брандмауэры блокируют исходящий доступ к нестандартным номерам портов.
Ленн
3

Ответ немного сложнее, чем некоторые из ответов сделали это. При выполнении поиска DNS вы ДОЛЖНЫ получить IP-адрес ( Aзапись для IPv4, AAAAдля IPv6). Вы должны быть в состоянии открыть сокет через 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 и т. Д.), А затем этот единственный скрипт будет определять, какой веб-сайт и страницу отображать.

Machavity
источник
1

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

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

krowe
источник
0

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

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

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

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

h22
источник
0

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

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

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

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

Тим Коннор
источник