Чим 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 у браузері, а не мається на увазі.