【问题标题】:How do I use nginx to reverse-proxy an IP camera's mjpeg stream?如何使用 nginx 反向代理 IP 摄像机的 mjpeg 流?
【发布时间】:2011-07-08 14:04:12
【问题描述】:
我在 OpenWRT 上使用 nginx 来反向代理来自 IP 摄像机的运动 jpeg 提要,但我遇到了长达 10-15 秒的延迟,即使在非常低的帧大小和速率下也是如此。从路径中移除 OpenWRT 设备后,可以毫无延迟地访问相机。
由于延迟的长度(以及它随时间增长的事实),这看起来像是某种缓冲/缓存问题。我已经设置了proxy_buffering off,但是还有什么需要注意的吗?
谢谢。
【问题讨论】:
标签:
nginx
reverse-proxy
openwrt
【解决方案1】:
我在 Arduino Yun 上安装了 mjpg-streamer,然后在我的路由器设置中设置端口转发白名单仅到我的网络服务器。
这是我的 Nginx 配置,位于启用站点的目录中。
server {
listen 80;
server_name cam.example.com;
error_log /var/log/nginx/error.cam.log;
access_log /var/log/nginx/access.cam.log;
location / {
set $pp_d http://99.99.99.99:9999/stream_simple.html;
if ( $args = 'action=stream' ) {
set $pp_d http://99.99.99.99:9999/$is_args$args;
}
if ( $args = 'action=snapshot' ) {
set $pp_d http://99.99.99.99:9999/$is_args$args;
}
proxy_pass $pp_d;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Request-Start $msec;
}
}
【解决方案2】:
我从来没有对 nginx 感到满意。根据您的具体需求,两种解决方案可能就足够了:
我仍然有兴趣听到有人使用 nginx 进行此工作。
【解决方案3】:
我在 Openwrt BB (wndr3800) 上有 Nginx 反向代理到 dlink 932LB1 网络摄像机,它运行良好。即使在我禁用 proxy_buffering 之前,也没有明显的滞后。如果我有很多东西通过网络传输,视频可能会变得断断续续,但不会比浏览器(或我的任何 ip cam 应用程序)直接连接到相机的链接更多。所以……有可能。
Nginx 是我的最佳选择。我尝试使用 tinyproxy 和 lighttpd 进行反向代理,但每个都缺少 OpenWrt 上的功能。 tinyproxy 和 lighttpd 都需要针对完整的反向代理功能进行自定义编译,并且 (AFAIK) lighttpd 不会接受代理指令中的 FQDN。
这就是我要做的:
- 面向公众的 Nginx 上的基本或摘要式身份验证提供站点范围的访问控制。
- 我将我的 CGI 脚本(shell、haserl 等)代理到 Openwrt 的 uhttpd。
- 摄像机 mjpeg 和 jpeg API 的严格控制反向代理,无
其他相机功能向公众公开。
- 相机基本身份验证由 Nginx (proxy_set_header) 处理,因此没有后端
公开的授权码。
- 占用空间相对较小(没有 perl、apache、ruby 等)。
我会在此处包含我的 nginx.conf,但它并没有什么不寻常之处……只是简单的代理内容。如果流量确实是您的罪魁祸首,您可以尝试 tcpdump 或 wireshark 看看是什么让您的 LAN 变得混乱。
但听起来你的路由器是延迟的原因。也许硬件无法处理 CPU/流量负载,或者您的 Openwrt 设置中可能有其他东西占用了高速公路。您的视频是否流畅且只是延迟?还是您看到严重断断续续的视频?您提到的延长延迟听起来确实像缓冲区/缓存的事情......但我不知道会做什么。