Конфигурация PHP-FPM для высоконагруженного 1С-Битрикс

Сервер с 8 ГБ RAM и 4-ядерным CPU под нагрузкой 50 одновременных пользователей тормозит до 5 секунд ответа. `top` — 95% CPU на php-fpm, swap забит. Дефолтная конфигурация PHP-FPM подходит для визиток, но не для Битрикса с его тяжёлой ORM и объектными кэшами. При такой нагрузке время генерации страни
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Конфигурация PHP-FPM для высоконагруженного 1С-Битрикс
Простой
~1 день

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1454
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    1017
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    759
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    879
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    802
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1162

Сервер с 8 ГБ RAM и 4-ядерным CPU под нагрузкой 50 одновременных пользователей тормозит до 5 секунд ответа. top — 95% CPU на php-fpm, swap забит. Дефолтная конфигурация PHP-FPM подходит для визиток, но не для Битрикса с его тяжёлой ORM и объектными кэшами. При такой нагрузке время генерации страницы может превышать 10 секунд, что катастрофически сказывается на пользовательском опыте.

Мы настраиваем PHP-FPM под Битрикс уже много лет — более 50 проектов за плечами. За это время выработали конфигурации, которые выдерживают 200+ одновременных пользователей на одном сервере. В этой статье — конкретные параметры и расчёты для типового проекта.

Почему дефолтный PHP-FPM не подходит для Битрикс?

Дефолтный пул обычно pm = dynamic с pm.max_children = 5. Для магазина на Битрикс с 50 пользователями этого мало — 5 воркеров блокируются медленными запросами, остальные ждут в очереди. Результат: Timeout 504. Оптимизированная конфигурация даёт прирост скорости в 2-3 раза по сравнению со стандартной.

Как рассчитать количество воркеров?

Формула: max_children = (Доступная RAM для PHP) / (Средний размер процесса). При 8 ГБ RAM, 2 ГБ под OS, 1 ГБ под MySQL: 5 ГБ / 120 МБ = ~41. Берём с запасом на рост — 30–35.

RAM сервера OS + MySQL Доступно PHP Размер процесса max_children
8 ГБ 3 ГБ 5 ГБ 120 МБ 30-35
16 ГБ 4 ГБ 12 ГБ 120 МБ 80-100
32 ГБ 8 ГБ 24 ГБ 120 МБ 160-200

Диагностика текущего состояния

Перед настройкой — снимок реальной картины:

# Количество 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 

Режимы управления процессами: dynamic подходит для переменной нагрузки — экономит память при простое, но тратит ресурсы на fork. static минимально задерживает запросы при стабильной нагрузке, но не адаптируется к спаду. ondemand экономит максимум при редких пиках, но вызывает задержки при старте. Для большинства Битрикс-проектов выбираем dynamic.

pm.max_requests = 1000 — перезапуск воркера после 1000 запросов предотвращает утечки памяти. Характерно для проектов с большим количеством сторонних PHP-модулей.

Как мы настраиваем PHP-FPM пошагово

  1. Аудит текущего состояния сервера с помощью команд ps, curl статуса пула.
  2. Расчёт pm.max_children на основе свободной памяти.
  3. Создание отдельных пулов для сайта, агентов и импорта 1С.
  4. Настройка php.ini с JIT, Memcached для сессий, OPcache.
  5. Конфигурация slowlog и мониторинга.
  6. Тестирование под нагрузкой.

Настройка 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.

Сравнение параметров PHP по умолчанию и оптимизированных:

Параметр Значение по умолчанию Оптимизированное Влияние
memory_limit 128M 256M Увеличение для тяжёлых страниц
upload_max_filesize 2M 256M Загрузка больших прайсов
session.save_handler files memcached Ускорение сессий в 10-20x
opcache.memory_consumption 128 256 Кэширование большего кода

Почему нужно разделять пулы для агентов и импорта 1С?

Рекомендуется разделять пулы:

  • 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, либо оптимизировать код.

Типичные ошибки при настройке PHP-FPM

  • Слишком маленький pm.max_children. Если max_children меньше количества параллельных запросов, запросы становятся в очередь. Решение — расчёт по формуле выше.
  • Отсутствие slowlog. Без slowlog вы не узнаете, какие запросы тормозят. Включаем request_slowlog_timeout = 5s.
  • Общий пул для всех задач. Импорт 1С и агенты должны иметь отдельные пулы, иначе пользовательские запросы блокируются.

Что входит в настройку под ключ

Мы предлагаем комплексную услугу по оптимизации PHP-FPM для 1С-Битрикс. В неё входит:

  • Аудит текущей конфигурации сервера и PHP
  • Расчёт оптимального количества воркеров и размера пулов
  • Настройка отдельных пулов для агентов и импорта
  • Оптимизация OPcache и JIT
  • Перенос сессий на Memcached или Redis
  • Настройка slowlog и мониторинга
  • Документация по конфигурации
  • Гарантия стабильной работы под нагрузкой

Свяжитесь с нами для бесплатного аудита вашей конфигурации PHP-FPM. Закажите настройку под ключ и получите экономию на серверных ресурсах от $100–300 в месяц. Экономия на серверных ресурсах после настройки может достигать 40%, что при аренде сервера за $270–390 в месяц составляет $110–160 экономии.

Читайте также Wikipedia: PHP-FPM и Официальная документация 1С-Битрикс по PHP для углублённого изучения.