← Назад в блог

Apache httpd и PHP-FPM: модули и расширения для продакшена (с учётом Bitrix)

Практический разбор модулей Apache и расширений PHP для продакшена: mod_rewrite, mpm_event, OPcache, intl, redis и другие. Что реально нужно для Bitrix.

Apache httpd и PHP-FPM: модули и расширения для продакшена (с учётом Bitrix)

Требования

  • Apache 2.4+
  • PHP 8.1+
  • Базовое понимание Linux и виртуальных хостов

Apache httpd и PHP-FPM: модули и расширения для продакшена (с учётом Bitrix)

Если вы работаете с Bitrix CMS, Laravel или чистым PHP — рано или поздно придётся разбираться, какие модули Apache и расширения PHP действительно нужны, а какие лишь мусор «на всякий случай».

Разберём:

  • полезные модули Apache httpd;
  • критичные расширения PHP для PHP-FPM;
  • что обязательно для Bitrix;
  • что даёт прирост производительности;
  • что лучше отключить.

Без теории ради теории. Только то, что реально влияет на прод.


Часть 1. Apache httpd — что реально нужно

1. MPM: prefork vs event

❌ Prefork (устаревший подход)

  • каждый запрос = отдельный процесс
  • много памяти
  • актуален только при использовании mod_php

Если вы используете PHP-FPM (а так и стоит делать), prefork не нужен.

✅ MPM event (рекомендуется)

  • потоковая модель
  • меньше памяти
  • лучше под нагрузкой

Включение:

a2dismod mpm_prefork
a2enmod mpm_event
systemctl restart apache2

Для Bitrix: На нагруженных проектах event + PHP-FPM даёт ощутимо лучшую стабильность.


2. mod_rewrite — без него никуда

Bitrix, Laravel, WordPress — все используют rewrite для ЧПУ и маршрутизации. Модуль использует PCRE-совместимые правила; описание директив — в официальной документации Apache mod_rewrite.

Базовый пример (запросы к несуществующим файлам и каталогам уходят в index.php):

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [L]
</IfModule>
  • !-f и !-d — условие: «если нет такого файла и нет такой директории» (см. RewriteCond).
  • Флаг [L] (Last) — остановить обработку правил после срабатывания.

Если приложение в подкаталоге (например, /bitrix-site/), нужен RewriteBase, иначе подстановка может дать неверный путь:

RewriteEngine On
RewriteBase /bitrix-site/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

Без mod_rewrite ЧПУ и «красивые» URL в Bitrix и других CMS не работают.


3. mod_ssl — HTTPS обязателен

Шифрование по TLS обеспечивает mod_ssl (опирается на OpenSSL). SSLv2 не поддерживается; для продакшена оставляют только современные протоколы.

Проверка, что модуль загружен:

apachectl -M | grep ssl

Минимальный фрагмент виртуального хоста с Let’s Encrypt (директивы SSLCertificateFile, SSLCertificateKeyFile):

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/example.com

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

    # Только TLS 1.2 и 1.3 (SSLv3 отключён в современных сборках)
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>

Рекомендуется также настроить SSLCipherSuite под актуальные рекомендации по безопасности. Bitrix без HTTPS — минус для SEO и безопасности; поисковики и браузеры помечают такие сайты как небезопасные.


4. mod_headers — контроль кэша и безопасности

mod_headers позволяет задавать и изменять HTTP-заголовки ответа. Для продакшена обычно выставляют заголовки безопасности и при необходимости — кэширование статики.

Безопасность (рекомендуемый минимум):

Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"

Кэширование статики Bitrix (картинки, CSS/JS в /upload/, /local/): можно ограничить время кэша в браузере, чтобы не перегружать сервер повторными запросами к тем же файлам:

<IfModule mod_headers.c>
    <FilesMatch "\.(ico|webp|jpe?g|png|gif|css|js|woff2?)$">
        Header set Cache-Control "public, max-age=2592000"
    </FilesMatch>
</IfModule>

max-age=2592000 — 30 дней; для часто меняющихся ресурсов значение уменьшают.


5. mod_deflate / mod_brotli — сжатие

mod_deflate сжимает ответы по алгоритму DEFLATE (gzip). Поддерживается только gzip-кодирование для совместимости со старыми клиентами. Рекомендуемая конфигурация из документации Apache — сжимать только указанные MIME-типы:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>

