Поддержка QUIC и HTTP/3

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

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

Сборка из исходных файлов

Сборка настраивается командой configure. Подробнее см. в статье Сборка nginx из исходных файлов.

Во время сборки nginx можно включить QUIC и HTTP/3 при помощи конфигурационного параметра --with-http_v3_module.

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

При конфигурации nginx с BoringSSL используется следующая команда:

./configure
 --with-debug
 --with-http_v3_module
 --with-cc-opt="-I../boringssl/include"
 --with-ld-opt="-L../boringssl/build/ssl
 -L../boringssl/build/crypto"

Кроме того, можно сконфигурировать nginx с QuicTLS:

./configure
 --with-debug
 --with-http_v3_module
 --with-cc-opt="-I../quictls/build/include"
 --with-ld-opt="-L../quictls/build/lib"

Кроме того, можно сконфигурировать nginx с современной версией LibreSSL:

./configure
 --with-debug
 --with-http_v3_module
 --with-cc-opt="-I../libressl/build/include"
 --with-ld-opt="-L../libressl/build/lib"

После конфигурации nginx компилируется и устанавливается с помощью make.

Конфигурация

В директиве listen модуля ngx_http_core_module появился новый параметр quic, который позволяет принимать на указанном порту QUIC-соединения.

Вместе с параметром quic можно также указать параметр reuseport для правильной работы с несколькими рабочими процессами.

Список директив см. в модуле ngx_http_v3_module.

Чтобы разрешить проверку адреса:

quic_retry on;

Чтобы разрешить 0-RTT:

ssl_early_data on;

Чтобы разрешить GSO (Generic Segmentation Offloading):

quic_gso on;

Чтобы установить host-ключ для различных токенов:

quic_host_key <filename>;

Для работы QUIC требуется версия протокла TLSv1.3, которая включена по умолчанию в директиве ssl_protocols.

По умолчанию GSO Linux-specific optimization выключена. Включите, если настроен соответствующий сетевой интерфейс, поддерживающий GSO.

Пример конфигурации

http {
 log_format quic '$remote_addr - $remote_user [$time_local] '
 '"$request" $status $body_bytes_sent '
 '"$http_referer" "$http_user_agent" "$http3"';
 access_log logs/access.log quic;
 server {
 # для лучшей совместимости рекомендуется
 # использовать один порт для quic и https
 listen 8443 quic reuseport;
 listen 8443 ssl;
 ssl_certificate certs/example.com.crt;
 ssl_certificate_key certs/example.com.key;
 location / {
 # для перенаправления браузеров в quic-порт
 add_header Alt-Svc 'h3=":8443"; ma=86400';
 }
 }
}

Устранение неполадок

Приблизительные шаги при обнаружении проблемы:

  • Убедитесь, что nginx собран с правильной SSL-библиотекой.
  • Убедитесь, что nginx использует правильную SSL-библиотеку в runtime (nginx -V покажет что именно используется в данный момент).
  • Убедитесь, что клиент действительно присылает запросы через QUIC. Рекомендуется начать с простого консольного клиента, например ngtcp2, чтобы убедиться, что сервер настроен правильно, и затем попробовать в браузерах, так как браузеры могут быть требовательны к сертификатам.
  • Соберите nginx с поддержкой отладочного лога и проверьте отладочный лог. В нём должны содержаться все детали соединения и причины ошибок. Соответствующие сообщения начинаются с префикса "quic" и могут быть по нему отфильтрованы.
  • Для детального исследования можно включить дополнительную отладку при помощи следующих макросов: NGX_QUIC_DEBUG_PACKETS, NGX_QUIC_DEBUG_FRAMES, NGX_QUIC_DEBUG_ALLOC, NGX_QUIC_DEBUG_CRYPTO.
    ./configure
     --with-http_v3_module
     --with-debug
     --with-cc-opt="-DNGX_QUIC_DEBUG_PACKETS -DNGX_QUIC_DEBUG_CRYPTO"
    

AltStyle によって変換されたページ (->オリジナル) /