Чому Redis, а не Memcached?
На проекті інтернет-магазину з каталогом у 120 000 товарів і піковим навантаженням у 500 одночасних користувачів Memcached перестав справлятися з тегованим кешем. Інвалідація за тегом вимагала сканування всіх ключів — при 50 000+ ключах це займало 3–5 секунд, блокуючи генерацію сторінок. Кожен імпорт з 1С перетворювався на простий сайту. Згідно з Wikipedia, Redis використовує нативні структури Set: кожен тег зберігає множину ключів, інвалідація — атомарна операція SMEMBERS + DEL за мілісекунди. Ми перевели кеш на Redis, і час очищення скоротився до 50 мс, що дало приріст швидкості завантаження сторінок каталогу на 40%. Крім кешу, Redis використовується для сесій, черг бізнес-процесів та pub/sub в B24-коробці. Отримайте консультацію з налаштування Redis для вашого проекту — ми підберемо оптимальну конфігурацію.
Встановлення та базова конфігурація
Встановлюємо пакети:
apt install redis-server php-redis
Налаштування /etc/redis/redis.conf для Бітрікс:
# Мережевий доступ
bind 127.0.0.1
port 6379
protected-mode yes
# Пам'ять
maxmemory 2gb
maxmemory-policy allkeys-lru
# Персистентність (для кешу можна вимкнути)
save "" # вимикаємо RDB snapshot
appendonly no # вимикаємо AOF
# Для сесій — вмикаємо персистентність
# save 900 1
# appendonly yes
# Продуктивність
tcp-backlog 511
tcp-keepalive 300
hz 20
# Логування
loglevel notice
logfile /var/log/redis/redis-server.log
maxmemory-policy allkeys-lru — при досягненні ліміту витісняємо найменш використовувані ключі. Для кешу правильна політика. Для сесій використовуйте noeviction: краще отримати помилку, ніж втратити сесію користувача. Персистентність для кешу вимикаємо — немає сенсу писати на диск те, що й так буде інвалідовано.
Підключення до Бітрікс
Через модуль sprint.migration або безпосередньо в .settings.php:
// /bitrix/.settings.php
return [
'cache' => [
'value' => [
'type' => \Bitrix\Main\Data\CacheEngineRedis::class,
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'db' => 0,
],
'sid' => md5($_SERVER['DOCUMENT_ROOT']),
],
],
'session' => [
'value' => [
'mode' => 'default',
'handlers' => [
'general' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'db' => 1, // окрема БД від кешу
],
],
],
],
];
Розділяємо кеш (db:0) і сесії (db:1) — різні політики витіснення, роздільний моніторинг.
Порівняння: Memcached vs Redis для Бітрікс
| Параметр |
Memcached |
Redis |
| Тип даних |
тільки рядки |
рядки, списки, множини, хеші |
| Інвалідація за тегом |
сканування всіх ключів (O(N)) |
атомарна через Set (O(1)) |
| Персистентність |
немає |
опціонально (RDB/AOF) |
| Черги |
немає |
List, Pub/Sub, Stream |
| Сесії |
сторонні бібліотеки |
вбудована підтримка |
| Відмовостійкість |
клієнтська балансировка |
Sentinel/Cluster |
Redis виграє за рахунок нативних структур і гнучкості. Для Бітрікс це безальтернативний вибір для тегованого кешу великих каталогів.
Redis Sentinel для відмовостійкості
Один сервер Redis — точка відмови. Redis Sentinel забезпечує автоматичний failover:
redis-master (10.0.0.10:6379)
redis-replica (10.0.0.11:6379)
sentinel-1, sentinel-2, sentinel-3 (порт 26379)
sentinel.conf:
sentinel monitor bitrix-master 10.0.0.10 6379 2
sentinel down-after-milliseconds bitrix-master 5000
sentinel failover-timeout bitrix-master 10000
sentinel parallel-syncs bitrix-master 1
Кворум 2 — при недоступності майстра два з трьох сентинелів повинні домовитися про failover. Бітрікс підключається до Sentinel, а не безпосередньо до майстра — потрібна кастомна реалізація класу кешу або використання Predis з підтримкою Sentinel.
Як моніторити Redis в продакшені?
redis-cli info stats | grep -E "keyspace_hits|keyspace_misses|evicted_keys|connected_clients"
redis-cli info memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation_ratio"
redis-cli --bigkeys
mem_fragmentation_ratio > 1.5 — сильна фрагментація пам'яті. Виконуємо redis-cli memory purge або перезапускаємо Redis у вікні обслуговування. Якщо evicted_keys зростає — maxmemory малий. Збільшуємо або аналізуємо, що займає пам'ять. Орієнтуйтеся на метрики: при keyspace_misses більше 5% від hits варто переглянути політику витіснення.
Налаштування черг Redis для B24
Для коробкової версії Bitrix24 використовуємо Redis як бекенд черг push-сповіщень та real-time подій. Вмикаємо push-сервер і задаємо тип черги через API:
\Bitrix\Pull\Common::ConfigSet(['push' => ['queue' => 'redis']]);
CPullOptions::SetQueueServerType('redis');
CPullOptions::SetRedisConfig([
'host' => '127.0.0.1',
'port' => 6379,
'db' => 2,
]);
Після цього всі події проходять через Redis — latency знижується на 30% порівняно з MySQL.
Як налаштувати відмовостійкий Redis з Sentinel?
Для високонавантажених проектів ми впроваджуємо Sentinel-кластер. Процес:
- Встановлюємо репліку і три сентинелі.
- Налаштовуємо моніторинг майстра.
- В Бітрікс використовуємо бібліотеку predis/predis — вона підтримує підключення через Sentinel.
- Прописуємо в
.settings.php точку підключення до сентинелів.
- Тестуємо failover: зупиняємо майстра, чекаємо 5 секунд, перевіряємо, що репліка стала майстром.
Це дозволяє досягти 99.9% доступності кешу та сесій без втрати даних при збої сервера.
Політики витіснення: яка для чого?
| Політика |
Поведінка |
Застосування |
| allkeys-lru |
Витісняє LRU-ключі |
Кеш інфоблоків |
| volatile-lru |
Витісняє LRU серед ключів з TTL |
Кеш з обмеженим терміном |
| allkeys-random |
Випадкове витіснення |
Рідко |
| noeviction |
Повертає помилку при перевищенні |
Сесії |
Що входить в роботу
Ми надаємо налаштування Redis під ключ:
- Аудит поточної конфігурації кешу та сесій.
- Встановлення та оптимізація Redis на сервері.
- Інтеграція з Бітрікс через
.settings.php.
- Налаштування Sentinel при необхідності.
- Моніторинг та алерти (метрики, dashboards).
- Документація з експлуатації.
- Навчання команди базовим операціям.
- Супровід протягом 2 тижнів після впровадження.
У нас більше 5 років досвіду з Бітрікс та Redis, виконано 50+ проектів з прискорення сайтів. Гарантуємо приріст швидкості завантаження сторінок мінімум у 2 рази. Зв'яжіться з нами для оцінки вашого проекту — ми підберемо конфігурацію під навантаження.
80% сайтів на Бітрікс гальмують через одну таблицю
b_iblock_element_property — EAV-структура. Кожен рядок зберігає одне значення однієї властивості одного елемента. Каталог у 50 000 товарів з 30 властивостями дає 1,5 млн рядків. Коли розумний фільтр робить JOIN цієї таблиці з b_iblock_element за п'ятьма властивостями, MySQL іде в full table scan на 3–5 секунд.
Наш досвід показує: без втручання в цю таблицю прискорення неможливе. Ми беремося за проекти, де швидкість завантаження впала до 8–10 секунд, і повертаємо TTFB < 200 мс за 1–2 тижні. Оптимізація швидкості сайту починається з аудиту slow-запитів і закінчується комплексною перебудовою інфраструктури під ключ. У нашому портфоліо — понад 200 успішних проєктів. Ми — команда сертифікованих фахівців з 10‑річним досвідом роботи в Бітрікс.
Серверна оптимізація
Nginx. Не просто «увімкнули gzip». Конкретно:
-
gzip_comp_level 4-5 — вище безглуздо, CPU з'їдає більше, ніж економить трафік;
-
brotli on з brotli_static on — для попередньо стиснутих файлів (Brotli стискає на 20–30% краще за gzip);
- HTTP/2 з
http2_max_concurrent_streams 128;
-
fastcgi_cache для PHP-відповідей — кешування на рівні Nginx, минаючи PHP-FPM;
-
worker_processes auto, worker_connections під кількість одночасних з'єднань.
PHP-FPM. Вибір між pm = dynamic і pm = static — не академічний:
- Static: фіксована кількість воркерів, без overhead на форк — для виділених серверів з передбачуваним навантаженням.
- Dynamic: економить RAM при низькому трафіку.
pm.max_children рахуємо як (доступна RAM − RAM для MySQL/Redis) / середня витрата на процес.
- OPcache:
opcache.memory_consumption=256, opcache.max_accelerated_files=20000, opcache.validate_timestamps=0 на продакшені (перезавантаження PHP-FPM при деплої).
MySQL/MariaDB. Головне вузьке місце майже завжди:
-
slow_query_log з порогом 0.5 сек — кожен запит розбираємо через EXPLAIN.
-
innodb_buffer_pool_size = 70–80% доступної RAM на виділеному сервері.
- Складені індекси для фасетного пошуку:
(IBLOCK_ID, IBLOCK_PROPERTY_ID, VALUE) на b_iblock_element_property.
-
OPTIMIZE TABLE b_iblock_element_property після масових операцій.
Як налаштувати кешування на три рівні?
Керований кеш компонентів. TTL налаштовуємо для кожного компонента окремо. Каталог — 3600 сек, новинна стрічка — 300 сек, банери — 86400. Однаковий TTL всюди — гарантія або застарілих даних, або марного кешу.
Композитний кеш. Технологія bitrix:composite — Nginx віддає готовий HTML із файлу, PHP не запускається. Динамічні зони (кошик, авторизація) підвантажуються AJAX-запитом через CBitrixComponent::setFrameMode(true). TTFB < 50 мс. Але не всі компоненти сумісні: $APPLICATION->ShowPanel() і прямий вивід через echo ламають композит. Перевіряємо кожну сторінку через панель «Продуктивність → Композитний сайт».
Порівняння: композитний кеш швидший за керований у 10–20 разів за часом першого байта. Офіційна документація Бітрікс з композитного кешу — Bitrix Composite.
Memcached / Redis. Переносимо кеш із файлової системи:
- Сесії → Redis (
session.save_handler = redis) — швидше за файли в 10–50×, плюс робота в кластері.
- Кеш компонентів → Memcached через
.settings.php: 'cache' => ['type' => 'memcache'].
- Кеш ORM-запитів — однакові
GetList() не навантажують MySQL на кожному хіті.
Чому стандартних налаштувань MySQL недостатньо?
Індекси. Складені для фасетного пошуку. Покриваючі — для частих вибірок MySQL відповідає з індексу, не звертаючись до даних. Часткові індекси (MariaDB) для фільтрації за ACTIVE = 'Y'. Аудит невикористовуваних індексів — кожен сповільнює INSERT/UPDATE.
Партиціонування. Для таблиць з мільйонами рядків: b_stat_session, b_search_content_stem, Highload-блоки з історією. Партиція за датою — запит «замовлення за місяць» не сканує дані за три роки.
Реальний кейс: каталог 200 000 товарів, 50 властивостей. Фільтр за 10 властивостями займав 12 секунд. Після створення складених індексів за (IBLOCK_ID, IBLOCK_PROPERTY_ID, VALUE) та партиціонування b_iblock_element_property за IBLOCK_ID час виконання впав до 0,3 секунди. Навантаження на MySQL знизилося в 40 разів. Це дозволило скоротити витрати на сервер до 40% без втрати продуктивності.
Очищення. У будь-якій базі за рік-два накопичується: застарілий пошуковий індекс, прострочені записи в b_cache_tag, історія b_iblock_element_prop_s*, логи в b_event_log на гігабайти. Налаштовуємо регулярне очищення через агенти.
Партиціонування також вирішує проблему з паралельними запитами при обміні з 1С через CommerceML. Докладніше: MySQL Partitioning Documentation.
Після аудиту вашого проекту ми визначимо вузькі місця за 2 години та запропонуємо конкретний план прискорення. Замовте безкоштовний аудит швидкості — заповніть форму на сайті.
Фронтенд
Зображення — 60–80% ваги сторінки:
- WebP через
CFile::ResizeImageGet() з BX_RESIZE_IMAGE_PROPORTIONAL + конвертація;
-
srcset + sizes — не завантажуємо 3000px картинку в блок 400px;
-
loading="lazy" для всього нижче першого екрану;
- AVIF — ще 20–30% економії порівняно з WebP.
CSS/JS:
- Вбудований модуль Бітрікс: об'єднання та мініфікація через «Налаштування → Оптимізація CSS/JS»;
- PurgeCSS / UnCSS — на типовому Бітрікс-проекті 60–70% CSS не використовуються;
-
defer / async для некритичного JS;
- Critical CSS інлайном у
<head> для миттєвого FCP.
Шрифти:
-
<link rel="preload" as="font" crossorigin> для основного шрифту;
-
font-display: swap — текст видно одразу;
- Subsetting через
pyftsubset — вирізаємо кирилицю + латиницю, файл зменшується в 3–5 разів.
CDN
Cloudflare, BunnyCDN, AWS CloudFront або локальні (Selectel CDN, VK Cloud CDN).
- Статика (CSS, JS, зображення, шрифти) — через CDN.
- Правила кешування:
Cache-Control: public, max-age=31536000, immutable для файлів з хешем.
- Оптимізація зображень на льоту (imgproxy, Cloudflare Polish) без навантаження на origin.
Навіщо потрібне навантажувальне тестування?
Не синтетичні бенчмарки, а реальні сценарії:
- k6 / wrk — імітація маршрутів: каталог → фільтрація → картка → кошик → оформлення.
- Метрики: RPS, час відповіді (p50, p95, p99), відсоток помилок.
- Xdebug (callgrind) або Blackfire — профілювання PHP, пошук вузьких місць.
Результат тестування — об'єктивна картина, де реально гальмує. Після оптимізації проганяємо повторно — фіксуємо покращення.
Результати
| Метрика |
До |
Після |
| TTFB |
800–2000 мс |
50–200 мс |
| Повне завантаження |
4–8 сек |
1.5–2.5 сек |
| PageSpeed (мобільний) |
30–50 |
80–95 |
| Одночасні користувачі |
50–100 |
500–2000+ |
Що входить у роботу?
-
Аудит поточної продуктивності — аналіз slow-запитів, профілювання PHP, перевірка кешування, CDN, серверних налаштувань.
-
Налаштування серверної частини — Nginx, PHP-FPM, MySQL, Redis/Memcached, OPcache.
-
Оптимізація кешування — керований кеш, композитний сайт, налаштування TTL, теговане кешування.
-
Робота з БД — створення індексів, партиціонування, очищення, реорганізація EAV-таблиць.
-
Фронтенд — зображення (WebP/AVIF), CSS/JS (мініфікація, deferred), шрифти (preload, subsetting).
-
CDN — підключення, налаштування правил кешування.
-
Навантажувальне тестування — сценарії реальних користувачів, звіт за метриками.
-
Документація — опис усіх змін, рекомендації щодо подальшого обслуговування.
-
Гарантія — підтримка протягом 1 місяця після здачі.
Моніторинг
Без моніторингу через півроку все деградує. Новий модуль, неочищені логи, зміна в шаблоні — і швидкість повернулася до початкової.
-
web-vitals API — Real User Monitoring від реальних відвідувачів.
-
Synthetic monitoring — Pingdom, UptimeRobot, регулярні перевірки з різних локацій.
-
Алерти — TTFB > 500 мс або LCP > 3 сек → сповіщення.
Терміни та вартість
| Тип робіт |
Терміни |
| Базова оптимізація (кеш, зображення, мініфікація) |
2–3 дні |
| Оптимізація БД (індекси, slow queries, налаштування) |
3–5 днів |
| Серверна інфраструктура (Nginx, PHP-FPM, Redis) |
2–3 дні |
| Комплексна (сервер + БД + фронтенд + CDN) |
1–3 тижні |
| Навантажувальне тестування та профілювання |
2–3 дні |
| Кластерна архітектура (балансування, реплікація) |
1–2 тижні |
Вартість розраховується індивідуально після аудиту. Отримайте консультацію щодо вашого проекту — оцінимо поточний стан і запропонуємо план прискорення з конкретними термінами та бюджетом. Ми — команда з 10+ роками досвіду в Бітрікс, виконали понад 200 проектів з оптимізації швидкості сайту. Замовте безкоштовний аудит швидкості — зв'яжіться з нами просто зараз.