nginxQuic: скорость загрузки при активации kTLS

Maxim Dounin mdounin на mdounin.ru
Сб Янв 6 18:27:52 UTC 2024


Hello!

On Sat, Jan 06, 2024 at 08:20:59PM +0300, izorkin на gmail.com wrote:

> Добрый вечер, Илья.
> 
> Да, он влияет как и на HTTP/1.1 и на HTTP/2 протоколы. Ещё бы добавить опцию, например, disable_ktls_for_protocol.
> В итоге получится примерно такой вариант:
>   server {
>     listen 0.0.0.0:443 quic reuseport ;
>     listen 0.0.0.0:443 ssl reuseport ;
>     http2 on;
>     http3 on;
>     ssl_conf_command Options KTLS;
>     disable_ktls_for_protocol http2;
>  
> По итогу при активации kTLS не будет просадки в производительности для HTTP/2 протокола, т.к. обработкой
> шифрованием будет заниматься сам процесс nginx :)

Просадка производительности, которую вы наблюдаете для HTTP/2 при 
включённом kTLS - не собственно из-за kTLS, а из-за того, что у 
вас включён sendfile, и при включённом kTLS становится возможным 
его использование.  А в случае HTTP/2 это выливается в большое 
количество syscall'ов из-за HTTP/2-фрейминга.

Если очень хочется получить включённый sendfile и kTLS в случае 
HTTP/1.x, и выключенный в случае HTTP/2, то можно сделать как-то 
так (слегка адаптировано из 
https://mailman.nginx.org/pipermail/nginx-devel/2022-September/NSHDCLL2TY3Q536CO5MAKXSC3HCIMUNF.html):

    server {
        listen 443 ssl;

        http2 on;

        location / {
            if ($server_protocol != 'HTTP/2.0') {
                rewrite ^(.*) /sendfile$1 last;
            }

            sendfile off;
        }

        location /sendfile/ {
            alias html/;
            sendfile on;
        }
    }

Но смысла в этом не очень много, так как при включённом HTTP/2 
рассчитывать на клиентов, которые придут по HTTP/1.x, не имеет 
особого смысла, таких клиентов будет исчезающе мало.  Если хочется 
получить высокую производительность при скачивании больших файлов, 
и при этом использовать HTTP/2 (и/или HTTP/3), то имеет смысл 
заводить отдельный виртуальный сервер, в котором разрешать только 
HTTP/1.x (а также sendfile и kTLS), и раздавать файлы с него.

Для HTTP/3 не работают ни kTLS, ни sendfile, соответственно 
влияния на производительность HTTP/3 от включения kTLS не будет.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru