Nginx 8277 ~ 2 мин.

Как включить HTTP/3 в Nginx

Как включить HTTP/3 в Nginx

Ровно пару лет назад я писал про разработку новой версии протокола HTTP - HTTP/3. До недавнего времени это было тестовые ветки разработки, но в настоящее время вы можете уже начать использовать HTTP/3 на своих проектах.

Немного вводной информации о HTTP/3

Конечно же, важным отличием HTTP/3 является то, что он работает на новом транспортном протоколе QUIC. QUIC предназначен для интенсивного использования мобильных устройств в Интернете, когда люди носят с собой смартфоны, которые постоянно переключаются из одной сети в другую в течение дня. Когда были разработаны первые интернет-протоколы, этого еще не было: устройства были менее портативными и нечасто переключались между сетями.

Т.е. QUIC поможет исправить некоторые из самых больших недостатков HTTP/2:

  • Разработка решения проблемы низкой производительности при переключении смартфона с Wi-Fi на сотовые данные (например, при выходе из дома или офиса)

  • Уменьшение последствий потери пакетов - когда один пакет информации не доходит до места назначения, он больше не блокирует все потоки информации (проблема, известная как «блокировка начала строки»).

Кстати, протокол QUIC был разработан Google еще в 2012 году и принят Инженерной группой Интернета (IETF) — независимой от поставщиков организацией по стандартизации — когда они начали создавать новый стандарт HTTP/3. Посоветовавшись с экспертами со всего мира, IETF внесла множество изменений для разработки собственной версии QUIC.

Включить поддержку HTTP/3 в Nginx

Поддержка протоколов QUIC и HTTP/3 доступна начиная с версии 1.25.0. Также, начиная с 1.25.0, поддержка доступна в готовых пакетах для Linux.

Поддержка QUIC и HTTP/3 экспериментальная, поэтому возможно всё.

Проверяем версию nginx:

nginx -v

Убеждаемся в правильной версии:

$ nginx version: nginx/1.25.3

Для сборки nginx рекомендуется библиотека SSL с поддержкой QUIC, например BoringSSL, LibreSSL или QuicTLS. Иначе, при использовании библиотеки OpenSSL, будет использоваться OpenSSL compatibility layer, в котором не поддерживается early data.

Итак имеем стандартный виртуальный хост nginx с HTTP/2:

server
{
    listen 443 ssl;
    # включаем поддержку http2
    http2 on;  
 
    ssl_protocols TLSv1.2;

    ssl_certificate /path_certs/fullchain.pem;
    ssl_certificate_key path_certs/privkey.pem;
    ...
}

Теперь дополним его директивами для включения HTTP/3:

server
{
    # для лучшей совместимости рекомендуется использовать один порт для quic и https
    # указываем протокол quic и параметр reuseport для правильной работы с несколькими рабочими процессами
    listen 443 quic reuseport;    
    listen 443 ssl;

    # включаем поддержку http2
    http2 on;    
    # включаем поддержку http3
    http3 on;
    # разрешаем GSO
    quic_gso on;
    # разрешаем проверку адреса
    quic_retry on;

    # Для работы QUIC требуется версия протокола TLSv1.3.
    ssl_protocols TLSv1.2 TLSv1.3;

    ssl_certificate /path_certs/fullchain.pem;
    ssl_certificate_key path_certs/privkey.pem;

    # для перенаправления браузеров в quic-порт
    add_header Alt-Svc 'h3=":443"; ma=86400';

    ...

}

В принципе все, если возникнуть проблемы с подключением, убедитесь:

  • что nginx собран с правильной SSL-библиотекой и версией

  • что клиент действительно поддерживает работу с QUIC

После внесения правок и перезагрузки веб-сервера, можете проверить через сервис поддержку HTTP/3, либо сейчас сразу можете проверить сайт ниже в поле.

Что думаешь?

Emin07.10.2024

Почему же тогда quic_retry и quic_gso по умолчанию отключены?

Сергей Мухин 07.10.2024

quic_gso флагозависимый параметр, отсутствие которого , может вызвать нестабильную работу. с quic_retry тоже может быть похожая ситуация, поэтому дефолтные значения выставлены как off.
Без них работать будет, но с ними лучше)

Emin07.10.2024

Хотелось бы понять для чего quic_retry и quic_gso простым языком, а то читал, но так и не понял.

Сергей Мухин 07.10.2024

Хорошо, ну если с quic_gso все более-менее понятно, это просто оптимизация, которая в целом повышает производительность.

Если разобрать аббревиатуру, то Generic Segmentation Offload (GSO) - это широко используемая программная реализация TCP Segmentation Offload, которая снижает накладные расходы на обработку пакетов.

Включили ее - у вас сервер стал шустрее, выключили - оптимальность понизилась.

А вот с quic_retry немного посложнее, если вкратце, то в процессе установления соединения клиент и сервер предоставляют независимые идентификаторы соединения, которые кодируются в заголовке QUIC, обеспечивая простую идентификацию соединения независимо от исходного IP-адреса клиента.

Однако, поскольку первоначальное установление соединения QUIC также включает операции по обмену ключами шифрования TLS, это более затратно с вычислительной точки зрения для сервера, чем простой ответ syn-ack, который он генерирует во время установления соединения TCP. Это также создает потенциальный вектор для распределенных атак типа «отказ в обслуживании» (DDoS) , поскольку IP-адрес клиента не проверяется до того, как будут выполнены операции по обмену ключами.

Вот директива quic_retry и позволяет указать nginx, проверять IP-адреса клиента перед началом сложных криптографических операций. В этом случае NGINX отправляет клиенту пакет повторной попытки, содержащий токен, который клиент должен включить в пакеты установки соединения.

То есть это некая проверка/валидация адреса клиента.

SGI17.06.2024

Сергей, спасибо за статью, у себя сделал, в частности, по Вашей инструкции.
Единственно — в заголовке Alt-Svc параметр не max, а ma (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Alt-Svc)

Сергей Мухин 17.06.2024

Отлично! Спасибо за информацию, опечатку поправил!)

Категории
  • PHP 68
  • Заметки 18
  • Безопасность 4
  • Флуд 2
  • Nginx 2
  • ИТ новости 2
  • Видео 1
  • Docker 1
  • Roadmap 1
  • Архитектура 0

Хочешь поддержать сайт?

Делаем из мухи слона

sergeymukhin.com

персональный блог о веб-разработке от Сергея Мухина. Блог был основан в 2018 году, и собирался уделять основное внимание последним тенденциям, учебным пособиям, а также советам и рекомендациям, позволяющим начинающим девелоперам встать быстрее на правильную дорогу веб разработки, но что-то пошло не так 😃

Релизы PHP 8.4

Дата Релиз
4 Июля 2024 Альфа 1
18 Июля 2024 Альфа 2
1 Августа 2024 Альфа 3
13 Августа 2024 Feature freeze
15 Августа 2024 Бета 1
29 Августа 2024 Бета 2
12 Сентября 2024 Бета 3
26 Сентября 2024 RC 1
10 Октября 2024 RC 2
24 Октября 2024 RC 3
7 Ноября 2024 RC 4
21 Ноября 2024 GA

Что нового?