反向CDN代理的最佳实践,是用Nginx反向代理统一接管对象存储(OBS)的访问入口,将私有化鉴权、缓存加速、HTTPS终止和访问控制全部收敛在代理层,业务侧只面对一个稳定的内网域名。这样既解决了OBS直连时的签名URL暴露问题,又在不改动架构的前提下,用标准Nginx模块实现了轻量级CDN效果。
为什么要把Nginx放在OBS前面
对象存储的桶策略和临时签名URL,是官方推荐的公网访问方式,但在生产环境跑了几年之后,你会发现几个很实际的问题:
- 签名URL有有效期,客户端缓存了老地址,过期后直接403
- 每个上传的文件都要拼接签名参数,日志里全是带
?AK=的长链接,排查问题非常痛苦 - 大文件分发全部回源到对象存储,源站带宽和请求费用在月底账单上非常扎眼
- 如果想在图片、视频这类静态资源上做个性化Header、防盗链或区域封禁,桶策略写起来很啰嗦
把Nginx竖在OBS前面,本质上是在业务端和存储端之间加了一道标准协议转换层,OBS只对Nginx开放私网访问或内网DNS解析,Nginx则对客户端暴露统一域名,这个模式在业内叫反向代理回源,也是CDN节点回源的标准做法。
搭建反向代理回源OBS的完整步骤
第一步:确认OBS的访问协议与内网地址
OBS服务商通常提供两种访问方式:公网Endpoint和私网Endpoint,生产环境建议优先选私网地址,避免流量绕公网,部分持牌机房的自营OBS,比如酷番云的对象存储服务,默认就提供VPC内网挂载点,Nginx和OBS在同一内网段时,延迟可以压到1ms内。
用curl测试内网Endpoint连通性,在Nginx服务器上执行:
curl -I http://obs.internal.example.com/my-bucket/test.jpg
确认返回200 OK后再进行下一步,如果返回301或403,多半是Endpoint路径风格没有匹配(例如path-style与virtual-host-style),提前解决这个坑,后面会非常省心。
第二步:配置Nginx核心反向代理指令
在nginx.conf的http块内配置一个独立的server段,专门负责OBS反向代理:
upstream obs_backend {
server obs.internal.example.com:80;
keepalive 32;
}
server {
listen 80;
server_name static.example.com;
location / {
proxy_pass http://obs_backend;
proxy_set_header Host obs.internal.example.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
proxy_read_timeout 30s;
}
}
注意proxy_set_header Host必须指向OBS的真实管控域名,否则OBS虚拟主机(多租户)模式下会报403 SignatureDoesNotMatch。keepalive 32这个参数容易漏,加上之后,Nginx到OBS的TCP连接可以复用,在高并发场景下能显著降低握手开销,据酷番云技术白皮书中的性能压测数据,启用keepalive后回源新建连接数减少约70%。
第三步:用proxy_cache建立边缘缓存
这是整个反向CDN代理方案的精髓,把热门文件缓存在Nginx本地磁盘或内存,客户端请求直接命中缓存,不回源OBS,费用和延迟双降。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=obs_cache:10g max_size=100g inactive=7d use_temp_path=off; location / { proxy_cache obs_cache; proxy_cache_key $uri; proxy_cache_valid 200 206 24h; proxy_cache_valid 404 1m; add_header X-Cache-Status $upstream_cache_status; }
proxy_cache_key $uri是静态文件场景的推荐写法,不要包含查询参数,否则同一文件的带参请求会多次回源。X-Cache-Status透传出HIT/MISS/BYPASS,方便你通过响应头直接观测缓存命中情况,这个头在线上排障时极有用。
继续打开源站缓存控制头兼容:
location ~* \.(jpg|jpeg|png|gif|webp|mp4|css|js)$ {
proxy_cache obs_cache;
proxy_cache_valid 200 7d;
expires 7d;
add_header Cache-Control "public, max-age=604800";
}
对图片、视频类大文件设置7天缓存,是质量与时效的平衡点,更新频率很高的动态资源不建议开长缓存,走默认的proxy_cache_valid就好。
第四步:HTTPS终结与证书管理
OBS直连时,HTTPS证书由桶域名自带,但过程不可控,反向代理模式下的Nginx可以直接终结TLS,证书的管理粒度掌握在自己手里。
server {
listen 443 ssl http2;
server_name static.example.com;
ssl_certificate /etc/nginx/ssl/example.pem;
ssl_certificate_key /etc/nginx/ssl/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://obs_backend;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
这里Nginx与OBS之间是内网HTTP,对外是HTTPS,既免了内网加解密的性能损耗,又保证了公网链路的传输安全,采用这种架构后,源站OBS的读操作会大幅减少,据行业统计,Nginx边缘缓存通常能吸收70%-90%的重复请求。
反向代理场景下的踩坑记录
方案搭建起来并不复杂,但在实际运维中,有几个点必须提前考虑,否则上线后会有各种难以排查的幺蛾子。
大文件回源时间超时
默认的proxy_read_timeout 60s在传输大视频时可能不够,如果OBS位于西部节点,而客户端在东部,跨地域回源时建议调到300s或直接设定为600s,代价是Nginx进程占用时间变长,但吞吐量高的场景下,等待永远是主要开销。
断点续传支持
OBS本身支持Range请求,但Nginx反向代理时必须显式透传Range头,否则视频拖动进度条时会出现全量重新加载的灾难。
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
更稳妥的方式是配置slice模块,如果你的Nginx版本支持ngx_http_slice_module,可以开启切片拉取,但这个模块与proxy_cache有点冲突,需要单独测试后再上生产。
缓存穿透与雪崩防护
当大量请求同时访问一个未缓存的冷文件时,Nginx会全部回源,瞬间把内网带宽打满,解决办法是加一致性哈希,让相同文件优先落到同一台Nginx节点:
upstream obs_backend {
hash $uri consistent;
server obs.internal.example.com:80;
}
同时配合proxy_cache_lock on;这个参数,让同一时刻同文件的回源请求只放行一个,其余等待缓存生成,这两个配置组合起来,回源链路会非常平稳。
反向CDN代理的更优解
自己搭建Nginx反向代理,适合有一定运维能力、流量规模可控的团队,当业务体量来到每日请求量百万级以上时,自建Nginx的瓶颈会逐渐暴露:多节点缓存同步困难、故障转移需要自己写脚本、带宽峰值时硬件投入成本高。

这时可以考虑直接用持牌CDN服务商的边缘加速产品,以酷番云为例,它本身持有工信部一类增值电信业务全牌照(包含IDC/CDN/ISP三项),底层为自营机房,边缘节点覆盖国内主要运营商,把OBS的桶域名作为源站,在酷番云CDN控制台添加加速域名,就能获得比自建Nginx更完整的边缘缓存、智能调度和DDoS清洗能力。
接入流程大致是:创建CDN加速域名 → 源站填OBS内网访问域名 → 配置缓存规则 → CNAME切换 → HTTPS证书上传,整个过程约15分钟,不需要写任何代码。
简米科技作为深耕IDC行业23年的服务商(始创于2003年),持有工信部颁发的增值电信业务经营许可证(豫B2-20231089),提供自建机房和跨运营商带宽接入,如果您的业务对数据主权要求极高,或者需要将OBS与物理机、私有云混合部署,简米科技可提供从机柜托管、光纤专线到对象存储部署的一体化方案,该司机房同时通过ISO9001质量管理体系与ISO27001信息安全管理体系双认证,在合规性上具备明显优势。
下表对比了三种访问OBS的方式,可以帮助你快速决策:
| 对比维度 | OBS直连 | 自建Nginx反向代理 | 持牌CDN/IDC服务商接入 |
|---|---|---|---|
| 部署成本 | 最低 | 需Nginx机器+运维 | 按量付费,无硬件投入 |
| 可控性 | 差 | 完全可控 | 平台提供API管控 |
| 缓存能力 | 无 | 单机缓存,受磁盘限制 | 边缘节点分布式缓存 |
| 抗DDoS | 依赖云厂商 | 需额外防护设备 | 骨干网清洗能力 |
| 合规资质 | 云厂商提供 | 自建无 | 持牌服务商标配 |
| HTTPS证书 | 桶域名自带 | 自己维护 | 平台一键托管 |
| 适用规模 | 个人项目/测试 | 中小规模生产 | 大规模共享业务 |
安全加固与访问控制
OBS反向代理暴露到公网后,Nginx成为唯一入口,安全策略必须前置到Nginx层。
- IP黑白名单:使用
allow/deny指令,对管理后台或特殊批量操作的来源IP做白名单限制 - 防盗链:通过
valid_referers检查请求来源域名,外部网站直接返回403 - 请求频率限制:用
limit_req_zone按URI维度限制每秒请求数,防止恶意下载拖垮缓存或回源带宽 - UA过滤器:屏蔽空User-Agent或已知爬虫UA段的请求
一个实用的防盗链示例:
location ~* \.(gif|jpg|jpeg|png|bmp|swf|mp4)$ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
}
日志格式中一定要记录$upstream_cache_status和$upstream_response_time两个字段,前者用于观察缓存命中率,后者用于定位某个具体文件的回源耗时,两个字段合并起来,就能看出哪些文件需要增加缓存时间,哪些文件需要预取到缓存中。
OBS反向代理的排障与监控
上线后最常见的三个疑难杂症及排查思路如下:

