CDN边缘鉴权与Nginx源站双轨制架构实践
如果让 Nginx 源站做 secure_link 鉴权,CDN 就无法有效缓存(因为每个用户的鉴权参数都不同,Cache Hit 为 0);如果让 CDN 忽略参数强制缓存,防盗链就形同虚设,黑客可以直接绕过签名白嫖你的静态资源。
经过不断调优,最终梳理出了一套解决方案:CDN 边缘鉴权 + 源站暗号保护 + Nginx/API 双轨制路由。
核心架构思想
这套架构的核心在于:把防盗链的计算压力推给 CDN 边缘节点,让源站 Nginx 只负责给“自己人”供货。
我们将流媒体下发拆分为两条独立的安全轨道:
- 【轨道 A - 面向公网】:用户 $\rightarrow$ CDN 节点 (Type A 鉴权) $\rightarrow$ 校验通过 $\rightarrow$ 携带专属暗号回源 $\rightarrow$ Nginx 放行。
- 【轨道 B - 面向直连】:管理员/内部服务 $\rightarrow$ Nginx 源站 (Secure Link 鉴权) $\rightarrow$ 校验 MD5 签名 $\rightarrow$ 放行。
密钥规划(三把锁)
为了保证绝对安全,系统需要三套完全隔离的密钥/暗号:
- **API 密钥 (
API_SECRET_KEY)**:保护后端接口不被滥用。 - **CDN 鉴权密钥 (
CDN_SECRET_KEY)**:用于 URL 签名计算,建议使用 32 位随机字符(如8kP3mN9vL2qZ5wY1nC7yT0bH6fD4gE2x)。 - **源站回源暗号 (
ORIGIN_AUTH_HEADER)**:CDN 向源站要文件时的接头暗号(如SuperSecretOriginKey998877)。
CDN 控制台配置
在云厂商(腾讯云/阿里云等)的 CDN 控制台完成以下三步:
- 开启 URL 鉴权 (高级鉴权)
- 类型选择:
类型 A(Type A) - 主 KEY:填入你的
CDN_SECRET_KEY - 有效时间:
10800秒(3 小时)
- 类型选择:
- 配置回源 HTTP 请求头
- 增加头部:
X-CDN-Auth - 头部内容:填入你的
ORIGIN_AUTH_HEADER
- 增加头部:
- 配置缓存规则(精髓所在)
- 对
/secure_media/目录设置为 全部忽略参数。 - 注:正因为 CDN 节点已经做了鉴权,这里忽略参数后,所有合法请求都会共享同一份 FLAC 缓存,源站带宽消耗降为 0!
- 对
Nginx 源站双轨配置
改造 Nginx 配置,卸下单一的 secure_link 防备,升级为智能双轨裁决:
1 | location /secure_media/ { |
FastAPI 后端智能路由
最后,让我们的后端接口根据客户端的请求头,智能生成对应轨道的播放直链:
1 | import time |
总结
这套方案完美解决了动静分离中的安全与性能痛点:
- 100% 缓存命中:大文件流量全被 CDN 挡下,源站服务器岁月静好。
- 零带宽盗链:鉴权计算在边缘节点完成,非法请求根本打不到源站。
- 高度灵活:内网管理工具或 Navidrome 同步可直接绕过 CDN 走直连轨道,提升效率。
实测下来,哪怕几千首无损 FLAC 批量流转并发,服务器依然稳如泰山。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Meng's blog!