
Apache HTTP Server: архитектура, VirtualHost, PHP и диагностика
Подробно разбираем Apache HTTP Server: обработку запроса, MPM, модули, виртуальные хосты, PHP-FPM, reverse proxy, безопасное изменение конфигурации и поиск ошибок.
Содержание
Apache HTTP Server, или httpd, принимает HTTP-запрос, выбирает конфигурацию нужного сайта и возвращает файл либо передаёт запрос приложению. Это не «движок сайта» и не база данных: сервер стоит между клиентом и содержимым, применяет правила доступа, TLS, маршрутизацию и журналирование.
Apache остаётся уместным там, где важны совместимость с существующими приложениями, гибкая модульная конфигурация и правила на уровне каталогов. Его нельзя оценивать только по чужому сравнению скоростей. Производительность зависит от модели процессов, обработчика PHP, числа соединений и характера нагрузки.
Путь одного HTTP-запроса
Браузер получает IP через DNS, устанавливает TCP-соединение, а для HTTPS ещё и TLS-сессию. Затем отправляет метод, путь, заголовок Host и другие данные. Apache:
- принимает соединение на директиве
Listen; - выбирает VirtualHost по адресу, порту и имени;
- нормализует URI и проверяет доступ;
- сопоставляет запрос с файлом, обработчиком или upstream;
- формирует ответ и записывает событие в журналы.
Различайте URI и путь в файловой системе. Запрос /assets/site.css при DocumentRoot /var/www/example/public обычно указывает на /var/www/example/public/assets/site.css, но Alias, rewrite или front controller могут изменить сопоставление.
Код 404 означает, что обработчик не нашёл ресурс. Код 403 — что доступ запрещён. Код 502 при проксировании говорит, что Apache не получил корректный ответ от следующего сервиса. Эти причины требуют разных проверок; замена прав «на всякий случай» нередко создаёт уязвимость.
MPM определяет модель параллелизма
Multi-Processing Module, или MPM, управляет рабочими процессами и потоками. Одновременно активен один MPM:
preforkобслуживает соединения процессами без потоков; его сохраняют главным образом для старых непотокобезопасных модулей;workerсоздаёт несколько процессов с потоками внутри;eventразвивает потоковую модель и эффективнее освобождает workers от простаивающих keep-alive соединений.
С PHP-FPM на современных Linux-системах обычно используют event. Старый mod_php нередко требует prefork, поэтому переход на PHP-FPM меняет и модель расхода памяти.
Проверить активный MPM и модули можно без изменения системы:
apachectl -V | grep -i 'Server MPM'
apachectl -M | sort
Ожидается строка вроде Server MPM: event и список модулей. Если apachectl не найден, на Debian/Ubuntu попробуйте apache2ctl. Не переключайте MPM только ради рекомендации: проверьте совместимость, лимиты PHP-FPM и память под реальной нагрузкой.
Модули подключают возможности
TLS реализует mod_ssl, переписывание URI — mod_rewrite, проксирование — семейство mod_proxy, HTTP/2 — mod_http2. Модуль включают по задаче, а не полным комплектом.
Каждый лишний модуль расширяет поверхность конфигурации. После изменения проверьте не только запуск, но и закрытые пути, заголовки и журналы. Наличие модуля ещё не означает, что связанная функция безопасно настроена.
VirtualHost разделяет сайты
VirtualHost хранит настройки домена. На Debian и Ubuntu файлы обычно лежат в /etc/apache2/sites-available, а активные ссылки — в sites-enabled. В RHEL-подобных системах структура отличается.
Минимальный HTTP-хост для статики можно сохранить как /etc/apache2/sites-available/example.conf. Каталог должен существовать и читаться пользователем Apache.
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example/public
<Directory /var/www/example/public>
Options -Indexes
AllowOverride None
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/example-error.log
CustomLog \${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>
Options -Indexes запрещает список файлов без индексного документа. Require all granted разрешает HTTP-доступ к этому каталогу, но не заменяет корректные Unix-права.
На Debian/Ubuntu сайт включают sudo a2ensite example.conf. После этого обязательна проверка:
sudo apachectl configtest
sudo systemctl reload apache2
systemctl is-active apache2
curl -I -H 'Host: example.com' http://127.0.0.1/
configtest должен вернуть Syntax OK, сервис — active, curl — ожидаемый статус. При ошибке синтаксиса reload не выполняйте. Если проблема появилась после включения сайта, отключите его через a2dissite example.conf, снова проверьте и примените конфигурацию.
Почему открывается не тот сайт
Apache формирует набор VirtualHost для адреса и порта, затем сопоставляет Host с ServerName и ServerAlias. Если имя не найдено, ответит первый хост набора. Поэтому IP может открывать одну страницу, а домен — другую.
Покажите итоговую карту:
sudo apachectl -S
Вывод перечисляет адреса, порты, имена и файлы. Проверьте дубли ServerName, включённый default-site и отдельный HTTPS-хост на 443. DNS сообщает адрес сервера, но не выбирает каталог — это делает VirtualHost после получения запроса.
.htaccess — делегированная настройка
.htaccess позволяет менять часть поведения из каталога сайта без доступа к главной конфигурации. Это удобно на общем хостинге.
На своём сервере преимущество часто исчезает. При AllowOverride Apache ищет такие файлы по пути запроса, правила распределены по каталогам, а ошибку труднее обнаружить до публикации. Официальная документация рекомендует основную конфигурацию, когда она доступна администратору.
Если приложение требует .htaccess, не ставьте AllowOverride All на весь /var/www. Ограничьте конкретный каталог и классы директив, затем проверьте маршруты и закрытые файлы.
PHP лучше отделить через PHP-FPM
PHP-FPM управляет отдельным пулом PHP-процессов. Apache отдаёт статику и через FastCGI передаёт PHP-скрипт пулу. Так MPM, лимиты запросов, пользователи и ресурсы PHP настраиваются раздельно.
Схема должна запрещать передачу произвольного несуществующего пути как PHP-файла. Директивы зависят от структуры приложения, поэтому случайный FilesMatch копировать опасно. Базовые принципы прав разобраны в материале о файлах и каталогах Linux, а подключение пула — в руководстве по PHP-FPM и FastCGI.
Насыщение PHP-FPM видно по очереди пула, числу занятых workers и медленным запросам. Увеличение pm.max_children без расчёта памяти способно вызвать OOM — завершение процессов из-за нехватки RAM.
Apache как reverse proxy
Reverse proxy принимает внешний запрос и передаёт его Node.js, Python, Java или другому внутреннему HTTP-сервису. Для этого нужны mod_proxy и протокольный модуль, например mod_proxy_http.
Важно определить тайм-ауты, доверие к исходному IP, размер запроса, WebSocket upgrade и поведение при отказе backend. Нельзя включать публичный forward proxy через ProxyRequests On без отдельной задачи: открытый прокси станет инструментом злоупотреблений. Общая архитектура разобрана в руководстве по reverse proxy.
Изменение без лишнего простоя
При graceful-перезапуске управляющий процесс перечитывает конфигурацию, запускает новое поколение workers, а старым позволяет завершить запросы. Рабочая процедура:
- сохраните предыдущий файл;
- измените один логический блок;
- выполните
apachectl configtest; - примените reload;
- проверьте локальный URL с нужным
Host; - проверьте внешний HTTPS и журнал;
- при ухудшении верните файл и повторите test/reload.
Статус active не подтверждает правильный VirtualHost, PHP, сертификат и пользовательскую операцию. Нужна прикладная smoke-проверка.
Диагностика начинается с фактов
Зафиксируйте время, домен, путь, метод и код. Затем проверьте порт, карту VirtualHost, локальный запрос, access log, error log, наличие файла, права каталогов и доступность PHP-FPM либо upstream.
На Debian/Ubuntu последние события можно посмотреть так:
sudo journalctl -u apache2 --since '-10 minutes' --no-pager
sudo tail -n 100 /var/log/apache2/example-error.log
Не публикуйте журнал без очистки: URL и параметры могут содержать чувствительные данные. Если запроса нет в access log, он мог не дойти до Apache — проверяйте DNS, firewall, CDN и другой процесс на порту. Если запись есть, но ответ 500, переходите к журналу приложения. См. также разборы 403 и 500.
Когда выбирать Apache
Apache разумен, если команда знает его конфигурацию, приложение зависит от модулей или требуется делегирование через .htaccess. Он подходит для статики, TLS и reverse proxy.
Nginx может быть удобнее для большого числа соединений и централизованной конфигурации, Caddy — для типового HTTPS, управляемая платформа — для снижения серверной работы. Сравнивайте совместимость, наблюдаемость, навыки команды и восстановление, а не название продукта.
Источники
Самопроверка
Проверьте, что материал усвоен
Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.
Разбираем коротко
Частые вопросы
Чем Apache отличается от Nginx?
Оба сервера принимают HTTP-запросы, но устроены и настраиваются по-разному. Apache ценят за модульность, VirtualHost и совместимость с .htaccess, а Nginx часто используют как событийный reverse proxy и сервер статики. Выбор зависит от приложения и команды.
Нужно ли перезапускать Apache после каждого изменения?
Сначала выполните apachectl configtest, затем примените корректную конфигурацию graceful-перезапуском или reload. Это позволяет рабочим процессам завершить текущие запросы без жёсткого обрыва.
Стоит ли разрешать .htaccess на своём сервере?
Если вы управляете основной конфигурацией, обычно лучше перенести правила в VirtualHost и установить AllowOverride None. Apache не будет искать .htaccess в каждом каталоге, а все правила останутся в одном проверяемом месте.


