DAMO-YOLO部署教程:HTTPS反向代理配置(Nginx)支持外网安全访问
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,甚至不需要拥有自己的域名——我们也会演示如何用临时域名(如 ngrok 或 localtunnel)配合自签名证书快速验证。
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 域名解析与端口开放
-
登录你的域名服务商后台(如阿里云、腾讯云、Cloudflare),添加一条 A 记录:
- 主机名:
vision(或ai、detect等你喜欢的子域名) - 记录值:填写你部署 DAMO-YOLO 的服务器公网 IP
- TTL:默认即可(通常 600 秒)
- 主机名:
-
确保服务器防火墙放行 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 隧道
适合:本地开发机、测试环境、临时演示。
- 下载并登录 ngrok(https://ngrok.com/download)
- 运行隧道命令(自动分配随机 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(内网可信环境)
适合:企业内网、实验室局域网、离线环境。
- 生成自签名证书(有效期 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"
- 修改 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;
}
- 重启 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 OKsudo 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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐



所有评论(0)