Справочник по Apache HTTP Server
Назначение
CLI, конфигурация и типовые сценарии Apache HTTP Server (DevOps, shared hosting, legacy PHP). Учебный обзор: Веб-серверы. Параллельный материал по Nginx: Справочник по Nginx. Курс раздела: DevOps и CI/CD.
Краткое пояснение
Apache HTTP Server (httpd) — модульный веб-сервер с открытым исходным кодом. Ядро принимает TCP-соединения и разбирает HTTP; расширения подключаются модулями (mod_ssl, mod_rewrite, mod_proxy, mod_headers). Конфигурация — текстовые файлы с контекстами (глобальный, виртуальный хост, каталог, файлы). На shared-хостинге и в LAMP-стеках Apache по-прежнему распространён из‑за .htaccess и mod_rewrite.
Быстрый старт
Debian / Ubuntu (apache2)
sudo apt update && sudo apt install apache2
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo a2enmod rewrite ssl proxy_fcgi headers
sudo systemctl restart apache2
RHEL / Fedora / Rocky (httpd)
sudo dnf install httpd
sudo apachectl configtest
sudo systemctl enable --now httpd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Проверка ответа
curl -I http://127.0.0.1/
curl -I -H "Host: example.com" http://127.0.0.1/
Справочные таблицы
Содержание справочника
- Расположение файлов
- MPM и рабочие процессы
- Виртуальные хосты
- Контекст Directory и Files
- mod_rewrite
- Файлы .htaccess
- PHP — mod_php и PHP-FPM
- mod_proxy и балансировка
- SSL/TLS (mod_ssl)
- Логирование
- Безопасность
- Стек Nginx + Apache
- Ошибки и диагностика
Расположение файлов
| Дистрибутив | Пакет | Главный конфиг | Сайты | Логи |
|---|---|---|---|---|
| Debian/Ubuntu | apache2 | /etc/apache2/apache2.conf | /etc/apache2/sites-available/, sites-enabled/ | /var/log/apache2/ |
| RHEL/Fedora | httpd | /etc/httpd/conf/httpd.conf | /etc/httpd/conf.d/*.conf | /var/log/httpd/ |
| XAMPP (Windows) | — | apache/conf/httpd.conf | extra/httpd-vhosts.conf | apache/logs/ |
Дополнительные фрагменты подключаются через Include / IncludeOptional. В Debian модули включаются симлинками в mods-enabled/ (a2enmod, a2dismod); сайты — a2ensite, a2dissite.
MPM и рабочие процессы
MPM (Multi-Processing Module) определяет, как Apache обрабатывает параллельные соединения.
| MPM | Модель | Когда уместен |
|---|---|---|
prefork | процесс на соединение | старый mod_php, максимальная изоляция |
worker | процессы + потоки | компромисс память/параллелизм |
event | как worker, лучше keep-alive | рекомендуется на современных Linux при PHP-FPM |
Проверка активного MPM:
apache2ctl -V 2>/dev/null | grep MPM
# Server MPM: event
Настройка (пример для event в /etc/apache2/mods-available/mpm_event.conf):
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
</IfModule>
MaxRequestWorkers ограничивает одновременные запросы; при исчерпании клиенты ждут в очереди или получают ошибку. Для PHP через FPM узкое место чаще в пуле FPM, а не в Apache.
Виртуальные хосты
Несколько сайтов на одном IP и порту различаются заголовком Host. Первый подходящий VirtualHost становится default для неизвестных имён.
Debian/Ubuntu
Файл /etc/apache2/sites-available/example.conf:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example/public
<Directory /var/www/example/public>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example-error.log
CustomLog ${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>
sudo a2ensite example.conf
sudo apache2ctl configtest && sudo systemctl reload apache2
RHEL
Файл /etc/httpd/conf.d/example.conf с тем же содержимым блока VirtualHost (пути логов — /var/log/httpd/).
Редирект HTTP → HTTPS
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example/public
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# ... Directory, логи ...
</VirtualHost>
Контекст Directory и Files
| Директива | Назначение |
|---|---|
DocumentRoot | корень URL для виртуального хоста |
DirectoryIndex | индексные файлы (index.html, index.php) |
Options | Indexes, FollowSymLinks, ExecCGI |
AllowOverride | разрешить .htaccess (None в production) |
Require | контроль доступа (Apache 2.4+) |
<Directory /var/www/app/public>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<Files ".env">
Require all denied
</Files>
<FilesMatch "\.(git|svn)">
Require all denied
</FilesMatch>
Apache 2.4 использует Require all granted вместо устаревшего Order allow,deny / Allow from all.
mod_rewrite
Модуль mod_rewrite переписывает URL по правилам до выбора обработчика. Включение:
sudo a2enmod rewrite # Debian
sudo systemctl reload apache2
Базовый шаблон в конфиге виртуального хоста
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example/public
<Directory /var/www/example/public>
AllowOverride None
Require all granted
RewriteEngine On
RewriteBase /
# Канонический хост без www
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
# Front controller (Laravel, Symfony, WordPress в подкаталоге)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
</Directory>
</VirtualHost>
Флаги RewriteRule
| Флаг | Смысл |
|---|---|
[L] | последнее правило (last) |
[R=301] | редирект клиенту |
[NC] | без учёта регистра |
[P] | проксировать (нужен mod_proxy) |
Проксирование пути на другой сервис
RewriteEngine On
RewriteRule ^/api/(.*)$ http://127.0.0.1:8080/$1 [P,L]
Для [P] должны быть включены proxy и proxy_http.
Отладка
LogLevel alert rewrite:trace3
Высокий уровень trace только на staging — логи быстро растут.
Файлы .htaccess
.htaccess в каталоге позволяет менять конфигурацию без правки главных файлов. Каждый запрос может читать цепочку .htaccess вверх по дереву — это дороже центрального конфига.
AllowOverride | Разрешает |
|---|---|
None | запрет (рекомендуется на production) |
FileInfo | mod_rewrite, заголовки, типы |
AuthConfig | базовая аутентификация |
All | всё перечисленное |
Пример для shared hosting (когда центральный конфиг недоступен):
# /var/www/user/site/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
Правила из .htaccess переносят в <Directory> виртуального хоста, когда есть root-доступ — так быстрее и предсказуемее.
PHP — mod_php и PHP-FPM
| Способ | Модуль | Плюсы | Минусы |
|---|---|---|---|
| Встроенный PHP | mod_php | простая настройка на хостинге | PHP в процессе Apache, тяжёлый prefork |
| Внешний пул | proxy_fcgi + PHP-FPM | изоляция, event MPM | отдельный сервис php-fpm |
PHP-FPM (рекомендуется)
sudo apt install php-fpm
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.2-fpm
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
Или через ProxyPassMatch в виртуальном хосте:
<VirtualHost *:80>
DocumentRoot /var/www/app/public
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
</VirtualHost>
Сокет и версия PHP зависят от дистрибутива (/run/php/php-fpm.sock).
mod_php (legacy)
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Требует MPM prefork в классических сборках. На новых системах предпочтителен FPM.
mod_proxy и балансировка
mod_proxy передаёт запросы на backend (Tomcat, Node.js, второй Apache).
ProxyPreserveHost On
ProxyPass /api/ http://127.0.0.1:3000/api/
ProxyPassReverse /api/ http://127.0.0.1:3000/api/
Балансировка (mod_proxy_balancer)
<Proxy balancer://appcluster>
BalancerMember http://10.0.0.1:8080 loadfactor=3
BalancerMember http://10.0.0.2:8080
BalancerMember http://10.0.0.3:8080 status=+H
</Proxy>
ProxyPass /app/ balancer://appcluster/
ProxyPassReverse /app/ balancer://appcluster/
status=+H помечает узел как hot spare (резерв). Health check в open source ограничен; для активных проверок часто ставят HAProxy или Nginx перед Apache.
WebSocket
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /chat/(.*) ws://127.0.0.1:8080/chat/$1 [P,L]
ProxyPass /chat/ ws://127.0.0.1:8080/chat/
Нужны proxy_wstunnel и согласованные таймауты.
SSL/TLS (mod_ssl)
sudo a2enmod ssl
sudo certbot --apache -d example.com -d www.example.com
Ручная настройка:
Listen 443 https
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example-fullchain.pem
SSLCertificateKeyFile /etc/ssl/private/example.key
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>
Современные дистрибутивы подключают сниппеты ssl-params (Mozilla Intermediate). После изменений — apache2ctl configtest и reload.
Логирование
| Директива | Назначение |
|---|---|
ErrorLog | ошибки сервера и модулей |
CustomLog | access-лог (формат combined, common) |
LogLevel | детализация (warn, info, rewrite:trace3) |
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog ${APACHE_LOG_DIR}/access.log combined
Просмотр:
sudo tail -f /var/log/apache2/error.log
sudo journalctl -u apache2 -f
mod_status даёт страницу /server-status (только с Require local или VPN).
Безопасность
- Отключить листинг каталогов:
Options -Indexes. - Запретить доступ к служебным файлам (
<FilesMatch>для.git,.env). - Минимизировать
AllowOverrideна production. - Ограничить размер тела:
LimitRequestBody 10485760(10 MiB). - Заголовки через
mod_headers:
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
- WAF: ModSecurity поверх Apache (отдельная тема; часто WAF ставят на Nginx).
Аутентификация по паролю (mod_auth_basic):
<Directory /var/www/private>
AuthType Basic
AuthName "Restricted"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
sudo htpasswd -c /etc/apache2/.htpasswd admin
Стек Nginx + Apache
Типовая схема для legacy PHP и сложных rewrite:
Nginx (см. 3112):
server {
listen 443 ssl;
server_name example.com;
root /var/www/example/public;
location / {
try_files $uri $uri/ @apache;
}
location @apache {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Apache слушает только localhost:
<VirtualHost 127.0.0.1:8080>
ServerName example.com
DocumentRoot /var/www/example/public
# rewrite и PHP-FPM здесь
</VirtualHost>
TLS и rate limiting остаются на Nginx; Apache обрабатывает .htaccess, если политика хостинга это требует.
Ошибки и диагностика
Распространённые ошибки
| Симптом | Причина | Действие |
|---|---|---|
403 Forbidden | нет Require all granted, SELinux, права NTFS/Unix | права на DocumentRoot, контекст SELinux httpd_sys_content_t |
404 при существующем файле | неверный DocumentRoot, rewrite уводит в / | apache2ctl -S, лог rewrite |
500 + PHP | синтаксис, падение FPM | лог FPM /var/log/php*-fpm.log |
AH00558 | не указан ServerName | ServerName localhost в conf |
Address already in use | порт 80 занят (Nginx, другой httpd) | ss -tlnp | grep :80 |
| Бесконечный редирект | http/https за прокси без X-Forwarded-Proto | SetEnvIf X-Forwarded-Proto https HTTPS=on |
Команды диагностики
apache2ctl configtest # синтаксис
apache2ctl -S # виртуальные хосты и порядок
apache2ctl -M # загруженные модули
curl -v http://127.0.0.1/ # заголовки ответа
Логи при старте
sudo journalctl -u apache2 -b --no-pager
sudo tail -50 /var/log/apache2/error.log
Совместимость
| Область | Примечание |
|---|---|
| Версии | Apache 2.4.x — актуальная ветка; 2.2 устарела |
| Платформы | Linux — основная; Windows — XAMPP/WAMP, реже production |
| PHP | предпочтителен PHP-FPM + proxy_fcgi, не mod_php на event MPM |
| Конфиг 2.2 → 2.4 | Order/Allow заменены на Require |
В подборках
Справочники — Справочник по Nginx, Справочник по Ansible, Справочник по Terraform, Справочник по GitHub Actions, Справочник по Jenkins, Веб-серверы.
Базовый разбор HTTP и HTTPS — HTTP как основа веб-интеграций.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Часто можно запутаться в понятиях вроде прод, тест и тому подобное — основы DevOps простым языком. Непрерывная интеграция — это практика разработки программного обеспечения, при которой изменения, вносимые разработчиками в общий репозиторий исходного кода, автоматически и регулярно объединяются. Развёртывание — доставка новой версии на сервер; стратегия — правила, как переключить пользователей со старой версии на новую без простоя и с откатом. Git — точка входа в CI/CD: коммит, ветка и pull request запускают сборку, тесты и выкат; ниже — Git Flow, хуки и GitOps. Approvals и deployment gates в GitHub Actions и Azure Pipelines: разделение зон ответственности между разработкой и эксплуатацией. Пайплайн — цепочка от коммита до мониторинга на проде: сборка, тесты, релиз, деплой и обратная связь. Azure Repos — Git и TFVC в Azure DevOps: репозитории, pull request, политики веток и связь с CI/CD. Автоматизация и наблюдаемость - стек ELK для сбора, индексации и анализа логов (Elasticsearch, Logstash, Kibana). Смешение терминов системный администратор и DevOps-инженер — чем роли отличаются на практике. Автоматизация представляет собой систематическое применение программных и аппаратных средств для выполнения задач без или с минимальным участием человека. Логирование и мониторинг в CI/CD необходимы для автоматизации процессов и обеспечения качества, позволяя отслеживать ход пайплайна и быстро выявлять проблемы. Terraform — это программа, которая позволяет описать всю вашу инфраструктуру в текстовых файлах, а потом одной командой создать её в облаке или локально.Основы DevOps
CI/CD. Принципы непрерывной интеграции и доставки
Стратегии развертывания
Использование Git и GitFlow в DevOps-процессах
Особенности настройки и эксплуатации CI/CD-конвейеров
Жизненный цикл пайплайна CI/CD
Azure Repos и Team Foundation Server (TFS)
Инструменты автоматизации и оркестрации
Роль DevOps-инженера и отличия от системного администратора
Автоматизация сборки, тестирования и развёртывания
Логирование, мониторинг и наблюдаемость систем
Terraform