核心概念

在开始之前,你需要理解几个核心角色和概念:

网络摄像头远程监控网站
(图片来源网络,侵删)
  1. 网络摄像头 (IP Camera): 这是你要监控的物理设备,它需要有网络功能,能连接到你的家庭/办公室网络。
  2. 流媒体服务器 (Streaming Server): 这是整个系统的“心脏”,它负责从摄像头接收视频流,进行处理(如转码、录制),然后分发给多个客户端(比如你的浏览器),我们推荐使用 RTSP Simple Server,它免费、开源、配置简单。
  3. 网站前端 (Web Frontend): 这是你看到的网页界面,它通过 HTML5 的 <video> 标签来播放从流媒体服务器获取的视频流,我们将使用 Nginx 作为 Web 服务器来托管这个网页。
  4. 反向代理 (Reverse Proxy): 这是一个“中间人”,它将来自外网(互联网)的请求(比如访问你的网页)转发到内网(家庭网络)的相应服务(如流媒体服务器或 Web 服务器),这样做的好处是:
    • 安全: 只需要开放一个端口(如 443 端口),隐藏了内部服务的具体端口。
    • SSL/TLS 加密: 可以轻松地为整个网站提供 HTTPS 加密,保护你的数据安全。
    • 负载均衡: 如果未来需要扩展,可以轻松实现。
  5. 公网IP 和 动态DNS (DDNS): 你的家庭网络由互联网服务提供商分配一个公网 IP 地址,这个地址可能会变,DDNS 服务(如花生壳、No-IP)可以给你一个固定的域名(如 mycamera.ddns.net),并自动更新到你的动态公网 IP,这样你就可以通过域名随时随地访问了。

准备工作

  1. 硬件:

    • 一台 24小时开机 的设备(如:旧电脑、树莓派、NAS、或任何一台闲置的电脑),这台设备将作为你的监控服务器。
    • 一个网络摄像头(支持 RTSP 协议的最好)。
    • 路由器和网线。
  2. 软件:

    • 操作系统: Linux (推荐 Ubuntu Server) 是最稳定和成本效益最高的选择,Windows 也可以,但配置会更复杂一些。
    • 流媒体服务器: RTSP Simple Server (也叫 rtsp-simple-serverrtspsrv)
    • Web 服务器 / 反向代理: Nginx
    • 动态域名服务: 注册一个免费账户(如 花生壳No-IP)。

详细搭建步骤 (以 Ubuntu Server 为例)

第一步:设置监控服务器

  1. 安装系统: 在你的服务器电脑上安装 Ubuntu Server。

  2. 更新系统:

    网络摄像头远程监控网站
    (图片来源网络,侵删)
    sudo apt update && sudo apt upgrade -y
  3. 安装必要软件:

    # 安装 Nginx
    sudo apt install nginx -y
    # 安装 Golang (rtsp-simple-server 是用 Go 语言写的)
    sudo apt install golang-go -y
    # 安 FFmpeg (用于视频转码和处理,可选但推荐)
    sudo apt install ffmpeg -y

第二步:配置流媒体服务器 (rtsp-simple-server)

  1. 下载并运行:

    # 创建一个工作目录
    mkdir ~/rtsp-server && cd ~/rtsp-server
    # 下载最新版本的 rtsp-simple-server
    go get github.com/aler9/rtsp-simple-server
    # 运行服务器 (可以先测试一下)
    ~/go/bin/rtsp-simple-server

    如果看到一堆配置信息输出,说明服务器启动成功了,按 Ctrl+C 停止。

  2. 配置文件: 为了让服务器在后台运行并自定义配置,我们需要创建一个配置文件 rtsp-simple-server.yml~/rtsp-server 目录下。

    nano ~/rtsp-simple-server/rtsp-simple-server.yml

    粘贴以下内容,并根据你的摄像头信息进行修改:

    # rtsp-simple-server.yml
    # 定义一个名为 "mycamera" 的摄像头源
    paths:
      live:
        # 摄像头的 RTSP 地址 (请替换为你的摄像头地址)
        # 格式通常是: rtsp://username:password@ip_address:port/path
        # 如果没有用户名密码,可以省略
        source: rtsp://192.168.1.100:554/stream
        # 可选: 使用 FFmpeg 进行转码,让更多设备能播放
        # 转码为 H.264 编码,AAC 音频,720p 分辨率
        # ffmpeg: -c:v libx264 -preset ultrafast -f hls -hls_time 4 -hls_list_size 6 -c:a aac -f hls mycamera.m3u8
        # 可选: 启用录制,将视频保存为文件
        # record: true
        # recordPath: ./recordings
        # recordFormat: mp4

    保存文件: Ctrl+X -> Y -> Enter

  3. 设置为系统服务: 为了让服务器开机自启并在后台稳定运行,我们创建一个 systemd 服务。

    sudo nano /etc/systemd/system/rtsp-simple-server.service
    [Unit]
    Description=RTSP Simple Server
    After=network.target
    [Service]
    Type=simple
    User=your_username  # 替换为你的服务器用户名
    WorkingDirectory=/home/your_username/rtsp-server  # 替换为你的工作目录
    ExecStart=/home/your_username/go/bin/rtsp-simple-server
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target

    保存文件,然后启用并启动服务:

    sudo systemctl daemon-reload
    sudo systemctl enable rtsp-simple-server
    sudo systemctl start rtsp-simple-server

    检查服务状态:sudo systemctl status rtsp-simple-server,如果显示 active (running),说明成功了。

