更新 1

更新 1

这是我的 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 消耗了太多 CPU。如何正确调整它?这里我在 127.0.0.1:1935 有一个 rtmp 监听器。因此 nginx 仅终止 ssl 并进一步通过 rtmp。

这是 1cpu 服务器的 CPU 消耗情况。大约 50% 由 nginx 消耗,其余由 rtmp 服务器消耗。我想让 nginx 消耗更少的 CPU。 CPU 消耗

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 = [email protected]

[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 终止时,1 个 CPU 最多可以支持 512 个流。当我直接流式传输到 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。并且我具有相同的 CPU 消耗率:nginx 约占 50%,rtmp 服务器本身约占 50%。在这种情况下,我将流上传到 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 个连接。顺便说一句,我已经为主机和 Docker 容器完成了 1)。我将所有这些内容都运行在位于 gcloud 计算实例内的容器中。

答案1

512 是 worker_connections 值的默认数字,它定义每个进程的连接数(在本例中为 1CPUx512Connections)。我的想法是,即使您显然已经增加了默认的 worker_connections(如相关文档中所定义),您也可能达到了默认限制。 http://nginx.org/en/docs/ngx_core_module.html#worker_connections

您是否尝试过增加 worker_rlimit_nofile 值或检查 /etc/security/limits.conf 文件是否有任何限制?

相关内容