Чи мають сервери лише один веб-сайт?


80

Оскільки я розумію, що DNS пов'язує доменне ім'я з IP-адресою сервера, на якому зберігається веб-сайт, чи означає це, що кожен сервер може містити лише один веб-сайт? Якщо цього немає, як зателефонувати за IP-адресою сервера, який веб-сайт я хочу, якщо на одному сервері їх багато?


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 був би реалізований на даний момент ;-) :-(
Ленн

Відповіді:


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-запиті.
  • Запитаний шлях
  • Будь-які інші заголовки (файли cookie тощо)

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

Це відоме як Віртуальний хост на основі імен в Apache-землі, в той час як Nginx називає їх Імена серверів у серверних блоках, а IIS віддає перевагу Віртуальний сервер .


Що з HTTPS?

HTTPS трохи інший. Все є ідентичним до встановлення TCP-з'єднання, але після цього повинен бути встановлений зашифрований тунель TLS. Мета - не просочувати жодної інформації про запит.

Для того, щоб переконатися, що серверу фактично належить цей домен, він повинен надіслати сертифікат, підписаний довіреною третьою стороною. Потім браузер порівняє цей сертифікат з доменом, про який він запитував.

Це представляє проблему. Як сервер знає, який сертифікат хоста (веб-сайту) надіслати, якщо це потрібно зробити до отримання HTTP-запиту?

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

Введіть SNI (Вказівка ​​імені сервера). Зараз браузер передає ім'я хоста під час переговорів щодо TLS, тому сервер має цю інформацію досить рано, щоб надіслати правильний сертифікат. На стороні сервера конфігурація дуже схожа на налаштування віртуальних хостів HTTP.

Недоліком є ​​те, що ім'я хоста зараз передається як звичайний текст перед шифруванням і по суті є просоченою інформацією. Зазвичай це вважається прийнятним компромісом, враховуючи те, що ім'я хоста, як правило, виявляється в запиті DNS.


Що робити, якщо ви запитуєте сайт лише за IP-адресою?

Що робити сервер, коли він не знає, якого конкретного хоста ви запитували, залежить від реалізації та конфігурації сервера. Як правило, вказаний сайт "за замовчуванням", "випадок" або "резервний", який надасть відповіді на всі запити, які чітко не визначають хост.

Цей сайт за замовчуванням може бути власним незалежним сайтом (часто показує повідомлення про помилку), або це може бути будь-який з інших сайтів на сервері, залежно від уподобань адміністратора сервера.


1
Крім того, один сайт може бути розділений на багато серверів, як це стосується балансирів навантаження, як, наприклад, Heroku та Amazon.
фірфокс

1
@phyrfox Так, я думав про те, щоб додати це, але це стосується лише дотичного питання, і я не хотів занадто довго робити відповідь. Можна все-таки додати розділ для цього пізніше.
Боб

Легенда говорить, що піддомени вказують на такі специфічні комп'ютери всередині мережі. Теоретично
Лупакс

"Традиційно це вирішувалося шляхом виділення спеціальної IP-адреси (або порту) для кожного веб-сайту, що вимагає HTTPS. Очевидно, це стає проблематичним, коли ми починаємо вичерпувати адреси IPv4.", Тож без цього уявлення у нас би все було ipv6 .
Ленна

92

Я маю це пояснення для нетехнологічних людей.

Джек, Джилл та Джо живуть у гуртожитку, і у них немає мобільних телефонів.

У телефонній книзі всі вони вказані з однаковою кількістю. (Запис)

Ви набираєте номер, і хтось забирає телефон; ви кажете "Я хотів би поговорити з Джилл", і ви отримаєте її на лінії.

Замість запису A (Телефонний номер / IP-адреса) в телефонній книзі він може просто сказати "Гуртожиток X", тоді потрібно шукати далі номер для гуртожитку X. Це запис CNAME.

Якщо Джилл недоступна, ви можете отримати

  • 404 Джилл тут немає
  • 410 Джилл мертва.
  • 301 Джилл переїхала разом із Пітером
  • 302 Джилл відвідує Пітера, зателефонуйте йому замість цього

  • 400 Я не можу тебе зрозуміти.

  • 401 Хто ти? Що таке пароль? або Ми забороняємо телефонувати чоловікам після 22 вечора
  • 402 Потрібна оплата (Ви впевнені, що Джилл - це її справжнє ім'я ;-))
  • 403 Ні, це не правильний пароль.
  • 418 Джилл - чайник :-)
  • 429 Джилл більше не може приймати дзвінки.
  • 451 Ви порушуєте свій обмежувальний порядок.

  • 500 Наша телефонна система вийшла з ладу.


Для допитливих RFC поза 418 - це інструменти.ietf.org/ html/rfc2324 та цікава стаття сайтаdoneright.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, але старі версії вже не використовуються.


Ви забули згадати, що TCP може слухати в багатьох портах, на кожному сервері працюють різні сервери ...
Toby Speight

Так, але у вас немає номерів портнетів у dns, і ви не можете очікувати, що joe.p.user перейде на наш сайт.fabulous.site:81 Крім того, деякі брандмауери блокують вихідний доступ до нестандартних номерів портів .
Ленна

3

Відповідь дещо складніша, ніж деякі відповіді це зробили. Виконуючи пошук DNS, ОБОВ'ЯЗКОВО отримати IP-адресу ( Aзапис для IPv4, AAAAдля IPv6). Ви повинні мати можливість відкрити розетку через TCP / IP для зв'язку, або вся справа не вдасться. Ця адреса може представляти сервер або може представляти собою балансир завантаження. Він навіть може представляти проксі. Наприклад, якщо хост стоїть за CloudFlare, наприклад, отримана адреса - це сервер CloudFlare. Справжній сервер - десь ще. Це дозволяє хосту уникати таких проблем, як напади відмови у користуванні.

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

<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-адресі, скільки хочете (у файлі хостів ви можете просто розділити кожне ім’я, наприклад, пробілами). За допомогою DNS-сервера ви також можете призначити декілька IP-адрес одному імені . Це не обмежується відносинами один на один.

Веб-сервер знає, який веб-сайт розмістити, вивчивши запитувану URL-адресу. Він переглядає, який домен запитували, який порт запитували та який протокол використовувався. Це не має нічого спільного з DNS і обробляється протоколом HTTP.


0

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

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

Абсолютно різні екземпляри веб-сервера можуть мати спільну IP-адресу, якщо вони працюють у різних портах. Це в основному використовується в різних середовищах розробки та тестування, де доменні імена можуть бути недоступними, оскільки виробничий сервер не може працювати на довільному порту.

Нарешті, навіть якщо для веб-сайту потрібна суворо унікальна IP-адреса, у серверній коробці часто є кілька мережевих адаптерів, тому вони налаштовані на використання декількох IP-адрес.


0

IP-адреса вашого сервера може одночасно містити багато різних доменних імен.

Коли ви переходите на веб-сайт, веб-переглядач надсилає HTTP-запит із доменним ім’ям, і сервер може знайти, які дані веб-сайту він повинен вам потім надіслати.

Це називається віртуальними хостами, настільки простим, як це :)

Подивіться тут для отримання додаткової інформації про DNS та віртуальних хостах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.