Вот мой файл конфигурации 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
Поэтому, когда я использую nginx ssl termination, он может выдерживать максимум 512 потоков на 1 процессор. Когда я транслирую прямо на порт RTMP 1935 (без nginx), это 970 одновременных потоков. Поэтому я хотел бы оптимизировать nginx, чтобы число было немного ближе к 970 потокам, а не к 512 потокам.
Похоже, проблема не в завершении 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
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 какие-либо ограничения?