Подробный гайд: Apache2: Документация для разработчиков
Подробный гайд Apache2: Документация для разработчиков
1. Архитектура и MPM (Multi-Processing Modules)
Прежде чем писать конфиги, важно понять, как Apache обрабатывает запросы. За это отвечают MPM. Выбор правильного MPM критичен для производительности и совместимости с модулями.
* mpm_prefork:
Каждый запрос обрабатывается отдельным процессом. Не использует потоки.
Минус:
Высокое потребление RAM.
Плюс:
Обязательный выбор, если вы используете классический mod_php (не потокобезопасный).
* mpm_worker:
Гибридная модель. Несколько процессов, каждый с несколькими потоками. Экономит память.
* mpm_event (Рекомендуется для статики):
Улучшенная версия worker. Использует асинхронную обработку (keep-alive соединения не блокируют потоки). Идеален для отдачи статики и высоконагруженных приложений.
Как переключить (Ubuntu/Debian):
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2
2. Структура конфигурации (Debian/Ubuntu)
В Debian-системах конфиг модульный, что удобно для разработчиков.
/etc/apache2/apache2.conf— глобальные настройки./etc/apache2/ports.conf— порты, которые слушает сервер./etc/apache2/sites-available/— файлы виртуальных хостов (VirtualHost)./etc/apache2/sites-enabled/— симлинки на включенные хосты./etc/apache2/mods-available/иmods-enabled/— аналогично для модулей.
3. Виртуальные хосты (VirtualHost)
Это основа настройки доменов. Разберем современный, production-ready шаблон.
<VirtualHost *:80>
ServerName myapp.dev
ServerAlias www.myapp.dev
ServerAdmin webmaster@myapp.dev
DocumentRoot /var/www/myapp/public
# Настройки для директории (Файловая система)
<Directory /var/www/myapp/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Логирование
ErrorLog ${APACHE_LOG_DIR}/myapp_error.log
CustomLog ${APACHE_LOG_DIR}/myapp_access.log combined
# Отдача статики напрямую (без передачи в интерпретатор)
<LocationMatch "^/(assets|bundles|uploads)/">
Require all granted
# Кэширование статики на 1 месяц
Header set Cache-Control "max-age=2592000, public"
</LocationMatch>
</VirtualHost>
Важное отличие для разработчиков:
<Directory /путь/на/диске>— применяется к файловой системе.<Location /url-путь>— применяется к URL-пространству (удобно для настройки заголовков, редиректов или ограничений доступа для конкретных маршрутов, даже если физического файла нет).
4. Ключевые модули для разработчика
4.1. mod_rewrite (ЧПУ и редиректы)
Самый используемый модуль. Включается: sudo a2enmod rewrite.
Пример 1: Редирект с HTTP на HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Пример 2: Маршрутизация для SPA / Laravel / Symfony (Front Controller)
RewriteEngine On
# Если запрос не к реальному файлу или директории
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Передаем всё в index.php
RewriteRule ^(.*)$ index.php [QSA,L]
4.2. mod_headers (Безопасность и CORS)
Включаем: sudo a2enmod headers.
Настройка CORS:
<IfModule mod_headers.c>
SetEnvIf Origin "http(s)?://(www\.)?(example\.com|otherdomain\.com)$" CORS_ALLOW=$0
Header always set Access-Control-Allow-Origin %{CORS_ALLOW}e env=CORS_ALLOW
Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE"
Header always set Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With"
</IfModule>
Security 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"
5. Интеграция с PHP (Классический подход через mod_php)
Если мы не используем внешние процесс-менеджеры и модули связи, Apache обрабатывает PHP встроенными силами через mod_php (libapache2-mod-php).
- Установите модуль:
sudo apt install libapache2-mod-php - Убедитесь, что включен
mpm_prefork(так как стандартныйmod_phpне потокобезопасен).
3. Настройте VirtualHost:
<VirtualHost *:80>
ServerName myapp.dev
DocumentRoot /var/www/myapp/public
<Directory /var/www/myapp/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Указываем Apache обрабатывать .php файлы встроенным интерпретатором
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
# Запрет выполнения PHP в директории загрузок (безопасность)
<Directory /var/www/myapp/public/uploads>
<FilesMatch \.php$>
Require all denied
</FilesMatch>
</Directory>
</VirtualHost>
Этот подход максимально прост для локальной разработки и небольших проектов, так как не требует настройки отдельных пулов процессов.
6. .htaccess vs Основной конфиг
Файл .htaccess позволяет применять настройки без перезагрузки Apache.
Минусы:
Apache читает этот файл при каждом запросе к директории, что снижает производительность.
Best Practice для разработчиков:
Если у вас есть доступ к основному конфигу (а на VPS он у вас есть), перенесите правила из .htaccess в секцию <Directory> в VirtualHost.
Если вы используете .htaccess, убедитесь, что в основном конфиге для этой директории указано AllowOverride All (или конкретные директивы, например AllowOverride FileInfo для mod_rewrite).
7. Оптимизация производительности
7.1. Сжатие (Gzip/Brotli)
Включаем: sudo a2enmod deflate
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
</IfModule>
7.2. Кэширование на стороне клиента
Включаем: sudo a2enmod expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
8. Отладка и Логирование
Когда приложение падает или работает не так, смотрите логи.
* Где смотреть:
/var/log/apache2/error.log и access.log.
Уровень логирования: В apache2.conf или VirtualHost можно задать LogLevel.
warn(по умолчанию)info(показывает больше деталей)debug(очень много информации)trace1-trace8(для глубокой отладки модулей, например,mod_rewrite).
Пример отладки Rewrite:
RewriteEngine On
# В Apache 2.4 используется:
LogLevel alert rewrite:trace3
9. Шпаргалка полезных команд (CLI)
# Проверка синтаксиса конфигурации (ОБЯЗАТЕЛЬНО перед рестартом)
sudo apache2ctl configtest
# или
sudo apachectl -t
# Показать все активные виртуальные хосты и порты (очень полезно при дебаге)
sudo apache2ctl -S
# Включить/выключить модуль
sudo a2enmod <module_name>
sudo a2dismod <module_name>
# Включить/выключить сайт (создает/удаляет симлинк в sites-enabled)
sudo a2ensite <site_name.conf>
sudo a2dissite <site_name.conf>
# Перезагрузка без обрыва активных соединений (Graceful restart)
sudo systemctl reload apache2
10. SSL/TLS (HTTPS)
Для разработчика проще всего использовать Certbot. Он сам настроит mod_ssl, получит сертификаты Let's Encrypt и добавит редиректы.
sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d myapp.dev -d www.myapp.dev
Важно:
- Выбирайте
mpm_eventдля отдачи статики илиmpm_preforkдля классической работы с PHP черезmod_php. - Используйте
mod_rewriteдля красивых URL и маршрутизации внутри приложения. - Переносите правила из
.htaccessв<Directory>в конфиге виртуального хоста для ускорения работы. - Всегда проверяйте синтаксис командой
apachectl -tперед перезагрузкой. - Используйте
mod_headersдля настройки CORS и безопасности, а не пишите это в коде приложения (если это возможно).
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.