Чем HTTP/2 и HTTP/3 отличаются от HTTP/1.1
HTTP/1.1 открывает по отдельному TCP-соединению на несколько параллельных запросов и передаёт заголовки текстом при каждом запросе. HTTP/2 мультиплексирует запросы в одном соединении и сжимает заголовки, поэтому страница с десятками мелких файлов загружается быстрее. HTTP/3 идёт дальше — переносит транспорт с TCP на QUIC поверх UDP, из-за чего один потерянный пакет не тормозит все остальные потоки одновременно, как это бывает в HTTP/2.
Для сайта на VDS ZevsHost.net с посетителями через мобильные сети с потерями пакетов переход на HTTP/3 даёт заметный прирост отзывчивости. Для обычного корпоративного сайта на стабильном канале разница между HTTP/2 и HTTP/3 почти незаметна — там важнее правильно настроенный SSL/TLS, без которого ни HTTP/2, ни HTTP/3 не заработают.
Включение HTTP/2 в Nginx
С версии 1.25.1 директива listen ... http2 устарела, вместо неё используется отдельная директива http2 on; внутри server-блока.
server {
listen 443 ssl;
http2 on;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
HTTP/2 работает только поверх TLS в подавляющем большинстве браузеров, поэтому без действующего сертификата директива фактически бесполезна. Версию Nginx можно посмотреть командой nginx -v, а актуальный способ установки актуальной версии на Ubuntu и Debian описан в статье про установку Nginx.
Включение HTTP/3 и QUIC
HTTP/3 требует Nginx, собранный с поддержкой QUIC (начиная с версии 1.25.0 в основной ветке), и открытого UDP-порта в дополнение к TCP.
server {
listen 443 ssl;
listen 443 quic reuseport;
http2 on;
http3 on;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
add_header Alt-Svc 'h3=":443"; ma=86400';
}
Заголовок Alt-Svc сообщает браузеру, что сервер поддерживает HTTP/3 на этом же порту, — без него браузер продолжит подключаться по HTTP/2, даже если QUIC уже настроен. Порт 443/udp обязательно нужно открыть в файрволе отдельно от 443/tcp, иначе соединение просто не установится.
Версии протоколов и требования
| Протокол | Транспорт | Минимум для Nginx |
|---|---|---|
| HTTP/1.1 | TCP | любая версия |
| HTTP/2 | TCP + TLS | 1.9.5, директива http2 on с 1.25.1 |
| HTTP/3 | QUIC + UDP | 1.25.0 со сборкой с поддержкой QUIC |
Сборка из стандартного репозитория дистрибутива не всегда включает QUIC — часто нужен официальный репозиторий nginx.org с пакетом, собранным с флагом --with-http_v3_module. Проверить наличие модуля можно командой nginx -V 2>&1 | grep http_v3.
Проверка, что протокол реально используется
curl -I --http2 https://example.com/— в ответе должна быть строкаHTTP/2 200.curl -I --http3 https://example.com/— доступно, если локальный curl собран с поддержкой HTTP/3.- Вкладка Network в инструментах разработчика браузера — колонка Protocol показывает h2 или h3.
- Заголовок ответа
Alt-Svcприсутствует и указывает на правильный порт.
Если браузер продолжает использовать HTTP/2 после включения HTTP/3, чаще всего проблема в закрытом UDP-порту на файрволе или в отсутствующем заголовке Alt-Svc — TCP-соединение при этом работает нормально, поэтому сайт открывается, но без ускорения от QUIC.
Итог: чек-лист HTTP/2 и HTTP/3 в Nginx
- В server-блоке указаны
http2 on;и, если нужно,http3 on;. - Nginx собран с модулем
http_v3, если планируется HTTP/3. - Порт 443/udp открыт в файрволе отдельно от 443/tcp.
- Заголовок
Alt-Svcдобавлен и указывает верный порт. - Протокол проверен через
curl -Iи вкладку Network в браузере, а не предполагается на слово.