Назад | Перейти на главную страницу

потребление процессора nginx для завершения ssl с потоком rtmp

Вот мой файл конфигурации nginx

user  nginx;
worker_processes  auto;


error_log  /var/log/nginx/error.log error;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}


stream {
    server {
        listen *:443 ssl;

        ssl_certificate             /etc/nginx/ssl/server.crt;
        ssl_certificate_key         /etc/nginx/ssl/server.key;

        ssl_session_cache shared:SSL:20m;
        ssl_session_timeout 60m;

        proxy_pass 127.0.0.1:1935;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5;
    }
}

Я не доволен этим, потому что nginx потребляет слишком много процессора. Как правильно его настроить? Здесь у меня есть слушатель rtmp по адресу 127.0.0.1:1935. Таким образом, nginx завершает только ssl и дальше проходит через rtmp.

Так выглядит потребление ЦП для сервера с 1 ЦП. Около 50% съедает nginx, а остальное - rtmp server. Я бы хотел, чтобы nginx потреблял меньше ресурсов процессора.

Версия Nginx

nginx -V
nginx version: nginx/1.15.2
built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) 
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.15.2/debian/debuild-base/nginx-1.15.2=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

Нагрузка, которую вы видите, обеспечивается 500 одновременными загрузками потоков по команде

ffmpeg -re -stream_loop -1 -i /dolbycanyon.mp4 -acodec copy -vcodec copy -f flv rtmps://rtmp:443/live/live139

с другого сервера.

Я создал файлы сертификатов /etc/nginx/ssl/server.crt и /etc/nginx/ssl/server.key по команде

openssl req -config ./openssl.conf -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned.key -out selfsigned.crt

где openssl.conf является

[req]
prompt = no
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
C = US
ST = California
L = Los Angeles
O = Our Company Llc
#OU = Org Unit Name
CN = Our Company Llc
#emailAddress = info@example.com

[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com

Обновление 1

Поэтому, когда я использую nginx ssl termination, он может выдерживать максимум 512 потоков на 1 процессор. Когда я транслирую прямо на порт RTMP 1935 (без nginx), это 970 одновременных потоков. Поэтому я хотел бы оптимизировать nginx, чтобы число было немного ближе к 970 потокам, а не к 512 потокам.

Обновление 2

Похоже, проблема не в завершении ssl, а в самой пересылке nginx. Когда я использую простую пересылку (без ssl):

user  nginx;
worker_processes  auto;


error_log  /var/log/nginx/error.log error;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}


stream {
    server {
        listen *:1936;
        proxy_pass 127.0.0.1:1935;
    }
}

Это дает 511 одновременных потоков. Это почти такое же количество, как и при использовании ssl: 512. И у меня такой же коэффициент потребления процессора: около 50% для nginx и около 50% для самого сервера rtmp. В этом случае я загружаю поток на 1936 год (без ssl):

ffmpeg -re -stream_loop -1 -i /dolbycanyon.mp4 -acodec copy -vcodec copy -f flv rtmp://rtmp:1936/live/live6

Обновление 3

1) я проверил /etc/security/limits.conf файл. Он был пуст. Я добавил к нему пару строк:

web soft nofile 65535
web hard nofile 65535

2) Также добавил файл ULIMIT="-n 65535" подавать /etc/default/nginx

3) И добавил строку worker_rlimit_nofile 65535; к /etc/nginx/nginx.conf:

user  nginx;
worker_processes  auto;


error_log  /var/log/nginx/error.log error;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

worker_rlimit_nofile 65535;

stream {
    server {
        listen *:1936;
        proxy_pass 127.0.0.1:1935;
    }
}

Но результат все тот же: 512 подключений. Кстати, я сделал 1) и для хоста, и для контейнера Docker. Я запускаю все это внутри контейнера, который находится внутри вычислительного экземпляра gcloud.

512 - это номер по умолчанию для значения worker_connections, который определяет количество подключений для каждого процесса (в данном случае 1CPUx512Connections). Я думаю, что вы можете достичь предела по умолчанию, даже если вы, очевидно, увеличили значение worker_connections по умолчанию, как определено в соответствующей документации. http://nginx.org/en/docs/ngx_core_module.html#worker_connections

Вы пытались увеличить значение worker_rlimit_nofile или проверить, есть ли в файле /etc/security/limits.conf какие-либо ограничения?