Не сжимайте уже сжатое (например, изображения в форматах с сжатием). На TLS-соединениях учитывайте риски класса атак BREACH при сжатии конфиденциального контента — для статики и типовых HTML/CSS/JS такая настройка безопасна.

Brotli (лучшая степень сжатия при сопоставимой скорости) — если в системе есть mod_brotli:

a2enmod brotli

Сжатие даёт заметное уменьшение трафика и ускорение загрузки страниц без изменения кода приложения.


6. mod_expires — кэширование статики

mod_expires выставляет заголовки Expires и Cache-Control: max-age по типу контента. Базовое время можно задать через access (от момента запроса) или modification (от даты изменения файла). Подробнее — в документации ExpiresByType.

Пример для типичной статики Bitrix (картинки, стили, скрипты):

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 month"

    ExpiresByType image/webp "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType font/woff2 "access plus 1 year"
</IfModule>

access plus 1 month означает: браузер может хранить копию 1 месяц с момента последнего запроса. Bitrix отдаёт много статики из /upload/ и шаблонов — корректные Expires снижают число запросов к серверу.


Часть 2. PHP-FPM — расширения, которые реально нужны

Переходим к PHP.

1. OPcache — обязательно

OPcache кэширует скомпилированный PHP-код (opcode) в памяти и значительно снижает нагрузку на CPU. Без него продакшен запускать не рекомендуется; настройка описана в официальной документации PHP и в Runtime Configuration.

Минимальная конфигурация для продакшена (в php.ini или в пуле PHP-FPM):

opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
  • validate_timestamps=0 — не проверять изменение файлов на диске (максимальная производительность). После выката кода перезапускайте PHP-FPM или используйте скрипт сброса кэша.
  • Если оставляете validate_timestamps=1, задайте opcache.revalidate_freq=2 (проверка не чаще чем раз в 2 секунды), чтобы не дергать диск на каждый запрос.

Для Bitrix: OPcache ускоряет и публичную часть, и админку, снижает CPU; на проде он обязателен.


2. intl — обязательно для Bitrix

Расширение intl (Internationalization) нужно для работы с локалью, форматированием дат, чисел и строк в Unicode. Bitrix активно использует его в ядре и при работе с мультиязычностью и датами.

Проверка:

php -m | grep intl

Установка (Debian/Ubuntu):

apt install php8.2-intl

Без intl возможны ошибки при выводе дат, сортировке строк с кириллицей и в модулях, зависящих от ICU.


3. mbstring — обязательно

Многобайтовые строки, русский язык — без mbstring никуда.


4. mysqli / pdo_mysql

Bitrix работает с MySQL/MariaDB через mysqli или PDO. Обычно одно из расширений уже включено в сборке PHP.

Проверка:

php -m | grep -E 'mysqli|pdo_mysql'

Если оба отключены — установите пакет, например: apt install php8.2-mysql.


5. redis — ускорение кэша Bitrix

Bitrix поддерживает Redis в качестве managed cache (вместо файлового или memcached). Настройка описана в документации Bitrix (подключения к Redis, Memcache).

Установка сервера и PHP-расширения:

apt install redis-server
apt install php8.2-redis
systemctl enable redis-server

В .settings.php (или в старом варианте в dbconn.php) задаётся тип кэша и параметры подключения:

'cache' => [
    'value' => [
        'type' => 'redis',
        'redis' => [
            'host' => '127.0.0.1',
            'port' => '6379',
        ],
    ],
],

После смены кэша в настройках ядра Bitrix нужно сбросить кэш (Настройки → Производительность → Очистить кэш). На нагруженных проектах Redis даёт заметное ускорение по сравнению с файловым кэшем.


6. memcached — альтернатива Redis

Работает, но Redis сейчас предпочтительнее.


7. curl — обязателен

API, CRM, 1С, внешние сервисы.

Без curl Bitrix-интеграции страдают.


8. zip

Bitrix обновления, архивы, маркетплейс.


9. gd / imagick

Обработка изображений.

Если проект с каталогом — imagick лучше.


Что лучше отключить

На продакшене отключают отладочные и избыточные опции.

В php.ini (или в конфиге пула FPM):

; Отладка — только в dev, на проде никогда
xdebug.mode = off

; Не выводить ошибки в ответ клиенту
display_errors = Off
display_startup_errors = Off

