Czy serwery posiadają tylko jedną stronę internetową?


80

Z tego, co rozumiem, łącze DNS nazwa domeny z adresem IP serwera, na którym przechowywana jest strona internetowa, czy to oznacza, że ​​każdy serwer może przechowywać tylko jedną stronę internetową? Jeśli nie, to w jaki sposób połączenie adresu IP serwera wie, której witryny chcę, jeśli jest ich wiele na tym samym serwerze?


13
Wikipedia ma dobre wprowadzenie do wspólnego hostingu . Jeśli wpiszesz http: // <IP_ADDR> / w przeglądarce, żądanie HTTP nie będzie zawierać domeny w Host:nagłówku. W przypadku hostingu współdzielonego dostawca może skonfigurować serwer WWW do obsługi tego na różne sposoby (np. Mieć ustawienie domyślne, przekierować do dostawcy itp.).
Jedi

Kliknąłem linki, które łamią się z wiadomościami typu „ten serwer nigdy / obecnie nie hostuje witryny, której szukasz”.
Jesvin Jose

1
Jeśli szukasz sposobu na uruchomienie wielu aplikacji na jednym serwerze - powiedz, że masz dwie aplikacje MyApp i YourApp na portach odpowiednio 8001 i 8002. Możesz mieć dwa moduły równoważące obciążenie lub serwery proxy aplikacji na: myapp.com i yourapp.com. Niech otrzymają żądania na domyślnych portach (80/443) i przekażą je do rzeczywistych serwerów na portach odpowiednio 8001 i 8002.
rohithpr

6
Świetne pytanie. Każda witryna potrzebowała kiedyś własnego adresu IP (serwer może mieć więcej niż jeden adres IP). Nagłówek hosta w HTTP / 1.1 został wprowadzony, aby obejść dokładnie opisany problem. Patrz „Ochrona adresów internetowych” na www8.org/w8-papers/5c-protocols/key/key.html
AE

