![带有 Raspberry Pi 运动相机的 Ubuntu 服务器](https://linux22.com/image/854496/%E5%B8%A6%E6%9C%89%20Raspberry%20Pi%20%E8%BF%90%E5%8A%A8%E7%9B%B8%E6%9C%BA%E7%9A%84%20Ubuntu%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有一台 Ubuntu 服务器,用作 Web 服务器。一切运行良好,我设置了多个站点。我的路由器只允许一台设备拥有公共 IP,即我的 Ubuntu 服务器。我设置了一台带摄像头和运动传感器的 RaspberryPi。同样,一切运行良好 - 我可以通过浏览器访问摄像头(IP:8081)。
我想从我的 Ubuntu 运行一个网站并显示来自树莓派的实时流。这非常适合<img src="IP:8081?action=stream />
。但是,由于树莓派只有内部 IP,因此当我在网络之外时,我无法看到流。
我需要做什么才能让我的 Ubuntu 访问树莓派并反馈流?
顺便说一下,该应用程序基于 codeigniter,motion 也可以在 locahost 之外工作。
答案1
因此,您有一个横跨两个网络(WAN 和 LAN)的服务器,并且您想要在 WAN 上公开来自 LAN 的一些内容,作为服务器托管的其他内容的一部分。
最简单的方法是告诉您的 HTTP 服务器代理连接。大多数服务器都可以做到这一点,但我会使用 Nginx 而不是其他任何服务器,因为它是最好的(最快、最小等等)。您可以使用如下规则:
location /webcam/ {
proxy_pass http://internal_webcam_IP:8081/?action=stream;
}
对于 Apache,同样如此...您只需创建一个快速反向代理:
ProxyRequests off
ProxyPass /webcam http://internal_webcam_IP:8081/?action=stream
然后将 HTML 图像位置更改为:
<img src="/webcam/" />
网络方面应该相当简单,但网络摄像头上的图像托管可能无法在图像标签中工作(有些使用 MJPEG,有些使用 javascript),因此您可能需要通过 iframe 嵌入页面,或编写一些新的 javascript 来更新图像(比 iframe 更简洁,但工作量更大)。如果这样做,您可能需要打开代理,这样它就不仅仅是镜像 URL /?action=stream
。
这让事情变得复杂起来。我们这里讨论的是嵌入式硬件:众所周知,它更新不足,而且 — 总体而言 — 非常容易被黑客入侵。如果您确实需要将代理开放给更广泛的 URL 选择,您可能还需要添加大量要阻止的明确 URL,以阻止外部人员过多地访问您的内部网络。
另一个方向是使用PHP和代码点火器代理任何你需要的东西……然而,一般的 webdev 经验法则是,如果可以避免,不要让你的服务器端语言处理琐碎的任务。你可以把这些任务交给 web 服务器(或者甚至是网络堆栈——我不会深入讨论,因为它根本没有安全性)。