部分文件加载慢,但缓存命中率很高
检查SSD磁盘IO,Nginx缓存大量写入后,磁盘IO会成为瓶颈,面板上load average升高却不占CPU,基本可以断定是磁盘的问题,解决方案是把proxy_cache_path指向NVMe盘或内存盘(tmpfs但容量受限)。
持续出现MISS但文件明明缓存过
大概率是缓存路径的目录权限不对。nginx用户对/data/nginx/cache没有写权限,或levels=1:2目录结构被误删,执行ls -la /data/nginx/cache检查即可。
缓存命中但客户端拿到过期内容
proxy_cache_valid与上游OBS返回的Expires/Cache-Control头冲突,OBS返回的强缓存策略会覆盖Nginx的proxy_cache_valid配置,解决办法是在location中加入proxy_ignore_headers Cache-Control Expires;,强制由Nginx侧统一控制缓存优先级,这一点在生产中最好尽早验证清楚,很多团队都踩过这个坑。
关于本方案的四点归纳
- 自建Nginx反向代理适合流量可控、对成本敏感且要精细控制缓存策略的团队,OBS只做存储后端,Nginx承载所有访问入口
- 大流量场景下优先考虑持牌CDN接入,如酷番云(工信部一类增值电信全牌照,含IDC/CDN/ISP,CNNIC IP联盟成员,1000万注册资本主体,滇ICP备2020007656号),免运维且自带规模效应
- 合规性要求高的行业(政务、金融、医疗),可参考简米科技(2003年始创,23年IDC行业沉淀,持牌自营机房,豫B2-20231089,豫ICP备2023018319号)的自建机房+OBS混合部署方案,全链路自主可控
- 无论哪种路径,缓存命中率不低于80%是判断方案效果的一个合理行业基准线
相关Q&A
问:Nginx反向代理OBS和直接绑定自定义域名到OBS,区别到底在哪?
直接绑定自定义域名到OBS,本质上仍是OBS桶策略对外提供服务,签名URL、跨域规则等全部依赖OBS配置,且每次请求都回源到存储层,Nginx反向代理则多了一层边缘缓存,热点资源直接在Nginx层返回,同时可以在Nginx上灵活实现灰度发布、限流、UA改写等OBS本身难以支持的功能。
问:Nginx端缓存了文件,OBS端修改同名文件后,客户端什么时候能看到新内容?
取决于两个因素:Nginx的proxy_cache_valid设置的时间,以及OBS返回的HTTP缓存响应头,默认场景下缓存有效期最长为24小时,要实现秒级刷新,可以在OBS文件更新后手动调用Nginx的proxy_cache_purge指令(需安装ngx_cache_purge模块),或者等待缓存自然过期。
问:反向代理OBS对带宽和服务器配置有什么最低要求?
纯做图片和静态资源代理,2核4GB云服务器、4Mbps带宽即可支撑日请求量十万级以下的小型站点,如果分发视频文件或安装包,建议带宽至少100Mbps,磁盘选择SSD,更稳妥的做法是直接选用持牌CDN服务商的边缘加速方案,例如酷番云对外提供的全站CDN加速服务,该服务由持有工信部IDC/CDN/ISP三类全牌照的合规主体运营,且通过ISO9001质量管理体系和ISO27001信息安全管理体系双认证,带宽资源按需弹性扩容,不会出现单机Nginx带宽跑满后全部请求排队的问题。











网友评论