HTTP/2: что это, отличия от HTTP/1.1 и настройка в Nginx | Глоссарий FREEHOSTING

HTTP/2

Hypertext Transfer Protocol v2
HTTP/2 — Бинарный протокол прикладного уровня (RFC 7540), пришедший на смену HTTP/1.1. Мультиплексирует запросы в одном TCP-соединении, сжимает заголовки HPACK и поддерживает Server Push.

Определение простыми словами

HTTP/2 — это тот же HTTP с теми же методами и кодами ответов, но другой транспорт. Вместо текстовых строк по одной на запрос — бинарные фреймы, идущие параллельно в одном TCP-соединении. Браузеру не нужно открывать 6 коннектов на домен ради скорости — все картинки, скрипты и стили летят через один канал.

Протокол стандартизирован в 2015 году, базируется на наработках Google SPDY. Поддерживается всеми современными браузерами поверх TLS (h2). Вариант h2c (без шифрования) почти не используется — браузеры его игнорируют.

Сравнение HTTP/1.1, HTTP/2 и HTTP/3

Параметр HTTP/1.1 HTTP/2 HTTP/3
Транспорт TCP TCP + TLS QUIC поверх UDP
Формат Текстовый Бинарный Бинарный
Мультиплексирование Нет, head-of-line блокировка Да, в TCP-сессии Да, без HoL TCP
Сжатие заголовков Нет HPACK QPACK
Server Push Нет Да (часто отключают) Удалён

Кейсы использования

  • Сайт с десятками мелких ассетов: HTTP/2 уменьшает Time To Interactive на 20–40 % по сравнению с HTTP/1.1.
  • API-шлюз с большим количеством мелких JSON-запросов от мобильного клиента — мультиплексирование экономит RTT.
  • gRPC использует HTTP/2 как обязательный транспорт.
  • Negative: при потере одного TCP-пакета блокируются все потоки (head-of-line на уровне TCP). На плохом канале QUIC и HTTP/3 быстрее.
  • Negative: Server Push в реальности почти не приносит пользы — Chrome удалил его поддержку в 106 версии.

Технические детали

# Включить HTTP/2 в Nginx (нужен TLS)
server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    http2_max_concurrent_streams 128;
    http2_recv_buffer_size 256k;
    location / {
        proxy_pass http://app:8080;
    }
}

# Проверить, что сайт отдаёт по h2
curl -sI --http2 https://example.com | head -1
# HTTP/2 200

# Подробная диагностика
nghttp -nv https://example.com

# Apache 2.4: модуль http2
a2enmod http2
echo 'Protocols h2 http/1.1' > /etc/apache2/conf-available/http2.conf
a2enconf http2 && systemctl reload apache2

Чтобы оценить выгоду, сравните Largest Contentful Paint и Time to First Byte между h1 и h2 в Chrome DevTools. Для сайтов с малым числом ресурсов разница незаметна — HTTP/2 раскрывается на десятках параллельных запросов.

Частые вопросы

Нужен ли HTTPS для HTTP/2?

Формально нет (есть h2c), но все браузеры поддерживают HTTP/2 только поверх TLS. На практике — обязателен валидный сертификат.

Стоит ли включать Server Push?

Нет. Эффективность спорная, Chrome убрал поддержку, многие CDN игнорируют. Лучше использовать <code>preload</code> в HTML.

HTTP/2 заменил HTTP/3?

Нет, они сосуществуют. HTTP/3 даёт выигрыш на мобильных и нестабильных каналах, HTTP/2 остаётся достаточным для проводного интернета.