Подробный гайд: Apache2: Документация для разработчиков

Полное руководство по Apache2 для разработчиков: настройка виртуальных хостов, mod_rewrite, PHP-FPM, оптимизация и безопасность

2026.07.23                  


Подробный гайд: Apache2: Документация для разработчиковПодробный гайд: 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).

  1. Установите модуль: sudo apt install libapache2-mod-php
  2. Убедитесь, что включен 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

Важно:

  1. Выбирайте mpm_event для отдачи статики или mpm_prefork для классической работы с PHP через mod_php.
  2. Используйте mod_rewrite для красивых URL и маршрутизации внутри приложения.
  3. Переносите правила из .htaccess в <Directory> в конфиге виртуального хоста для ускорения работы.
  4. Всегда проверяйте синтаксис командой apachectl -t перед перезагрузкой.
  5. Используйте mod_headers для настройки CORS и безопасности, а не пишите это в коде приложения (если это возможно).

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Денис Аверко @Nymexis г. Омск

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта