# HTTP/2 і HTTP/3 (QUIC) у Nginx: як увімкнути і перевірити

> Як увімкнути HTTP/2 і HTTP/3 через QUIC у Nginx, яка версія потрібна і як перевірити, що браузер справді використовує новий протокол.

## Чим 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](https://www.zevshost.net/uk/kb/nginx-ssl-tls-nastroika/), без якого ані 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](https://www.zevshost.net/uk/kb/nginx-ustanovka-ubuntu-debian/).

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

---

Джерело: https://www.zevshost.net/uk/kb/nginx-http2-http3-quic/
