Настройка WebP-конвертации изображений 1С-Битрикс
На типовом интернет-магазине Битрикс страница каталога грузит 40–80 изображений. JPEG и PNG весят в сумме 2–5 МБ — это секунды задержки на мобильном соединении. WebP при сопоставимом качестве даёт 25–35% выигрыша по размеру. Проблема в том, что «включить WebP» в Битриксе — не одна кнопка, а связка из нескольких механизмов, каждый из которых может молча не работать.
Как Битрикс обрабатывает изображения
Ядро использует модуль main (класс CFile) для хранения файлов и модуль resize_image для генерации превью. Физически ресайзер вызывается через \Bitrix\Main\Web\Image или через старый API CFile::ResizeImageFile(). Результаты кешируются в bitrix/cache/resize_cache/ с хешированными именами папок.
WebP-конвертация в Битриксе реализована двумя путями:
Путь 1 — серверная конвертация через PHP. Библиотека GD или Imagick конвертирует при ресайзе. Настраивается в bitrix/php_interface/dbconn.php или через административный интерфейс в разделе «Производительность».
Путь 2 — конвертация на уровне веб-сервера. Nginx/Apache отдаёт .webp-версию вместо оригинала, если браузер поддерживает формат (заголовок Accept: image/webp). Файлы конвертируются заранее — скриптом или демоном.
Настройка серверной конвертации
Проверка GD и Imagick
php -r "echo gd_info()['WebP Support'] ? 'WebP OK' : 'WebP NOT supported';"
php -r "echo (new Imagick())->queryFormats('WEBP') ? 'Imagick WebP OK' : 'fail';"
Если GD собран без WebP — нужен libwebp-dev и пересборка, либо переход на Imagick. На Bitrix VM проблем обычно нет — там Imagick с WebP идёт из коробки.
Конфигурация в Битриксе
В файле /bitrix/php_interface/dbconn.php добавляем:
define("BX_USE_MYSQLI", true);
define("CACHED_b_file", 3600);
Включение WebP в модуле resize — через настройки модуля main:
\Bitrix\Main\Config\Option::set('main', 'use_webp', 'Y');
\Bitrix\Main\Config\Option::set('main', 'webp_quality', '85');
После этого \Bitrix\Main\Web\Image::resize() будет возвращать .webp если клиент поддерживает формат. Проверить можно в таблице b_file — поле CONTENT_TYPE у новых превью должно быть image/webp.
Конвертация на уровне Nginx
Это производительнее: PHP не тратит CPU на конвертацию в момент запроса. Схема: при первом запросе генерируем .webp-версию рядом с оригиналом, Nginx проверяет её наличие и отдаёт если браузер поддерживает.
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
server {
location ~* ^/upload/.*\.(png|jpg|jpeg)$ {
add_header Vary Accept;
try_files $uri$webp_suffix $uri =404;
}
}
Предварительная конвертация скриптом cwebp:
find /var/www/bitrix/upload -name "*.jpg" -o -name "*.png" | \
xargs -P4 -I{} sh -c 'cwebp -q 82 "$1" -o "$1.webp" 2>/dev/null' _ {}
Запускать через cron раз в час для новых файлов — по дате изменения через find -newer.
Инвалидация кеша превью
После включения WebP старые превью в bitrix/cache/resize_cache/ остаются в JPEG/PNG. Нужно их удалить:
rm -rf /var/www/bitrix/bitrix/cache/resize_cache/*
Или через административную панель: «Управление сайтом» → «Производительность» → «Очистить кеш». После этого превью регенерируются при первом обращении — можно прогреть curl-скриптом по sitemap.
Типовые проблемы
WebP генерируется, но браузер получает JPEG. Nginx не передаёт заголовок Vary: Accept — CDN или кеширующий прокси отдаёт закешированную версию без учёта типа браузера.
Размер WebP больше оригинала. Бывает на мелких иконках (до 10×10 px) и PNG с малым количеством цветов. Стоит добавить проверку: если WebP больше оригинала на 10%, отдавать оригинал.
Ошибки в b_event_log. При включённой конвертации и отсутствии прав на запись в upload/ — Битрикс пишет ошибки. Проверить chown на директорию upload/ от имени пользователя веб-сервера.







