我有一个问题,是否可以配置 NGINX 反向代理,以便它不会将视频流的每个请求代理到后端服务器,而是打开单个连接来获取视频流并将其分发给客户端。现在我使用以下配置。
server {
listen 9000 ssl;
server_name some.domain www.some.domain;
error_log /var/log/nginx/error.cam.log;
access_log /var/log/nginx/access.cam.log;
ssl on;
ssl_certificate /etc/letsencrypt/live/some.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/some.domain/privkey.pem;
location / {
auth_basic "Login";
auth_basic_user_file /etc/nginx/auth/Somefile;
proxy_pass http://XXX.XXX.XXX.XXX:9000/;
proxy_http_version 1.1;
proxy_buffering off;
}
}
每次客户端请求从 NGINX 服务器请求该站点时,这都会导致新的后端到 NGINX 连接具有完全相同的视频流。 上图显示了传出网络流量:绿色=Nginx 服务器,蓝色=后端服务器。每个峰值都意味着有新客户端访问视频 MJPG 流。
所以问题是我从后端到 NGINX 代理的性能非常有限,因为后端是 Raspberry Pi,无法提供超过 30Mbit 的稳定流。我已经尝试过缓冲等,但没有成功。有没有方法可以使用单个连接到后端?
来自德国的感谢和问候,Flo
答案1
Nginx 将始终为传入连接创建新的代理连接,除非它在本地缓存。由于 MJPG 是一个无限循环,因此它似乎不是一个选项。
不过,我会尝试在代理服务器上设置 ffmpeg/vlc 来使用来自 rpi 的 mjpg 流。然后 Nginx 可以连接到本地 ffmpeg/vlc 来获取流。然后您将只有一个与后端服务器的连接。
答案2
正如 @Yarik 所回答的,目前 Nginx 处理代理的方式无法实现这一点。您需要某种系统,专门用于接收一个流,并将其重新广播给任意数量的客户端。
还有一些其他项目旨在填补这一空白。您可以始终在同一台服务器上的 Nginx 后面运行其中一个项目。Nginx 仍将看到每个客户端的单独连接,并将其转发给广播公司,但广播公司只会使用一个客户端加载摄像头。