DEV Community

Андрей Викулов (VProger)
Андрей Викулов (VProger)

Posted on • Originally published at viku-lov.ru on

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

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

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

Enter fullscreen mode Exit fullscreen mode

Для Bitrix:

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


  1. 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>

Enter fullscreen mode Exit fullscreen mode
  • !-f и !-d — условие: «если нет такого файла и нет такой директории» (см. RewriteCond).
  • Флаг L — остановить обработку правил после срабатывания.

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


RewriteEngine On

RewriteBase /bitrix-site/

RewriteCond %{REQUEST\_FILENAME} !-f

RewriteCond %{REQUEST\_FILENAME} !-d

RewriteRule ^(.\*)$ index.php [L]

Enter fullscreen mode Exit fullscreen mode

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


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

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

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


apachectl -M | grep ssl

Enter fullscreen mode Exit fullscreen mode

Минимальный фрагмент виртуального хоста с 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>

Enter fullscreen mode Exit fullscreen mode

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


  1. 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"

Enter fullscreen mode Exit fullscreen mode

Кэширование статики 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>

Enter fullscreen mode Exit fullscreen mode

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


  1. 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>

Enter fullscreen mode Exit fullscreen mode

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

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


a2enmod brotli

Enter fullscreen mode Exit fullscreen mode

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


  1. 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>

Enter fullscreen mode Exit fullscreen mode

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

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

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


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

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

Проверка:


php -m | grep intl

Enter fullscreen mode Exit fullscreen mode

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


apt install php8.2-intl

Enter fullscreen mode Exit fullscreen mode

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


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

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


  1. mysqli / pdo_mysql

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

Проверка:


php -m | grep -E 'mysqli|pdo\_mysql'

Enter fullscreen mode Exit fullscreen mode

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


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

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

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


apt install redis-server

apt install php8.2-redis

systemctl enable redis-server

Enter fullscreen mode Exit fullscreen mode

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


'cache' => [

'value' => [

'type' => 'redis',

'redis' => [

'host' => '127.0.0.1',

'port' => '6379',

],

],

],

Enter fullscreen mode Exit fullscreen mode

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


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

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


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

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

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


  1. zip

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


  1. 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

Enter fullscreen mode Exit fullscreen mode
  • Xdebug на проде отключают: он сильно замедляет выполнение и может раскрывать внутреннюю информацию.
  • display_errors = On на проде недопустим: пользователь не должен видеть стек вызовов и пути к файлам.
  • allow_url_fopen — включать только если приложению нужен доступ к внешним URL через fopen; при использовании curl часто оставляют Off и ограничивают поверхность атак.

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


php -r "var\_dump(ini\_get('disable\_functions'));"

Enter fullscreen mode Exit fullscreen mode

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


Связка 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>

Enter fullscreen mode Exit fullscreen mode

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


<FilesMatch \.php$>

SetHandler "proxy:fcgi://127.0.0.1:9000"

</FilesMatch>

Enter fullscreen mode Exit fullscreen mode

Путь к сокету смотрите в конфиге пула 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

Enter fullscreen mode Exit fullscreen mode

Ориентир по памяти: если один 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

Enter fullscreen mode Exit fullscreen mode

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


tail -f /var/log/apache2/error.log

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

Enter fullscreen mode Exit fullscreen mode

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


  1. Медленная админка 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));"

Enter fullscreen mode Exit fullscreen mode

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

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

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

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

  • Apache mod_rewrite: front controller для Bitrix и Laravel
  • Apache: привязка PHP к PHP-FPM через SetHandler
  • OPcache: настройка для продакшена (php.ini)
  • Bitrix: настройка Redis для managed cache (.settings.php)

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


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

  • Backend-автоматизация:

https://viku-lov.ru/blog/backend-cron-bitrix-agents-automation

  • CI/CD для PHP и Bitrix:

https://viku-lov.ru/blog/cicd-php-bitrix-laravel-github-actions

  • WordPress и OPcache (актуально и для Bitrix):

https://viku-lov.ru/blog/wordpress-performance-2026-core-web-vitals-lcp-inp-cls-nginx-phpfpm-opcache-caching


Итог

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

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

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

Read more on viku-lov.ru

Top comments (0)