Как включить 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.
Без них работать будет, но с ними лучше)