Настройка Apache2 для работы с несколькими сайтами требует понимания структуры конфигурационных файлов, ключевых директив и модулей. Это руководство предоставляет готовые конфигурации виртуальных хостов, которые можно сразу применять в development и production средах. Вы научитесь настраивать безопасность через контроль доступа по IP и mod_security, оптимизировать производительность с помощью mod_deflate и mod_headers, а также организовывать логирование для каждого сайта отдельно.
Базовый каркас: структура конфигов и виртуальные хосты
Конфигурация Apache2 для размещения нескольких сайтов строится на виртуальных хостах. Основные файлы хранятся в каталоге /etc/apache2/sites-available/. Каждый файл соответствует одному сайту или приложению. После создания конфигурации её нужно активировать, создав символическую ссылку в каталоге /etc/apache2/sites-enabled/ и перезагрузив сервер.
Права доступа к корневой директории сайта (DocumentRoot) должны быть настроены для пользователя и группы, от имени которых работает Apache (обычно www-data). Используйте команду chown для установки правильных владельцев.
Готовая конфигурация виртуального хоста (с комментариями)
Создайте файл /etc/apache2/sites-available/example.com.conf со следующим содержимением. Замените example.com на реальное доменное имя вашего проекта.
<VirtualHost *:80>
# Основное доменное имя сайта
ServerName example.com
# Альтернативное имя, обычно с www
ServerAlias www.example.com
# Абсолютный путь к корневой директории сайта
DocumentRoot /var/www/example.com/public_html
# Email администратора для страниц ошибок (опционально)
ServerAdmin webmaster@example.com
# Настройка доступа к корневой директории
<Directory /var/www/example.com/public_html>
# Разрешает просмотр содержимого директории (для отладки)
Options Indexes FollowSymLinks
# Разрешает использование .htaccess файлов
AllowOverride All
# Разрешает доступ всем
Require all granted
</Directory>
# Логи ошибок для этого хоста (отдельный файл)
ErrorLog /var/log/apache2/example.com-error.log
# Уровень детализации логов ошибок (warn для продакшена)
LogLevel warn
# Лог доступа для этого хоста (отдельный файл)
CustomLog /var/log/apache2/example.com-access.log combined
</VirtualHost>
# Конфигурация для HTTPS (порт 443)
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ServerAdmin webmaster@example.com
<Directory /var/www/example.com/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/apache2/example.com-ssl-error.log
LogLevel warn
CustomLog /var/log/apache2/example.com-ssl-access.log combined
# Настройки SSL (требуют отдельной конфигурации сертификатов)
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
</VirtualHost>
После создания файла активируйте сайт и перезагрузите Apache:
sudo a2ensite example.com.conf
sudo systemctl reload apache2
Разграничение окружений: разработка (dev) vs продакшен (prod)
Конфигурация для development среды фокусируется на удобстве отладки и разработки. Production конфигурация приоритезирует безопасность и производительность.
| Параметр | Development (dev) | Production (prod) |
|---|---|---|
| Уровень логирования (LogLevel) | debug или info | warn или error |
| Доступ по IP | Require all granted | Ограничение по IP (Require ip) |
| Модуль mod_security | Отключен или в режиме DetectionOnly | Включен с базовыми правилами OWASP CRS |
| Сжатие (mod_deflate) | Опционально | Обязательно для текстовых типов |
| Заголовки безопасности (mod_headers) | Базовые | Полный набор (HSTS, CSP, X-Frame-Options) |
| MPM модуль | prefork (для совместимости) | event (для высокой производительности) |
Для переключения MPM модуля в production используйте команды:
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2
Безопасность: контроль доступа и защита от атак
Защита веб-сервера начинается с контроля доступа на уровне IP-адресов и настройки модулей безопасности. Современный синтаксис Apache использует директивы Require вместо устаревших Order, Allow, Deny.
Модуль mod_security работает как межсетевой экран уровня приложения (WAF), анализируя HTTP-трафик и блокируя подозрительные запросы. Его базовые настройки защищают от распространённых атак, таких как SQL-инъекции и XSS.
Заголовки безопасности, настраиваемые через mod_headers, добавляют дополнительный уровень защиты на уровне браузера. HSTS принудительно использует HTTPS, CSP ограничивает источники исполняемого кода, X-Frame-Options защищает от кликджекинга.
Блокировка и разрешение доступа по IP-адресам
Используйте блоки <Directory> или <Location> с директивами Require для ограничения доступа к административным разделам или staging окружениям.
# Разрешить доступ только с офисной сети 192.168.1.0/24 и заблокировать всех остальных
<Directory /var/www/example.com/admin>
Require ip 192.168.1.0/24
</Directory>
# Альтернативный вариант с явным запретом
<Directory /var/www/example.com/private>
# Разрешить доступ с двух конкретных IP
Require ip 203.0.113.5 198.51.100.23
# Все остальные IP получат ошибку 403 Forbidden
Require all denied
</Directory>
Устаревший синтаксис с Order, Allow, Deny всё ещё поддерживается, но не рекомендуется для новых конфигураций.
Базовые правила mod_security для защиты веб-приложения
Установите и настройте mod_security для базовой защиты веб-приложений.
# Установка модуля в Debian/Ubuntu
sudo apt install libapache2-mod-security2
# Активация модуля
sudo a2enmod security2
# Основной конфигурационный файл находится в /etc/modsecurity/
# Рекомендуется использовать OWASP Core Rule Set (CRS)
sudo cp /usr/share/modsecurity-crs/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo cp /usr/share/modsecurity-crs/crs-setup.conf.example /etc/modsecurity/crs-setup.conf
# Включите базовые правила, раскомментировав в modsecurity.conf:
# SecRuleEngine On
# SecRequestBodyAccess On
# SecResponseBodyAccess On
Для диагностики проблем с ложными срабатываниями временно переключите режим работы модуля:
# В конфигурационном файле modsecurity.conf измените:
SecRuleEngine DetectionOnly
# Это позволит логировать подозрительные запросы без блокировки
Полное отключение модуля для диагностики выполняется командой:
sudo a2dismod security2
sudo systemctl reload apache2
Для комплексной защиты веб-серверов изучите наше практическое руководство по безопасности Nginx и Apache, где подробно разбираются настройки HTTPS, HSTS, CSP и защита от DDoS-атак.
Оптимизация производительности и удобства
Оптимизация Apache2 включает настройку сжатия контента, кеширования и создание человеко-читаемых URL. Модуль mod_rewrite решает задачи перенаправления и преобразования URL, mod_deflate сжимает передаваемые данные, а mod_headers управляет заголовками кеширования.
Сжатие текстового контента (HTML, CSS, JavaScript) сокращает объём передаваемых данных на 60-80%, что напрямую влияет на скорость загрузки страниц. Кеширование статических ресурсов на стороне клиента уменьшает количество запросов к серверу для повторных посещений.
Чистые URL и перенаправления с mod_rewrite
Модуль mod_rewrite позволяет создавать правила перезаписи URL для решения типовых задач.
# Активация модуля
sudo a2enmod rewrite
sudo systemctl reload apache2
# Примеры правил в конфигурации виртуального хоста или .htaccess
# 1. Редирект всего HTTP трафика на HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 2. Унификация домена: перенаправление с www на без www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
# 3. Базовое правило для WordPress (скрытие index.php)
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Для анализа производительности и сравнения с другими решениями обратитесь к статье «Nginx или Apache: практическое сравнение веб-серверов для проектов 2026», где приведены объективные метрики скорости обработки запросов и потребления ресурсов.
Сжатие контента и кеширование (mod_deflate и mod_headers)
Настройте сжатие GZIP для текстовых типов контента и кеширование статических файлов.
# Активация модулей
sudo a2enmod deflate
sudo a2enmod headers
sudo systemctl reload apache2
# Конфигурация сжатия в конфиге виртуального хоста
<IfModule mod_deflate.c>
# Включить сжатие для указанных типов контента
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/javascript application/x-javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xml application/rss+xml
# Исключить сжатие для старых браузеров
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>
# Настройка кеширования статических файлов
<IfModule mod_headers.c>
# Кеширование изображений на 1 месяц
<FilesMatch "\.(jpg|jpeg|png|gif|ico|svg)$">
Header set Cache-Control "public, max-age=2592000"
</FilesMatch>
# Кеширование CSS и JavaScript на 1 неделю
<FilesMatch "\.(css|js)$">
Header set Cache-Control "public, max-age=604800"
</FilesMatch>
# Кеширование шрифтов на 1 год
<FilesMatch "\.(woff|woff2|ttf|eot)$">
Header set Cache-Control "public, max-age=31536000"
</FilesMatch>
</IfModule>
Для детальной настройки сжатия и решения типичных проблем смотрите полное руководство по настройке Gzip-сжатия в Nginx и Apache с готовыми конфигурациями и методами проверки.
Логирование и диагностика для каждого виртуального хоста
Организация отдельного логирования для каждого виртуального хоста упрощает диагностику проблем и анализ трафика. Директивы ErrorLog и CustomLog определяют пути к файлам логов ошибок и доступа соответственно.
Формат combined для логов доступа включает информацию о клиенте, запросе, статусе ответа, размере данных и referrer. Ротация логов с помощью logrotate предотвращает заполнение дискового пространства и обеспечивает архивирование старых записей.
Типичные ошибки в логах Apache2:
- "Permission denied" - проблемы с правами доступа к файлам или директориям
- "File does not exist" - неверный путь в DocumentRoot или опечатка в URL
- "Client denied by server configuration" - ограничение доступа по IP или другим правилам
- "Invalid command 'SSLEngine'" - модуль mod_ssl не активирован
Настройка ротации логов в /etc/logrotate.d/apache2:
/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
if /etc/init.d/apache2 status > /dev/null ; then \
/etc/init.d/apache2 reload > /dev/null; \
fi;
endscript
}
Для эффективного анализа логов используйте готовые команды grep и awk из статьи «Практический анализ логов Nginx и Apache», которые помогают быстро находить ошибки, медленные запросы и признаки атак.
При необходимости ручной установки SSL-сертификатов обратитесь к пошаговому руководству по установке SSL-сертификатов на Nginx и Apache, где приведены безопасные конфигурации для TLS 1.3 и методы проверки в SSL Labs.
Для автоматизации работы с различными моделями искусственного интеллекта рассмотрите использование AiTunnel - агрегатора API, который предоставляет единый интерфейс для доступа к более чем 200 моделям нейросетей, включая GPT, Gemini и Claude, с оплатой в рублях без необходимости использования VPN.