Apache httpd и PHP-FPM: модули и расширения для продакшена (с учётом Bitrix)
Практический разбор модулей Apache и расширений PHP для продакшена: mod_rewrite, mpm_event, OPcache, intl, redis и другие. Что реально нужно для 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 — что реально нужно
- Логотип Apache HTTP Server (Wikipedia)
- Архитектура Apache worker MPM (ResearchGate)
- mod_rewrite: обратные ссылки (документация Apache)
- Синтаксис RewriteRule (документация Apache)
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 (Wikipedia)
- Схема работы PHP с веб-сервером (Storyblok)
- Важность кэширования opcode (Accesto)
- Производительность и кэширование (LinkedIn)
Переходим к 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.
Типовая схема продакшена
- Apache (mpm_event)
- mod_rewrite
- mod_ssl
- PHP-FPM
- OPcache
- Redis
- Правильные лимиты 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 падают
При обновлении ядра или модулей проверьте:
- Расширение 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)
Полезные ссылки по документации
- Apache mod_rewrite
- Apache mod_ssl
- Apache mod_deflate
- Apache mod_expires
- Apache + PHP-FPM
- PHP OPcache
- PHP-FPM configuration
- Bitrix: Redis, Memcache
Связанные статьи
-
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
Остальное — по ситуации.
Если сервер нагружен — сначала проверьте:
- OPcache
- FPM max_children
- Redis
- MPM event
И только потом имеет смысл браться за «оптимизацию кода».



Комментарии