Поддержка 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';
        }
    }
}

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

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