Конфігурація 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
    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 для компанії ТЕХНОТОРГКОМПЛЕКС
    1161

Сервер із 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. Замовте налаштування під ключ і отримайте економію на серверних ресурсах від 10 000 до 30 000 гривень на місяць. Економія на серверних ресурсах після налаштування може досягати 40%, що при оренді сервера за 30 000 гривень на місяць становить 12 000 гривень економії.

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