; Логировать ошибки в файл
log_errors = On
error_log = /var/log/php-fpm/error.log
  • Xdebug на проде отключают: он сильно замедляет выполнение и может раскрывать внутреннюю информацию.
  • display_errors = On на проде недопустим: пользователь не должен видеть стек вызовов и пути к файлам.
  • allow_url_fopen — включать только если приложению нужен доступ к внешним URL через fopen; при использовании curl часто оставляют Off и ограничивают поверхность атак.

Проверка отключённых функций (часто хостеры режут shell_exec, exec и т.п.):

php -r "var_dump(ini_get('disable_functions'));"

Продакшен — это минимум включённого и максимум контроля над тем, что реально используется.


Связка Apache и PHP-FPM

Чтобы Apache отдавал PHP-запросы в PHP-FPM, нужны модуль proxy_fcgi (и обычно proxy) и настройка проксирования. Пример для виртуального хоста (Unix-сокет):

<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>

Или через TCP (если FPM слушает порт):

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

Путь к сокету смотрите в конфиге пула FPM (например, в /etc/php/8.2/fpm/pool.d/www.conf: listen = /run/php/php8.2-fpm.sock). Подробнее — в документации Apache (PHP-FPM) и в описании mod_proxy_fcgi.


Оптимальные настройки PHP-FPM для Bitrix

Параметры пула задаются в /etc/php/8.2/fpm/pool.d/www.conf (или отдельном файле пула). Рекомендуемый режим — dynamic: число воркеров меняется в заданных пределах. Документация: php.net FPM configuration.

Пример:

pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500

Ориентир по памяти: если один PHP-процесс (Bitrix под нагрузкой) съедает около 100 МБ, то max_children = 30 — это до ~3 ГБ только на FPM. Учитывайте также Apache, MySQL, Redis и запас под пики — считайте под доступную RAM.


Типовая схема продакшена

  1. Apache (mpm_event)
  2. mod_rewrite
  3. mod_ssl
  4. PHP-FPM
  5. OPcache
  6. Redis
  7. Правильные лимиты FPM

И вот это уже прод, а не «работает на локалке».


Частые проблемы

1. 502 Bad Gateway

Apache не получает ответ от PHP-FPM. Возможные причины: FPM не запущен, закончились воркеры (max_children), таймаут при тяжёлом скрипте, неверный путь к сокету.

Проверка статуса и сокета:

systemctl status php8.2-fpm
ls -la /run/php/php8.2-fpm.sock

Проверка логов:

tail -f /var/log/apache2/error.log
tail -f /var/log/php8.2-fpm.log

Если 502 появляется под нагрузкой — увеличьте pm.max_children и убедитесь, что памяти хватает. При долгих запросах проверьте request_terminate_timeout в пуле FPM и таймауты в Apache (например, ProxyTimeout).


2. Медленная админка Bitrix

Типичные причины:

  • Нет OPcache — включите и перезапустите FPM.
  • Нет Redis — переведите managed cache на Redis в настройках ядра.
  • prefork вместо event — переключитесь на MPM event.
  • Маленький memory_limit — для тяжёлых страниц админки часто ставят 256M–512M.
  • Файловый кэш на медленном диске — замените на Redis.

Проверка OPcache в работе:

php -r "print_r(opcache_get_status(false));"

3. Обновления Bitrix падают

При обновлении ядра или модулей проверьте:

  • Расширение zipphp -m | grep zip.
  • Расширение intl — обязательно для Bitrix.
  • Права на файлы — владелец и группа должны совпадать с пользователем веб-сервера; каталоги с записью для обновления.
  • disable_functions — в списке не должно быть exec, shell_exec, proc_open и т.п., если обновление их использует (официальная документация Bitrix уточняет требования к окружению).

Сниппеты по теме


Полезные ссылки по документации


Связанные статьи


Итог

Если коротко:

Apache:

  • mpm_event
  • mod_rewrite
  • mod_ssl
  • mod_headers
  • mod_expires
  • mod_deflate / brotli

PHP:

  • opcache
  • intl
  • mbstring
  • mysqli
  • curl
  • redis
  • zip
  • gd / imagick

Остальное — по ситуации.

Если сервер нагружен — сначала проверьте:

  1. OPcache
  2. FPM max_children
  3. Redis
  4. MPM event

И только потом имеет смысл браться за «оптимизацию кода».

0 просмотров

Комментарии

Загрузка комментариев...
Пока нет комментариев. Будьте первым!