Настройка PHP-FPM для 1С-Битрикс
Настройка PHP-FPM для 1С-Битрикс
Сервер с 8 ГБ RAM и 4-ядерным CPU под нагрузкой 50 одновременных пользователей начинает отвечать за 3–5 секунд. top показывает 95% CPU на php-fpm процессах и swap. Дефолтная конфигурация PHP-FPM рассчитана на минимальное потребление памяти, а не на highload. Для Битрикс — с его тяжёлыми объектными моделями и ORM — это неприемлемо.
Диагностика текущего состояния
Перед настройкой — снимок реальной картины:
# Количество php-fpm процессов и их статус
ps aux | grep php-fpm | grep -v grep | wc -l
# Потребление памяти на один процесс
ps aux --sort=-%mem | grep php-fpm | head -5 | awk '{print $6/1024 " MB"}'
# Статус пула через status-страницу
curl -s http://127.0.0.1/php-fpm-status?full
Типичная картина: 20–30 PHP-FPM воркеров по 80–150 МБ каждый. 30 * 120 МБ = 3.6 ГБ только на PHP при 8 ГБ RAM.
Настройка пула
Конфигурационный файл пула /etc/php/8.1/fpm/pool.d/bitrix.conf:
[bitrix]
user = bitrix
group = bitrix
listen = /run/php/php8.1-fpm-bitrix.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; Управление процессами
pm = dynamic
pm.max_children = 30
pm.start_servers = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 1000
; Таймауты
request_terminate_timeout = 120s
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log
; Статус
pm.status_path = /php-fpm-status
Расчёт pm.max_children:
max_children = (Доступная RAM для PHP) / (Средний размер процесса)
При 8 ГБ RAM, 2 ГБ под OS, 1 ГБ под MySQL: 5 ГБ / 120 МБ = ~41. Берём с запасом на рост — 30–35.
pm = dynamic vs pm = static: dynamic экономит память при низкой нагрузке. static предпочтительнее при стабильно высокой нагрузке — нет накладных расходов на fork новых процессов.
pm.max_requests = 1000: перезапуск воркера после 1000 запросов предотвращает утечки памяти. Характерно для проектов с большим количеством сторонних PHP-модулей.
Настройка PHP для Битрикс
/etc/php/8.1/fpm/php.ini (критичные для Битрикс параметры):
; Память
memory_limit = 256M
; Время выполнения
max_execution_time = 90
max_input_time = 60
; Загрузка файлов (для загрузки изображений и прайсов)
upload_max_filesize = 256M
post_max_size = 256M
max_file_uploads = 50
; Сессии
session.gc_maxlifetime = 3600
session.save_handler = memcached
session.save_path = "127.0.0.1:11211"
; OPcache
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 60
opcache.jit = tracing
opcache.jit_buffer_size = 64M
; Отключаем опасные функции
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
session.save_handler = memcached — сессии в памяти вместо файловой системы. Критично при нескольких серверах (кластер) и ускоряет доступ к сессиям в 10–20 раз.
opcache.jit = tracing — JIT-компилятор PHP 8.0+. Для Битрикс с его процедурным кодом даёт 10–30% прирост CPU.
Отдельные пулы для разных задач
Рекомендуется разделять пулы:
bitrix.conf — основной сайт, 30 воркеров, 256M memory
agents.conf — агенты Битрикс, 3–5 воркеров, 512M memory, longer timeout
import.conf — импорт 1С, 1–2 воркера, 1G memory, 300s timeout
Агенты и импорт 1С не должны конкурировать с пользовательскими запросами за воркеры. Без разделения пул для импорта может занять все 30 слотов на время обработки прайса.
Мониторинг
# Смотрим статус в реальном времени
watch -n1 'curl -s http://127.0.0.1/php-fpm-status | grep -E "active|idle|total"'
Если active processes стабильно равен max_children — пул переполнен, запросы ставятся в очередь. Нужно либо увеличить max_children, либо оптимизировать код.