6
Gdyby http 1.1 nie miał nagłówka hosta, ipv6 byłby już zaimplementowany ;-) :-(
Lenne

Odpowiedzi:


149

Zasadniczo: przeglądarka uwzględnia nazwę domeny w żądaniu HTTP, dzięki czemu serwer internetowy wie, która domena została zażądana i może odpowiednio odpowiedzieć.


Żądania HTTP

Oto jak dzieje się Twoje typowe żądanie HTTP:

  1. Użytkownik podaje adres URL w formie http://host:port/path.

  2. Przeglądarka wyodrębnia część adresu URL hosta (domeny) i, jeśli to konieczne, przekształca ją na adres IP, w procesie znanym jako rozpoznawanie nazw . To tłumaczenie może odbywać się przez DNS, ale nie musi (na przykład hostsplik lokalny w popularnych systemach operacyjnych omija DNS).

  3. Przeglądarka otwiera połączenie TCP z określonym portem lub domyślnie z portem 80 dla tego adresu IP.

  4. Przeglądarka wysyła żądanie HTTP. W przypadku HTTP / 1.1 wygląda to tak:

    GET /path HTTP/1.1
    Host: example.com
    

    ( HostNagłówek jest standardowy i wymagany w HTTP / 1.1. Nie został określony w specyfikacji HTTP / 1.0, ale niektóre serwery i tak go obsługują.)

Stąd serwer WWW zawiera kilka informacji, które mogą wykorzystać do podjęcia decyzji o odpowiedzi. Pamiętaj, że jeden serwer WWW może być powiązany z wieloma adresami IP.

  • Żądany adres IP z gniazda TCP
    • Adres IP klienta jest również dostępny, ale jest on rzadko używany - czasami do blokowania / filtrowania
  • Żądany port z gniazda TCP
  • Żądana nazwa hosta określona w Hostprzeglądarce przez nagłówek żądania HTTP.
  • Żądana ścieżka
  • Wszelkie inne nagłówki (pliki cookie itp.)

Jak się wydaje, zauważono, że obecnie najpopularniejsza konfiguracja hostingu współdzielonego powoduje umieszczenie wielu stron internetowych pod jednym adresem IP: kombinację portów, pozostawiając tylko Hostrozróżnienie stron internetowych.

Jest to znane jako wirtualny host oparty na nazwie w Apache-land, podczas gdy Nginx nazywa je Nazwy serwerów w blokach serwerów, a IIS woli Serwer wirtualny .


Co z HTTPS?

HTTPS jest nieco inny. Wszystko jest identyczne do ustanowienia połączenia TCP, ale po tym musi zostać ustanowiony zaszyfrowany tunel TLS. Celem jest nie wyciekanie żadnych informacji o żądaniu.

Aby sprawdzić, czy serwer faktycznie jest właścicielem tej domeny, musi wysłać certyfikat podpisany przez zaufaną stronę trzecią. Przeglądarka porówna ten certyfikat z żądaną domeną.

To stanowi problem. Skąd serwer wie, który certyfikat hosta (witryny internetowej) wysłać, jeśli musi to zrobić przed otrzymaniem żądania HTTP?

Tradycyjnie było to rozwiązywane przez posiadanie dedykowanego adresu IP (lub portu) dla każdej strony internetowej wymagającej HTTPS. Oczywiście staje się to problematyczne, gdy zaczynamy brakować adresów IPv4.

Wpisz SNI (wskazanie nazwy serwera). Przeglądarka przekazuje teraz nazwę hosta podczas negocjacji TLS, więc serwer ma te informacje wystarczająco wcześnie, aby wysłać poprawny certyfikat. Po stronie serwera konfiguracja jest bardzo podobna do konfiguracji wirtualnych hostów HTTP.

Minusem jest to, że nazwa hosta jest teraz przekazywana jako zwykły tekst przed szyfrowaniem i zasadniczo jest to wyciek informacji. Jest to zwykle uważane za akceptowalny kompromis, biorąc pod uwagę, że nazwa hosta jest zwykle ujawniona w zapytaniu DNS.


Co się stanie, jeśli poprosisz o witrynę tylko według adresu IP?

To, co robi serwer, gdy nie wie, jakiego konkretnego hosta żądasz, zależy od implementacji i konfiguracji serwera. Zazwyczaj określa się witrynę „domyślną”, „catchall” lub „rezerwową”, która zapewni odpowiedzi na wszystkie żądania, które nie określają jawnie hosta.

Ta domyślna witryna może być własną niezależną witryną (często wyświetlającą komunikat o błędzie) lub może być dowolną z innych witryn na serwerze, w zależności od preferencji administratora serwera.


1
Ponadto jedna witryna może być podzielona na wiele serwerów, jak ma to miejsce w przypadku modułów równoważenia obciążenia, takich jak Heroku i Amazon.
phyrfox

1
@phyrfox Tak, zastanawiałem się nad dodaniem tego, ale jest to tylko stycznie związane z pytaniem i nie chciałem zbyt długo udzielać odpowiedzi. Być może nadal dodam sekcję na ten temat później.
Bob

Legenda głosi, że poddomeny wskazują tak określone komputery w sieci. Teoretycznie
Loupax

„Tradycyjnie było to rozwiązywane przez posiadanie dedykowanego adresu IP (lub portu) dla każdej strony internetowej wymagającej HTTPS. Oczywiście staje się to problematyczne, gdy zaczynamy brakować adresów IPv4.” .
Lenne

92

Mam to wytłumaczenie dla osób nietechnicznych.

Jack, Jill i Joe mieszkają w akademiku i nie mają telefonów komórkowych.

W książce telefonicznej wszystkie są oznaczone tym samym numerem. (Nagranie)

Wybierz numer, a ktoś odbierze telefon; mówisz: „Chciałbym porozmawiać z Jill” i dostajesz ją na linię.

Zamiast rekordu A (numer telefonu / adres IP) w książce telefonicznej może po prostu powiedzieć „Dormitorium X”, wtedy musisz poszukać numeru dla Dormitorium X. To jest rekord CNAME.

Jeśli Jill nie jest dostępna, możesz ją otrzymać

  • 404 Jill tu nie ma
  • 410 Jill nie żyje.
  • 301 Jill zostaje zamieszkała z Peterem
  • 302 Jill odwiedza Piotra, zamiast tego zadzwoń do niego

  • 400 Nie mogę cię zrozumieć.

  • 401 Kim jesteś? Jakie jest hasło? lub Nie zezwalamy na dzwoniących mężczyzn po 22:00
  • 402 Wymagana płatność (Jesteś pewien, że Jill to jej prawdziwe imię ;-))
  • 403 Nie, to nieprawidłowe hasło.
  • 418 Jill to czajniczek :-)
  • 429 Jill nie może już odbierać połączeń.
  • 451 Naruszasz zakaz krępowania.

  • 500 Nasz system telefoniczny się zepsuł.


