HTTP/2 и HTTP/3 в Nginx: настройка и реальный выигрыш
HTTP/2 ускоряет загрузку за счёт мультиплексирования, а HTTP/3 переносит транспорт на QUIC и лучше переживает потери пакетов. Разбираем настройку Nginx 1.25.1+, совместную работу протоколов и способы измерить результат.

HTTP/2 и HTTP/3 не ускоряют сайт автоматически: без правильного TLS, открытого UDP-порта и измерений можно лишь добавить второй протокол и усложнить диагностику. Ниже — практическая схема для Nginx Open Source 1.25.1 и новее: включаем HTTP/2, добавляем HTTP/3, оставляем запасной вход по HTTP/2 и проверяем, какой протокол реально использует браузер.
Что меняется между HTTP/2 и HTTP/3
HTTP/2 работает поверх TCP. Несколько запросов идут внутри одного соединения, поэтому браузеру не нужно открывать отдельный TCP-канал для каждого ресурса. Это уменьшает число соединений и особенно помогает страницам с большим количеством CSS, JavaScript и изображений.
HTTP/3 использует QUIC поверх UDP. QUIC объединяет транспорт и шифрование TLS 1.3, а потеря одного пакета не блокирует все остальные независимые потоки. Поэтому преимущество заметнее на мобильной сети, при смене Wi‑Fi и при высокой задержке, а не в локальной сети с быстрым стабильным каналом.
| Протокол | Транспорт | Что выигрываете | Цена |
|---|---|---|---|
| HTTP/1.1 | TCP | Максимальная совместимость | Очереди запросов и больше соединений |
| HTTP/2 | TCP + TLS | Мультиплексирование, сжатие заголовков | Потеря TCP-пакета может задержать несколько потоков |
| HTTP/3 | QUIC + UDP + TLS 1.3 | Меньше задержек при потерях и смене сети | Нужны UDP 443, поддержка клиента и сборка Nginx с HTTP/3 |
HTTP/3 — не замена HTTP/2, а дополнительный маршрут. Надёжная схема оставляет оба протокола доступными и позволяет клиенту выбрать подходящий.
Мультиплексирование — передача нескольких независимых запросов в одном соединении без обязательной очереди «один запрос за другим».
Что проверить до настройки
Пример ниже рассчитан на Nginx 1.25.1+ с директивой http2 on;. Модуль HTTP/3 появился в ветке Nginx 1.25.0, но наличие директивы ещё не означает, что конкретный пакет собран с поддержкой QUIC.
- Узнайте версию:
nginx -vи параметры сборки:nginx -V. - Проверьте, что сертификат и ключ уже настроены для HTTPS. HTTP/2 и HTTP/3 не включают на обычном HTTP-порту.
- Откройте TCP 443 для HTTPS и UDP 443 для QUIC. Если UDP заблокирован firewall, HTTP/3 не установит соединение.
- Убедитесь, что пакет содержит модуль HTTP/3. Если в сборке нет поддержки QUIC, потребуется пакет или сборка, соответствующая официальной документации Nginx.
- Сохраните резервную копию конфигурации и проверьте её командой
nginx -tдо перезагрузки.
Как включить HTTP/2
В актуальной конфигурации директива http2 on; находится внутри HTTPS-сервера. Она применяется к этому виртуальному хосту, а не ко всему Nginx.
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
http2 on;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Пути к сертификатам замените на свои. После изменения выполните nginx -t, затем перезагрузите конфигурацию штатным способом вашей системы. В старых версиях Nginx встречается синтаксис listen 443 ssl http2;; он нужен для совместимости со старыми версиями, но не смешивайте оба варианта в одном сервере без необходимости.
Как добавить HTTP/3 и не потерять HTTP/2
Добавьте QUIC-прослушивание к тому же HTTPS-серверу. Важны три детали: параметр quic, UDP-порт 443 и заголовок Alt-Svc. Заголовок сообщает поддерживающему клиенту, что тот же сайт доступен по HTTP/3.
server {
listen 443 ssl;
listen 443 quic reuseport;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.3;
http2 on;
add_header Alt-Svc 'h3=":443"; ma=86400' always;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
HTTP/3 требует TLS 1.3, поэтому в этом сервере не оставляйте TLS 1.2 как единственный доступный вариант. HTTP/2 при этом продолжит работать через TCP. Параметр reuseport позволяет нескольким рабочим процессам принимать QUIC-пакеты; если ваша сборка или окружение не поддерживает его, сначала проверьте документацию версии Nginx, а не удаляйте параметр вслепую.
После проверки конфигурации убедитесь, что сетевой экран пропускает UDP 443. В контейнере или за облачным балансировщиком этот порт нужно открыть не только на сервере, но и на внешнем уровне. Если UDP недоступен, клиент обычно откатится к HTTP/2, но это не означает, что HTTP/3 настроен правильно.
Как понять, есть ли выигрыш
Сравнивайте один и тот же URL, с тем же кэшем и тем же регионом клиента. Не сравнивайте первый визит без кэша с повторным визитом: результат исказят DNS, TLS, CDN и уже загруженные ресурсы.
- Проверьте согласование HTTP/2:
curl --http2 -I https://example.com/. В ответе должна быть строка статуса, а команда не должна завершаться ошибкой TLS. - Проверьте HTTP/3:
curl --http3 -I https://example.com/. Эта возможность есть только в сборке curl с поддержкой HTTP/3. - Откройте DevTools браузера, включите колонку Protocol и перезагрузите страницу. Для запросов будут видны значения вроде
h2илиh3. - Добавьте в access log протокол и сравнивайте долю запросов по нему. В Nginx переменная
$server_protocolпоказывает согласованный HTTP-протокол.
log_format protocol '$remote_addr $host "$request" $status '
'$body_bytes_sent "$http_referer" '
'"$http_user_agent" $server_protocol';
access_log /var/log/nginx/access.log protocol;
Смотрите не только на общее время загрузки. Запишите TTFB, время загрузки главного документа, LCP и долю ошибок. Для честного сравнения нужны одинаковые HTML, изображения, CDN, размер страницы и условия сети. Универсального выигрыша в процентах нет: на стабильном проводном соединении HTTP/3 может почти не отличаться от HTTP/2, а при потерях пакетов разница проявится сильнее.
Что ломается и как искать причину
В конфигурации неизвестна директива http2
Скорее всего, Nginx старее нужной версии или пакет собран иначе. Проверьте nginx -v. Для старой ветки используйте синтаксис, поддерживаемый именно этой версией, либо обновите пакет после проверки совместимости модулей.
В конфигурации неизвестен параметр quic
Обычная сборка может быть без модуля HTTP/3. Команда nginx -V поможет увидеть параметры сборки, но окончательный список поддерживаемых директив нужно сверить с документацией установленной версии.
Браузер всё равно показывает h2
Проверьте UDP 443, наличие заголовка Alt-Svc и срок его кэширования. Браузер не обязан переключаться мгновенно: он сначала должен получить заголовок, а затем может сохранить выбор протокола.
После включения HTTP/3 появились ошибки TLS
Проверьте сертификат, имя хоста и поддержку TLS 1.3. Для QUIC важна не только версия Nginx, но и TLS-библиотека, с которой собран Nginx. Сверяйте это с требованиями конкретного пакета.
HTTP/3 работает напрямую, но не через прокси
Проверьте внешний балансировщик или CDN. Они могут принимать HTTP/3 на границе и передавать запрос к Nginx по HTTP/1.1 или HTTP/2. В таком случае клиентский протокол и протокол между узлами — разные показатели.
Когда включать оба протокола
| Ситуация | Решение | Что контролировать |
|---|---|---|
| Обычный сайт за Nginx | HTTP/2 включить сразу, HTTP/3 добавить после проверки пакета и UDP | Ошибки TLS, доступность TCP и UDP 443 |
| Мобильная аудитория и нестабильные сети | Оставить HTTP/2 как fallback и тестировать HTTP/3 на реальном трафике | LCP, потери пакетов, долю h3 |
| Nginx за CDN | Сначала выяснить, где завершается QUIC | Протокол между браузером, CDN и origin |
| Старый серверный пакет | Не копировать конфигурацию для новой версии без проверки | Версию Nginx, модули и синтаксис директив |
Если сайт получает трафик через CDN, HTTP/3 на origin не всегда нужен: пользовательский QUIC может завершаться на CDN. Если же Nginx принимает трафик напрямую, открытый UDP-порт и совместимая сборка становятся обязательными.
Что делать дальше
Сначала включите HTTP/2 и зафиксируйте базовые показатели. Затем добавьте HTTP/3 на копии конфигурации, откройте UDP 443 и проверьте согласование через DevTools и curl. После выката наблюдайте долю h3, ошибки 4xx и 5xx, TTFB и LCP отдельно для мобильных и настольных клиентов. Инвалидация заголовка Alt-Svc и настройка CDN — отдельная тема; здесь важнее сначала доказать измерениями, что новый транспорт помогает именно вашей аудитории.
Транскрибатор встреч: Запись созвона или диктофона — в текст с разделением по спикерам, протоколом и списком задач.
Спросить за 25 ₽Источники: Официальная документация Nginx: HTTP/2 module, Официальная документация Nginx: QUIC и HTTP/3
Частые вопросы
Нужно ли отключать HTTP/2 после включения HTTP/3?
Почему HTTP/3 не ускоряет сайт на моём компьютере?
Можно ли включить HTTP/3 на любом Nginx?
Что делать, если браузер показывает только h2?
Опасно ли включать HTTP/3 в проде?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.