Налаштування HTTP/2 для 1С-Bitrix
Сторінка Bitrix при 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 та запросить їх сам. Для Bitrix це має сенс для основного CSS та основного JS-бандла.
У конфігу Nginx для Bitrix (припускаючи стандартну структуру /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
Bitrix та CDN з HTTP/2
Якщо статика віддається через CDN (Cloudflare, власний), переконайтесь, що CDN підтримує HTTP/2 між браузером та CDN. З'єднання CDN → origin може бути HTTP/1.1 — це нормально, вузьке місце зазвичай браузер → CDN.
Типова проблема: Mixed Content
Після переходу на HTTPS + HTTP/2 Bitrix може генерувати посилання на кшталт http://... для статики. Це блокується браузером як Mixed Content. Перевірте у dbconn.php:
$_SERVER["HTTPS"] = "on";
define("SITE_SERVER_NAME", "example.ru");
І в налаштуваннях головного модуля Bitrix — «Використовувати захищене з'єднання (https)».