Dla ciekawskich RFC za 418 to tools.ietf.org/html/rfc2324 i ciekawy artykuł sitesdoneright.com/blog/2013/03/… :)
Wordzilla

6

Z tego, co rozumiem, łącze DNS nazwa domeny z adresem IP serwera, na którym przechowywana jest strona internetowa, czy to oznacza, że ​​każdy serwer może przechowywać tylko jedną stronę internetową?

Po pierwsze, musisz zrozumieć, że istnieje tutaj wiele różnych pojęć.

  • Strona internetowa, grupa stron internetowych, które tworzą spójną całość.
  • Adres IP, adres numeryczny (32-bitowy dla IPv4, 128-bitowy dla IPv6) używany przez protokół internetowy jako źródło lub miejsce docelowe ruchu.
  • Serwer, maszyna, której zadaniem jest obsługa żądań od klientów.
  • Nazwa hosta, nazwa używana do identyfikacji komputera w DNS (np. „Www.example.com” lub „en.wikipedia.org”)

Między tymi rzeczami nie ma relacji jeden do jednego. Jeden serwer może mieć wiele adresów IP; wiele nazw hostów może wskazywać na jeden adres IP; jedna nazwa hosta może wskazywać na wiele adresów IP. Wiele witryn internetowych może mieć tę samą nazwę hosta. Jedna witryna może być podzielona na wiele nazw hostów.

Jeśli nie, to w jaki sposób połączenie adresu IP serwera wie, której witryny chcę, jeśli jest ich wiele na tym samym serwerze?

W dawnych czasach (HTTP 1.0 i wcześniejsze) każda nazwa hosta, którą serwer chciał obsługiwać inaczej, musiała mieć własny adres IP. To było raczej marnotrawstwo.

HTTP 1.1 dodał Hostnagłówek „jako pole obowiązkowe w żądaniu HTTP (IIRC niektórzy dostawcy wcześniej obsługiwali to jako rozszerzenie). Dzięki temu serwer podał nazwę hosta, o którą proszono, i tym samym zezwolił mu na dostarczanie różnych treści dla różnych nazw hostów na tym samym Adres IP Obsługa protokołu HTTP 1.1 w klientach jest teraz wszechobecna.

Niestety protokół SSL (później TLS) dodał zmarszczkę. Ustanowienie sesji SSL / TLS wymaga od serwera przedstawienia klientowi certyfikatu obejmującego żądaną nazwę hosta, ale żądanie HTTP nie dotrze, dopóki nie zostanie ustanowiona sesja SSL / TLS.

Możliwe jest posiadanie jednego certyfikatu obejmującego wiele nazw hostów za pomocą SubjectAltNamepola lub symboli wieloznacznych w CommonNamepolu. Stanowi to jednak wyzwania administracyjne, zwłaszcza jeśli nazwy hostów należą do domen o różnej własności.

Dlatego TLS wprowadziło rozszerzenie „SNI”. Dzięki temu rozszerzeniu klient wysyła żądaną nazwę hosta do serwera podczas procedury uzgadniania TLS. Serwer może następnie przedstawić odpowiedni certyfikat. Niestety, chociaż obecne wersje wszystkich głównych implementacji SSL / TLS obsługują SNI, minęło dużo czasu, zanim starsze wersje przestały być używane.


Zapomniałeś wspomnieć, że TCP może nasłuchiwać na wielu portach, uruchamiając różne serwery na każdym ...
Toby Speight

Tak, ale nie masz numerów portów w dns i nie możesz oczekiwać, że joe.p.serser przejdzie do naszej.fabulous.site:81 Poza tym niektóre zapory blokują wychodzący dostęp do niestandardowych numerów.
Lenne