第三步:创建监控网页

  1. 创建网页目录:

    sudo mkdir -p /var/www/html/camera
    sudo chown -R $USER:$USER /var/www/html/camera
  2. 编写 HTML 页面:

    nano /var/www/html/camera/index.html

    粘贴以下代码,这个页面会使用 hls.js 库来播放 RTSP 流(通过 HLS 协议)。

    <!DOCTYPE html>
    <html>
    <head>
        <title>远程摄像头监控</title>
        <meta charset="utf-8">
        <style>
            body { margin: 0; background-color: #111; display: flex; justify-content: center; align-items: center; height: 100vh; }
            video { max-width: 100%; max-height: 100vh; }
        </style>
    </head>
    <body>
        <video id="video" controls autoplay muted playsinline></video>
        <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
        <script>
            var video = document.getElementById('video');
            var videoSrc = 'http://localhost:8080/live/mycamera.m3u8'; // 注意这里的地址和路径
            if (Hls.isSupported()) {
                var hls = new Hls();
                hls.loadSource(videoSrc);
                hls.attachMedia(video);
                hls.on(Hls.Events.MANIFEST_PARSED, function() {
                    video.play();
                });
            }
            else if (video.canPlayType('application/vnd.apple.mpegurl')) {
                // 对于原生支持 HLS 的设备 (如 Safari)
                video.src = videoSrc;
                video.addEventListener('loadedmetadata', function() {
                    video.play();
                });
            }
        </script>
    </body>
    </html>

    保存文件

第四步:配置 Nginx 反向代理

这是最关键的一步,它将内网服务暴露到外网,并实现 HTTPS 加密。

  1. 获取 SSL 证书 (Let's Encrypt): 我们使用 certbot 来免费获取 SSL 证书。

    sudo apt install certbot python3-certbot-nginx -y
  2. 配置 Nginx:

    sudo nano /etc/nginx/sites-available/camera

    粘贴以下配置。请务必将 yourdomain.ddns.net 替换成你自己的 DDNS 域名

    server {
        listen 80;
        server_name yourdomain.ddns.net; # 替换成你的域名
        # 将 HTTP 请求重定向到 HTTPS
        location / {
            return 301 https://$host$request_uri;
        }
    }
    server {
        listen 443 ssl http2;
        server_name yourdomain.ddns.net; # 替换成你的域名
        # SSL 证书配置 (Certbot 会自动填充)
        ssl_certificate /etc/letsencrypt/live/yourdomain.ddns.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/yourdomain.ddns.net/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
        # 反向代理到我们的监控网页
        location / {
            proxy_pass http://localhost; # Nginx 默认监听 80 端口,指向 /var/www/html
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
        # 反向代理到 rtsp-simple-server 的 HLS 输出
        # 这样外网可以直接访问到 m3u8 文件
        location /live/ {
            proxy_pass http://localhost:8080/; # rtsp-simple-server 的 HLS 默认端口是 8080
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    保存文件

  3. 启用配置并获取证书:

    # 创建符号链接启用站点
    sudo ln -s /etc/nginx/sites-available/camera /etc/nginx/sites-enabled/
    # 删除默认站点
    sudo rm /etc/nginx/sites-enabled/default
    # 测试 Nginx 配置
    sudo nginx -t
    # 如果测试通过,获取 SSL 证书
    sudo certbot --nginx -d yourdomain.ddns.net # 再次替换你的域名

    certbot 的交互界面,选择将 HTTP 重定向到 HTTPS。

  4. 重启 Nginx:

    sudo systemctl restart nginx

第五步:配置路由器端口转发

你的服务器在内网中已经配置好了,但外网还无法访问,你需要登录到你的路由器管理后台,进行端口转发。

  1. 登录路由器: 通常通过 168.1.1168.0.1 访问。
  2. 找到端口转发/虚拟服务器设置
  3. 添加规则:
    • 服务名称: HTTPS
    • 外部端口: 443
    • 内部 IP 地址: 你监控服务器的内网 IP 地址 (168.1.20)
    • 内部端口: 443
    • 协议: TCP
  4. 保存并启用

第六步:配置动态域名 (DDNS)

登录你的 DDNS 服务商网站(如花生壳),设置你的域名(yourdomain.ddns.net),并将其指向你当前的公网 IP 地址,大多数路由器也支持内置的 DDNS 客户端,可以自动更新 IP 地址,推荐开启。


最终测试

  1. 在你家里的局域网内,用手机或电脑打开浏览器,访问 https://yourdomain.ddns.net
  2. 你应该能看到摄像头的实时画面了。
  3. 切换到你的手机移动数据网络(确保不在家里 Wi-Fi 下),再次访问同一个网址。
  4. 如果能看到画面,恭喜你!你已经成功搭建了一个安全、远程的监控网站!

进阶功能与安全建议

  • 安全:
    • 修改默认端口: 不要让 rtsp-simple-server 和 Nginx 使用默认端口,增加安全性。
    • 防火墙: 使用 ufw (Uncomplicated Firewall) 只开放必要的端口(如 443)。
      sudo ufw allow 443/tcp
      sudo ufw enable
    • 强密码: 为你的摄像头、路由器管理员账户、服务器 SSH 账户设置强密码。
  • 功能:
    • 双向语音: 如果你的摄像头和网页前端支持,可以实现通过网页对讲。
    • 移动侦测/警报: 可以结合脚本,当 FFmpeg 检测到画面变化时,发送邮件或推送通知。
    • 多摄像头: 在 rtsp-simple-server.yml 中定义多个 paths,在网页中创建多个 <video> 标签即可。
    • 云存储: 将录制视频上传到云存储(如阿里云 OSS, AWS S3),防止本地硬盘损坏导致录像丢失。

这个方案功能强大且成本极低,是个人和小型企业搭建监控系统的理想选择,祝你搭建顺利!