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

Виртуальный хостинг по именам в Apache

Современные веб-серверы, включая Apache, поддерживают технологию виртуального хостинга по именам (Name-based Virtual Hosting). Это позволяет размещать несколько сайтов на одном IP-адресе и одном сервере. Сервер различает сайты благодаря заголовку Host, который передаётся браузером в HTTP-запросе.

Почему это важно?

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

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

1. Определение IP-адреса сайта (DNS-запрос)

Когда пользователь вводит site1.ru в адресную строку браузера и нажимает Enter, браузеру необходимо узнать, какой IP-адрес соответствует этому домену. Для этого он выполняет следующие действия:

  • Проверяет, есть ли IP-адрес site1.ru в локальном кеше (ранее посещённые сайты могут сохраняться для ускорения загрузки).
  • Если IP-адреса нет в кеше, браузер отправляет запрос к DNS-серверу (системе доменных имён).
  • DNS-сервер выполняет поиск в своей базе и возвращает браузеру IP-адрес, например:
site1.ru → 192.168.1.100

Теперь браузер знает, куда отправлять запрос.

2. Установление соединения с сервером (TCP и TLS)

Теперь, когда браузер знает IP-адрес, он должен установить соединение с сервером. Этот процесс включает несколько шагов:

Создание TCP-соединения

Браузер отправляет запрос на установление соединения с сервером 192.168.1.100 по порту 80 (HTTP) или 443 (HTTPS). Этот процесс известен как трёхстороннее рукопожатие (Three-Way Handshake) и состоит из следующих шагов:

  • Браузер отправляет SYN (synchronize) пакет серверу.
  • Сервер отвечает SYN-ACK (synchronize-acknowledge).
  • Браузер отправляет ACK (acknowledge), подтверждая соединение.

Установление TLS-соединения (если используется HTTPS)

Если сайт работает по HTTPS, то после установления TCP-соединения начинается обмен сертификатами SSL/TLS, обеспечивающими шифрование передачи данных. Этот процесс включает:

  • Сервер отправляет браузеру цифровой сертификат.
  • Браузер проверяет подлинность сертификата с помощью центра сертификации (CA).
  • Если сертификат действителен, устанавливается зашифрованный канал связи.

Теперь браузер готов отправить HTTP-запрос к серверу.

3. Отправка HTTP-запроса

Когда соединение установлено, браузер отправляет HTTP-запрос к серверу. Этот запрос содержит:

  • Метод запроса (Request Method) – например, GET (получение страницы) или POST (отправка данных формы).
  • URL-адрес (Uniform Resource Locator) – путь к ресурсу, например, /index.html.
  • Заголовки запроса (Request Headers) – дополнительные параметры, такие как тип браузера (User-Agent), язык (Accept-Language) и, самое важное в контексте виртуального хостинга, заголовок Host:
Host: site1.ru

Этот заголовок сообщает серверу, для какого домена запрашивается страница.

Тело запроса (Request Body) – если это, например, POST-запрос, то в теле передаются отправленные данные.

Теперь сервер получил запрос и должен определить, какой сайт обслуживать.

4. Обработка запроса сервером

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

  • Сервер проверяет конфигурацию виртуальных хостов. Apache просматривает список сайтов, настроенных в файле конфигурации (/etc/apache2/sites-enabled/ на Ubuntu или /etc/httpd/conf.d/ на CentOS) и ищет соответствие по ServerName или ServerAlias.
<VirtualHost *:80>
    ServerName site1.ru
    DocumentRoot /var/www/site1
</VirtualHost>

<VirtualHost *:80>
    ServerName site2.ru
    DocumentRoot /var/www/site2
</VirtualHost>
  • Определение корневой директории сайта. Найдя соответствие Host: site1.ru, Apache устанавливает DocumentRoot как /var/www/site1.
  • Запускается обработка файлов. Apache проверяет наличие index.html или index.php в корневой директории.
  • Передача запроса к обработчику (если требуется). Если это статический файл, он отдается браузеру. Если это динамический контент (например, PHP), запрос передаётся интерпретатору (например, PHP-FPM).
  • Формирование HTTP-ответа. Сервер собирает данные, добавляет заголовки (Content-Type, Content-Length и другие) и отправляет их браузеру.

5. Отображение страницы в браузере

После получения HTTP-ответа браузер выполняет следующие действия:

  • Анализирует HTML-код. Определяет, какие ресурсы (CSS, JavaScript, изображения) необходимы.
  • Отправляет дополнительные запросы. Например, загружает стили и скрипты.
  • Рендерит страницу. Браузер отрисовывает страницу, применяя стили и выполняя скрипты.
  • Отображает контент пользователю. Теперь сайт полностью загружен и отображён на экране.

Заключение

Благодаря механизму виртуального хостинга Apache способен различать сайты, даже если они работают на одном сервере и одном IP-адресе. Это достигается за счёт заголовка Host, передаваемого браузером. Теперь, понимая эту цепочку, можно уверенно настраивать веб-сервер и управлять несколькими сайтами с одного сервера.

Фото аватара

От exrf

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *