Настройка HTTP/2 для 1С-Битрикс
Страница Битрикс при HTTP/1.1 открывает 6–8 параллельных TCP-соединений к одному домену и грузит JS и CSS последовательно внутри каждого. При 30–40 ресурсах на странице — это очередь ожидания. HTTP/2 мультиплексирует все запросы в одном соединении: браузер запрашивает 40 файлов одновременно, сервер отвечает без задержки подключения. На практике — 200–400 мс экономии на TTI (Time to Interactive).
Требования для HTTP/2
HTTP/2 работает только поверх TLS в браузерах (технически протокол допускает h2c — без шифрования, но ни один браузер это не поддерживает). Значит, нужен валидный SSL-сертификат.
Nginx поддерживает HTTP/2 начиная с версии 1.9.5. Проверить:
nginx -V 2>&1 | grep "http_v2"
# Должно быть: --with-http_v2_module
OpenSSL должен поддерживать ALPN:
nginx -V 2>&1 | grep "openssl"
openssl version
# OpenSSL 1.0.2+ поддерживает ALPN
Конфигурация Nginx для HTTP/2
В конфиге виртуального хоста:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.ru www.example.ru;
ssl_certificate /etc/ssl/certs/example.ru.crt;
ssl_certificate_key /etc/ssl/private/example.ru.key;
# Современные cipher suites (HTTP/2 запрещает устаревшие)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (после тестирования)
add_header Strict-Transport-Security "max-age=63072000" always;
# Оптимизация TLS
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
root /var/www/bitrix/public_html;
index index.php;
}
# Редирект HTTP -> HTTPS
server {
listen 80;
server_name example.ru www.example.ru;
return 301 https://$host$request_uri;
}
Server Push для критических ресурсов
HTTP/2 Server Push позволяет серверу отправить CSS и JS до того, как браузер разберёт HTML и запросит их сам. Для Битрикс это имеет смысл для главного CSS и основного JS-бандла.
В конфиге Nginx для Битрикс (предполагаем стандартную структуру /bitrix/):
location = / {
http2_push /bitrix/templates/.default/styles.css;
http2_push /bitrix/js/main/core/core.js;
http2_push /bitrix/themes/.default/icons/sm/logo.png;
}
Или через заголовок Link из PHP:
// В начале шаблона сайта, до вывода HTML
header('Link: </bitrix/templates/.default/styles.css>; rel=preload; as=style', false);
header('Link: </bitrix/js/main/core/core.js>; rel=preload; as=script', false);
Nginx при включённом http2_push_preload on автоматически преобразует Link: rel=preload заголовки в Server Push.
Оптимизация буферов для HTTP/2
HTTP/2 мультиплексирует потоки в одном TCP-соединении, что меняет поведение буферизации:
http {
# Для HTTP/2 можно уменьшить количество воркеров на подключение
# HTTP/2 keepalive дольше держит соединение
keepalive_timeout 65;
# Размер initial window для HTTP/2
http2_chunk_size 8k;
# Максимум одновременных потоков (запросов) в одном соединении
http2_max_concurrent_streams 128;
# Буферы для заголовков (HTTP/2 сжимает заголовки через HPACK)
http2_recv_buffer_size 256k;
}
Проверка работы HTTP/2
# Через curl
curl -I --http2 https://example.ru/
# В ответе должно быть: HTTP/2 200
# Детально с negotiation
curl -v --http2 https://example.ru/ 2>&1 | grep -E "HTTP/|ALPN"
# Chrome DevTools → Network → Protocol column: h2
Битрикс и CDN с HTTP/2
Если статика отдаётся через CDN (Cloudflare, собственный), убедиться что CDN поддерживает HTTP/2 между браузером и CDN. Соединение CDN → origin может быть HTTP/1.1 — это нормально, узкое место обычно браузер → CDN.
Типовая проблема: Mixed Content
После перехода на HTTPS + HTTP/2 Битрикс может генерировать ссылки вида http://... для статики. Это блокируется браузером как Mixed Content. Проверить в dbconn.php:
$_SERVER["HTTPS"] = "on";
define("SITE_SERVER_NAME", "example.ru");
И в настройках главного модуля Битрикс — «Использовать защищённое соединение (https)».







