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)
- 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 даёт ощутимо лучшую стабильность.
- 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 — остановить обработку правил после срабатывания.
Если приложение в подкаталоге (например, /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 не работают.
- 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 и безопасности; поисковики и браузеры помечают такие сайты как небезопасные.
- 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 дней; для часто меняющихся ресурсов значение уменьшают.
- 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
Сжатие даёт заметное уменьшение трафика и ускорение загрузки страниц без изменения кода приложения.
- 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.
- 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; на проде он обязателен.
- intl — обязательно для Bitrix
Расширение intl (Internationalization) нужно для работы с локалью, форматированием дат, чисел и строк в Unicode. Bitrix активно использует его в ядре и при работе с мультиязычностью и датами.
Проверка:
php -m | grep intl
Установка (Debian/Ubuntu):
apt install php8.2-intl
Без intl возможны ошибки при выводе дат, сортировке строк с кириллицей и в модулях, зависящих от ICU.
- mbstring — обязательно
Многобайтовые строки, русский язык — без mbstring никуда.
- mysqli / pdo_mysql
Bitrix работает с MySQL/MariaDB через mysqli или PDO. Обычно одно из расширений уже включено в сборке PHP.
Проверка:
php -m | grep -E 'mysqli|pdo\_mysql'
Если оба отключены — установите пакет, например: apt install php8.2-mysql.
- 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 даёт заметное ускорение по сравнению с файловым кэшем.
- memcached — альтернатива Redis
Работает, но Redis сейчас предпочтительнее.
- curl — обязателен
API, CRM, 1С, внешние сервисы.
Без curl Bitrix-интеграции страдают.
- zip
Bitrix обновления, архивы, маркетплейс.
- 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
И вот это уже прод, а не «работает на локалке».
Частые проблемы
- 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).
- Медленная админка 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));"
- Обновления 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):
Итог
Если коротко:
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
И только потом имеет смысл браться за «оптимизацию кода».

Top comments (0)