DAMO-YOLO部署教程:HTTPS反向代理配置(Nginx)支持外网安全访问

1. 为什么需要HTTPS反向代理?

你已经成功启动了 DAMO-YOLO 智能视觉探测系统,本地访问 http://localhost:5000 一切正常——但当你想用手机扫描二维码查看实时检测效果、让同事在另一台电脑上远程测试、或者把系统嵌入企业内网平台时,问题就来了:

  • 浏览器直接报错:“不安全的连接”“Mixed Content Blocked”
  • 手机 Safari/Chrome 拒绝加载摄像头权限(现代浏览器强制要求 HTTPS 下才能启用媒体设备)
  • 内网其他服务无法通过 iframe 或 API 安全调用你的检测接口
  • 公司防火墙或云服务器安全组默认拦截 HTTP 流量,只放行 443 端口

这些问题,不是 DAMO-YOLO 本身的问题,而是网络访问层的安全策略限制
Flask 默认只提供 HTTP 服务,它不内置 TLS 加密、不管理证书、也不处理域名路由。而 Nginx 的反向代理 + HTTPS 终止,正是工业级部署中解决这类问题的标准方案。

本教程不讲原理堆砌,只聚焦三件事:
怎么让 https://vision.yourdomain.com 安全打开 DAMO-YOLO 界面
怎么让图片上传、结果回传、滑块调节等所有交互在 HTTPS 下完全可用
怎么用免费证书 + 极简配置,15 分钟完成,不改一行 Python 代码

你不需要懂 SSL 握手流程,不需要手动编译 OpenSSL,甚至不需要拥有自己的域名——我们也会演示如何用临时域名(如 ngroklocaltunnel)配合自签名证书快速验证。


2. 前置准备:确认基础环境与服务状态

在配置 Nginx 之前,请确保 DAMO-YOLO 已稳定运行在本地,并对外可访问。

2.1 验证原始服务是否就绪

执行以下命令,检查 Flask 服务是否正在监听 0.0.0.0:5000(而非仅 127.0.0.1:5000):

sudo ss -tuln | grep ':5000'

正确输出应类似:

tcp   LISTEN 0      128    *:5000   *:*    users:(("python3",pid=1234,fd=5))

如果只看到 127.0.0.1:5000,说明服务绑定在本地回环地址,外部无法访问。请编辑 /root/build/start.sh,确认 Flask 启动命令包含 --host=0.0.0.0 --port=5000,例如:

python3 app.py --host=0.0.0.0 --port=5000

小提示:DAMO-YOLO 的 start.sh 脚本通常已默认设置为 0.0.0.0,但部分镜像版本可能遗漏。若不确定,可临时加参数强制绑定。

2.2 确认系统基础组件可用

本教程基于主流 Linux 发行版(Ubuntu 22.04 / CentOS 7+),需确保以下工具已安装:

工具 检查命令 未安装时安装方式(Ubuntu)
nginx nginx -v sudo apt update && sudo apt install nginx -y
certbot certbot --version sudo apt install certbot python3-certbot-nginx -y
curl curl --version sudo apt install curl -y
openssl openssl version sudo apt install openssl -y

所有命令均无需 root 权限以外的操作,全程使用普通用户 + sudo 即可完成。


3. 方案一:使用 Let’s Encrypt 免费证书(推荐 · 生产可用)

这是最标准、最安全、且被所有现代浏览器完全信任的方案。适用于你已有备案域名(如 vision.example.com)并能控制其 DNS 解析的场景。

3.1 域名解析与端口开放

  1. 登录你的域名服务商后台(如阿里云、腾讯云、Cloudflare),添加一条 A 记录:

    • 主机名:vision(或 aidetect 等你喜欢的子域名)
    • 记录值:填写你部署 DAMO-YOLO 的服务器公网 IP
    • TTL:默认即可(通常 600 秒)
  2. 确保服务器防火墙放行 80 和 443 端口:

    # Ubuntu (UFW)
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw reload
    
    # CentOS (firewalld)
    sudo firewall-cmd --permanent --add-port=80/tcp
    sudo firewall-cmd --permanent --add-port=443/tcp
    sudo firewall-cmd --reload
    

注意:如果你使用的是云服务器(如阿里云 ECS),还需在安全组规则中手动添加入方向 80/443 端口放行。

