使用 Apache(小皮面板) + Sunny-Ngrok 实现 ESP32-CAM 视频流公网访问
在嵌入式开发和远程监控场景中,我们常常需要将 ESP32-CAM 视频流从内网转发到公网。本篇文章将详尽介绍如何借助 Apache + Ngrok,把内网地址如 http://xxx.xxx.xxx.xxx:81/stream 成功转发为可公网访问的视频流接口。
1. 所用工具
| 工具 | 说明 |
|---|---|
| phpstudy | 提供 Apache 运行环境 |
| Sunny-Ngrok | 将本机 80 端口映射到公网域名 |
| ESP32-CAM 模块 | 内网部署的视频流设备 |
| Apache Proxy 模块 | 实现请求反向代理和转发 |
2. 搭建相关环境
2. 1 使用Sunny-Ngrok注册并认证
(Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器)
(Sunny-Ngrok使用教程 · Sunny-Ngrok说明文档)

这种方式会收取一定认证费用
选择合适的服务器,这里可以选择免费的


**这里的名称和域名可按需填写,可以直接使用本地的80端口

点击查看状态,可以发现他并不在线,现在下载客户端(Sunny-Ngrok内网转发)
接下来找到启动命令,并保存下来

保存的命令写入启动工具中,等待连接即可,连接成功后,返回查看此时的隧道状态,

即为开启完成了。
2.2 下载小皮面板,一键搭建服务
启动面板,配置网站,选择和Sunny-Ngrok相同的端口,打开套件Apache



此处打开网站

2.3 现在配置Apache相关文件,打开并找到httpd.conf文件

确保 Apache 的以下模块已经启用(取消注释(#)即可):
-
mod_proxy -
mod_proxy_http
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
并在文件结尾加上
<VirtualHost *:80>
ServerName 此处填上你的隧道域名(Sunny-Ngrok内网穿透服务)->(隧道管理)->(赠送域名)ProxyRequests Off
ProxyPreserveHost On<Proxy *>
Require all granted
</Proxy># 先写 /stream 的代理规则(更精确)
ProxyPass /stream http://192.168.1.9:81/stream
ProxyPassReverse /stream http://192.168.1.9:81/stream# 然后写 / 根路径代理
ProxyPass / http://192.168.1.9/
ProxyPassReverse / http://192.168.1.9/
</VirtualHost>
3. 修改配置文件
3. 1在这里,你需要修改相关代理ip,具体方法是通过串口助手配置ssid等
| 指令 | 说明 | 例子 | 备注 |
|---|---|---|---|
sta_ssid: |
要连接的 WiFi 名称 | sta_ssid:yahboom |
yahboom 是要连接的 WiFi 名称 |
sta_pd: |
要连接的 WiFi 密码 | sta_pd:12345678 |
12345678 是对应 WiFi 的密码 |
通过sta_ip获取ip地址,此时你已经可以在同一内网中访问该地址了

访问sta_ip地址,点击下方的Start Stream即可
观察源码可以看到这里
document.addEventListener('DOMContentLoaded', function (event) { var baseHost = document.location.origin var streamUrl = baseHost + ':81'
const startStream = () => { view.src = `${streamUrl}/stream` show(viewContainer) streamButton.innerHTML = 'Stop Stream'
var streamUrl = baseHost + ':81'
这行代码把当前网页地址(例如http://192.168.1.9)加上端口:81,拼接出视频流服务器的地址:streamUrl = 'http://192.168.1.9:81'
view.src =${streamUrl}/stream``
这行代码在刚才拼好的地址后面再加上/stream,变成完整的视频流地址(例如:http://192.168.1.9:81/stream),然后将这个地址设置给一个图像控件view,这样网页上就能看到来自摄像头的图像了。
这也是为什么httpd.conf中,你需要加上这句的原因
# 先写 /stream 的代理规则(更精确)
ProxyPass /stream http://192.168.1.9:81/stream
ProxyPassReverse /stream http://192.168.1.9:81/stream
现在,你可以通过隧道域名+/stream的方式查看,是否有图像传回

最后,使用其他设备的流量或者连接其他wifi来模拟外网,来看一下是否可以读取到视频呢?

4. 你可能遇见的问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
502 Bad Gateway |
内网设备未响应 / IP 配错 / 不支持 chunked | 确保 192.168.1.9:81/stream 在本地可访问,可以使用curl -v http://192.168.1.9/查看 |
| 页面跳转到 phpstudy 默认页 | Apache 虚拟主机未正确匹配 | 确保配置中 ProxyPass / http://192.168.1.9/ 正确写入或者直接删除index,并 重启Apache |
/stream 加载不出视频 |
多开了网页 | 仅仅只使用一个网页访问 |
页面显示 Nothing matches the given URI |
请求 URI 路径 ESP32 未处理 | 确认 ESP32 的 HTTP 服务监听 /stream 路径 |
反代 /stream 显示 index 页面 |
Apache 未区分路径优先级 | 确保 /stream 的 ProxyPass 写在 / 前面 |
| 访问根路径显示旧页面 | 浏览器缓存 | 清理浏览器缓存或强制刷新(Ctrl + F5) |
更多推荐
所有评论(0)