<!DOCTYPE article SYSTEM "../../../dtd/article.dtd">
<article name="Поддержка QUIC и HTTP/3"
link="/ru/docs/quic.html"
lang="ru"
rev="3">
<section>
<para>
Поддержка протоколов
<link url="https://datatracker.ietf.org/doc/html/rfc9000">QUIC</link>
и
<link url="https://datatracker.ietf.org/doc/html/rfc9114">HTTP/3</link>
доступна начиная с версии 1.25.0, она включена в
<link doc="../linux_packages.xml">бинарных пакетах</link> для Linux.
Подробнее см. документацию к модулю
<link doc="http/ngx_http_v3_module.xml">ngx_http_v3_module</link>.
</para>
</section>
<section id="building" name="Сборка из исходных файлов">
<para>
Сборка настраивается командой <command>configure</command>.
Подробнее см. в статье <link doc="configure.xml"/>.
</para>
<para>
Для сборки nginx с поддержкой QUIC рекомендуется библиотека
<link url="https://openssl.org">OpenSSL</link> версии 3.5.1 или выше.
Иначе будет использоваться OpenSSL compatibility layer без поддержки TLS
<link doc="http/ngx_http_ssl_module.xml" id="ssl_early_data">early data</link>.
Также возможно использование предварительно собранной библиотеки
<link url="https://boringssl.googlesource.com/boringssl">BoringSSL</link>,
<link url="https://www.libressl.org">LibreSSL</link> или
<link url="https://github.com/quictls/openssl">QuicTLS</link>.
</para>
<para>
При конфигурации nginx с
<link url="https://boringssl.googlesource.com/boringssl">BoringSSL</link>
используется следующая команда:
<programlisting>
./configure
--with-debug
--with-http_v3_module
--with-cc-opt="-I../boringssl/include"
--with-ld-opt="-L../boringssl/build -lstdc++"
</programlisting>
</para>
<para>
Кроме того, можно сконфигурировать nginx с
<link url="https://github.com/quictls/openssl">QuicTLS</link>:
<programlisting>
./configure
--with-debug
--with-http_v3_module
--with-cc-opt="-I../quictls/build/include"
--with-ld-opt="-L../quictls/build/lib"
</programlisting>
</para>
<para>
Кроме того, можно сконфигурировать nginx с
<link url="https://www.libressl.org">LibreSSL</link>:
<programlisting>
./configure
--with-debug
--with-http_v3_module
--with-cc-opt="-I../libressl/build/include"
--with-ld-opt="-L../libressl/build/lib"
</programlisting>
</para>
<para>
После конфигурации
nginx компилируется и устанавливается с помощью
<command>make</command>.
</para>
</section>
<section id="configuration" name="Советы по настройке">
<para>
В директиве <link doc="http/ngx_http_core_module.xml" id="listen"/>
модуля <link doc="http/ngx_http_core_module.xml">ngx_http_core_module</link>
появился новый параметр
<link doc="http/ngx_http_core_module.xml" id="quic">quic</link>,
который позволяет принимать на указанном порту QUIC-соединения.
</para>
<para>
Вместе с параметром <literal>quic</literal>
можно также указать параметр
<link doc="http/ngx_http_core_module.xml" id="reuseport">reuseport</link>
для правильной работы с несколькими рабочими процессами.
</para>
<para>
Чтобы <link doc="http/ngx_http_v3_module.xml" id="quic_retry">разрешить</link>
проверку адреса:
<programlisting>
quic_retry on;
</programlisting>
Чтобы <link doc="http/ngx_http_ssl_module.xml" id="ssl_early_data">разрешить</link>
0-RTT:
<programlisting>
ssl_early_data on;
</programlisting>
Чтобы <link doc="http/ngx_http_v3_module.xml" id="quic_gso">разрешить</link>
GSO (Generic Segmentation Offloading):
<programlisting>
quic_gso on;
</programlisting>
Чтобы <link doc="http/ngx_http_v3_module.xml" id="quic_host_key">установить</link>
host-ключ для различных токенов:
<programlisting>
quic_host_key <filename>;
</programlisting>
</para>
<para>
Для работы QUIC требуется версия протокла TLSv1.3, которая включена по умолчанию
в директиве <link doc="http/ngx_http_ssl_module.xml" id="ssl_protocols"/>.
</para>
<para>
По умолчанию
<link url="http://vger.kernel.org/lpc_net2018_talks/willemdebruijn-lpc2018-udpgso-paper-DRAFT-1.pdf">GSO Linux-specific optimization</link>
выключена.
Включите, если настроен соответствующий сетевой интерфейс,
поддерживающий GSO.
</para>
</section>
<section id="troubleshooting " name="Устранение неполадок">
<para>
Приблизительные шаги при обнаружении проблемы:
<list type="bullet">
<listitem>
Убедитесь, что nginx собран с правильной SSL-библиотекой.
</listitem>
<listitem>
Убедитесь, что nginx использует правильную SSL-библиотеку в runtime
(<literal>nginx -V</literal> покажет что именно используется в данный момент).
</listitem>
<listitem>
Убедитесь, что клиент действительно присылает запросы через QUIC.
Рекомендуется начать с простого консольного клиента, например
<link url="https://nghttp2.org/ngtcp2">ngtcp2</link>,
чтобы убедиться, что сервер настроен правильно, и затем попробовать
в браузерах, так как браузеры могут быть требовательны к сертификатам.
</listitem>
<listitem>
Соберите nginx с поддержкой <link doc="debugging_log.xml">отладочного лога</link>
и проверьте отладочный лог.
В нём должны содержаться все детали соединения и причины ошибок.
Соответствующие сообщения начинаются с префикса “<literal>quic</literal>”
и могут быть по нему отфильтрованы.
</listitem>
<listitem>
Для детального исследования можно включить дополнительную отладку
при помощи следующих макросов:
<literal>NGX_QUIC_DEBUG_PACKETS</literal>,
<literal>NGX_QUIC_DEBUG_FRAMES</literal>,
<literal>NGX_QUIC_DEBUG_ALLOC</literal>,
<literal>NGX_QUIC_DEBUG_CRYPTO</literal>.
<para>
<programlisting>
./configure
--with-http_v3_module
--with-debug
--with-cc-opt="-DNGX_QUIC_DEBUG_PACKETS -DNGX_QUIC_DEBUG_CRYPTO"
</programlisting>
</para>
</listitem>
</list>
</para>
</section>
</article>