3.2 配置 Nginx 反向代理(无 HTTPS 版,先通)

创建 Nginx 配置文件:

sudo nano /etc/nginx/sites-available/damo-yolo

粘贴以下内容(请将 vision.yourdomain.com 替换为你实际的域名):

server {
    listen 80;
    server_name vision.yourdomain.com;

    # 防止 favicon.ico 404 干扰日志
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    # 核心代理:把所有请求转发给本地 Flask
    location / {
        proxy_pass http://127.0.0.1:5000;
        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;

        # 支持 WebSocket(如未来扩展实时视频流)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 缓冲区调优,避免大图上传超时
        proxy_buffering on;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        client_max_body_size 50M;
    }
}

启用配置:

sudo ln -sf /etc/nginx/sites-available/damo-yolo /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

此时访问 http://vision.yourdomain.com,应能正常打开 DAMO-YOLO 界面(仍为 HTTP,但已走 Nginx 代理)。

3.3 一键申请并启用 HTTPS

执行 Certbot 自动化配置:

sudo certbot --nginx -d vision.yourdomain.com

按提示操作:

  • 选择邮箱(用于证书到期提醒)
  • 同意服务条款
  • 选择是否自动重定向 HTTP → HTTPS( 强烈建议选 2:Redirect)

Certbot 会自动:

  • 向 Let’s Encrypt 申请证书
  • 修改 Nginx 配置,添加 443 端口监听和证书路径
  • 设置 HTTP → HTTPS 301 强制跳转

完成后,访问 https://vision.yourdomain.com,浏览器地址栏将显示绿色锁图标 ,所有功能(上传、滑块、统计面板)均可正常使用。

验证小技巧:打开浏览器开发者工具(F12)→ Network 标签页 → 刷新页面 → 查看所有请求的 Protocol 列是否均为 h2(HTTP/2)或 https,且无红色 blocked 提示。


4. 方案二:无域名快速验证(开发/测试场景)

没有备案域名?没关系。我们提供两种零成本、免备案的替代方案,同样支持完整 HTTPS。

4.1 使用 ngrok 创建临时 HTTPS 隧道

适合:本地开发机、测试环境、临时演示。

  1. 下载并登录 ngrok(https://ngrok.com/download
  2. 运行隧道命令(自动分配随机 HTTPS 地址):
ngrok http 5000

你会看到类似输出:

Forwarding                    https://a1b2-c3d4-e5f6-g7h8.ngrok-free.app -> http://localhost:5000

复制 https://... 链接,在手机或任意设备打开,即可安全访问 DAMO-YOLO —— 无需配置 Nginx,无需证书,开箱即用

进阶:如需固定子域名(如 https://damo.ngrok.io),注册免费账号后使用 ngrok http --domain=damo.ngrok.io 5000

4.2 使用自签名证书 + 本地 Nginx(内网可信环境)

适合:企业内网、实验室局域网、离线环境。

  1. 生成自签名证书(有效期 365 天):
sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/damo-yolo.key \
  -out /etc/nginx/ssl/damo-yolo.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=Wuli-Art/CN=localhost"
  1. 修改 Nginx 配置(替换原 damo-yolo 文件):
server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /etc/nginx/ssl/damo-yolo.crt;
    ssl_certificate_key /etc/nginx/ssl/damo-yolo.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

    location / {
        proxy_pass http://127.0.0.1:5000;
        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;
        client_max_body_size 50M;
    }
}

server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}
  1. 重启 Nginx:
sudo nginx -t && sudo systemctl restart nginx

访问 https://localhost,浏览器会提示“您的连接不是私密连接”——点击“高级” → “继续前往 localhost(不安全)”,即可进入。
此方案下,所有前端 JS 调用(如 fetch('/api/detect'))将因同源策略正常工作,不再被拦截。

关键点:自签名证书仅需在首次访问时手动信任一次,后续所有交互(包括摄像头调用)均不受影响。


5. 常见问题排查与优化建议

即使严格按步骤操作,也可能遇到细节问题。以下是真实部署中高频出现的 4 类情况及解法:

