Когда пользователь вводит адрес сайта в браузере и нажимает 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
, передаваемого браузером. Теперь, понимая эту цепочку, можно уверенно настраивать веб-сервер и управлять несколькими сайтами с одного сервера.