3

Odpowiedź jest nieco bardziej skomplikowana niż niektóre z nich. Podczas wyszukiwania DNS MUSISZ uzyskać adres IP ( Arekord dla IPv4, AAAAdla IPv6). Musisz być w stanie otworzyć gniazdo przez TCP / IP, aby się komunikować, inaczej wszystko się nie powiedzie. Ten adres może reprezentować serwer lub moduł równoważenia obciążenia. Może nawet reprezentować proxy. Jeśli na przykład host znajduje się za CloudFlare, otrzymany adres to serwer CloudFlare. Prawdziwy serwer jest gdzie indziej. Pozwala to hostowi uniknąć problemów takich jak ataki typu „odmowa usługi”.

Wirtualny hosting jest tym, o co pytasz (niektóre z pozostałych pytań na ten temat, ale nie szczegółowo). Hosting wirtualny przyjmuje żądanie sieciowe i sprawdza nazwę hosta (tj. Domena.com), aby ustalić, która witryna ma być obsługiwana. Tak więc na serwerze WWW Apache HTTP miałbyś taką konfigurację

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

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

Jest to na przykład uproszczone. Mówimy więc Apache, aby nasłuchiwał na porcie 80 dowolnego adresu IP (w nowoczesnej maszynie wirtualnej obsługującej adres IP komputera może się różnić od rzeczywistego adresu IP). Następnie mówimy, że jest to domain.comstrona internetowa i katalog, pod którym znajduje się ta strona internetowa. Następnie możemy powtarzać ten blok w kółko, aby Apache obsługiwał różne strony internetowe. Każdy serwer WWW obsługuje ten typ systemu.

Innym sposobem na poradzenie sobie z tym byłoby polecenie serwerowi internetowemu, aby skierował cały ruch internetowy do jednego skryptu programistycznego (tj. PHP, ASP.NET itp.), A następnie ten pojedynczy skrypt określi stronę i stronę do wyświetlenia.


1

Za pomocą DNS możesz przypisać dowolną liczbę nazw do indywidualnego adresu IP, jak chcesz (w pliku hostów możesz po prostu oddzielić każdą nazwę na przykład spacjami). Za pomocą serwera DNS możesz również przypisać wiele adresów IP do jednej nazwy . Nie ogranicza się to do relacji jeden do jednego.

Serwer internetowy wie, którą witrynę obsługiwać, sprawdzając żądany adres URL. Sprawdza, którą domenę zażądano, żądany port i jakiego protokołu użyto. Nie ma to nic wspólnego z DNS i jest obsługiwane przez protokół HTTP.


0

Serwer WWW ma koncepcję kontenera hosta ( tutaj jest na przykład dokumentacja Tomcat). Wiele kontenerów hosta można skonfigurować dla tego samego adresu skrzynki / adresu IP, obsługując wiele domen. Kontenery mają niezależne działające katalogi, dziedziny uwierzytelniania, katalogi dziennika i tym podobne.

Serwer znajduje odpowiedni kontener dla nowego żądania. Nazwa domeny jest częścią tego żądania HTTP.

Zupełnie różne instancje serwera WWW mogą dzielić ten sam adres IP, jeśli działają na różnych portach. Jest to najczęściej używane w różnych środowiskach programistycznych i testowych, w których nazwy domen mogą być niedostępne, ponieważ serwer produkcyjny nie może działać na dowolnym porcie.

Wreszcie, nawet jeśli strona internetowa wymaga ściśle unikalnego adresu IP, skrzynka serwerowa często ma wiele kart sieciowych, więc jest skonfigurowana do korzystania z wielu adresów IP.


0

Twój adres IP serwera może jednocześnie przechowywać wiele różnych nazw domen.

Gdy uzyskujesz dostęp do witryny, przeglądarka wysyła żądanie HTTP z nazwą domeny, a serwer może znaleźć dane, które powinien wtedy wysłać.

To się nazywa wirtualne hosty, takie proste :)

Zajrzyj tutaj, aby uzyskać więcej informacji o DNS i wirtualnych hostach.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.