5.1 图片上传失败,控制台报 net::ERR_CONNECTION_REFUSED

  • 原因:Nginx 代理未正确传递请求头,或 Flask 服务未监听 0.0.0.0
  • 检查项
    • curl -I http://127.0.0.1:5000 是否返回 200 OK
    • sudo ss -tuln | grep ':5000' 是否显示 *:5000
    • Nginx 配置中 proxy_pass 后是否有多余斜杠(如 http://127.0.0.1:5000/ → 应为 http://127.0.0.1:5000

5.2 界面打开但无识别框,左侧面板统计数为 0

  • 原因:HTTPS 下浏览器禁止混合内容(HTTP 资源加载)
  • 典型表现:浏览器控制台报 Mixed Content: The page at 'https://...' was loaded over HTTPS, but requested an insecure resource 'http://...'
  • 解法
    • 确保 Nginx 配置中 proxy_set_header X-Forwarded-Proto $scheme; 已启用

    • 在 Flask 应用中(app.py),添加如下代码,强制 URL 生成使用 HTTPS:

      @app.before_request
      def force_https():
          if request.headers.get('X-Forwarded-Proto') == 'http':
              url = request.url.replace('http://', 'https://', 1)
              return redirect(url, code=301)
      

5.3 滑块拖动无响应,或阈值调节后界面不刷新

  • 原因:Nginx 缓存了前端静态资源(CSS/JS),导致新版本未加载
  • 解法
    • 清空浏览器缓存(Ctrl+Shift+R 强制刷新)

    • 临时禁用 Nginx 缓存(在 location / 块中添加):

      location / {
          # ... 其他 proxy_ 配置
          add_header Cache-Control "no-cache, no-store, must-revalidate";
          add_header Pragma "no-cache";
          add_header Expires 0;
      }
      

5.4 大图上传超时(>2MB 图片卡住)

  • 原因:Nginx 默认 client_max_body_size 为 1MB

  • 解法:在 location / 块中显式设置:

    client_max_body_size 50M;
    

    并确保 http { } 全局块中也设置(防止 location 外部请求失败):

    http {
        client_max_body_size 50M;
        # ... 其他配置
    }
    

6. 安全加固与生产就绪建议

完成 HTTPS 接入只是第一步。面向真实业务场景,还需补充三项关键加固:

6.1 添加基础访问控制(IP 白名单)

限制仅公司内网或指定 IP 可访问,防止暴露在公网上:

# 在 server {} 块内添加
allow 192.168.1.0/24;    # 公司内网段
allow 203.0.113.42;      # 运维人员固定 IP
deny all;

6.2 启用 HSTS(强制 HTTPS)

防止 SSL Stripping 攻击,让浏览器记住必须用 HTTPS:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

6.3 日志分离与监控

将 DAMO-YOLO 的访问日志独立出来,便于审计:

access_log /var/log/nginx/damo-yolo-access.log;
error_log /var/log/nginx/damo-yolo-error.log;

7. 总结:从本地 Demo 到安全服务的关键跨越

你刚刚完成的,不只是一个 Nginx 配置任务,而是将 DAMO-YOLO 从「个人可玩」升级为「团队可用」「客户可信」的关键一步。

回顾整个过程,你掌握了:

  • 如何诊断 Flask 服务的网络可见性问题
  • 如何用 Nginx 实现零代码修改的反向代理
  • 如何用 Let’s Encrypt 一键获取受信 HTTPS 证书
  • 如何在无域名场景下,用 ngrok 或自签名证书快速验证
  • 如何排查混合内容、上传超时、缓存失效等真实问题
  • 如何添加 IP 白名单、HSTS、独立日志等生产级安全措施

更重要的是:所有这些操作,都不依赖 DAMO-YOLO 源码修改,不改动模型路径,不重装任何 Python 包。你只是在系统外围架设了一层“安全网关”,既保护了用户数据,又保留了原有赛博朋克 UI 的全部交互体验。

下一步,你可以尝试:
🔹 将 DAMO-YOLO 接入企业微信/钉钉机器人,实现检测告警自动推送
🔹 用 FFmpeg 拉取 RTSP 摄像头流,实现实时视频帧检测(需扩展后端)
🔹 部署多个实例 + Nginx 负载均衡,支撑百路并发分析

技术的价值,永远不在炫酷的算法,而在它能否被安全、稳定、低成本地交付到真正需要它的人手中。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