nginx 代理 oss 是构建轻量可控静态资源分发方案,通过缓存优化、安全收敛与成本控制提升性能;需配置 proxy_cache、upstream、防盗链及 tls 加固,并验证 x-cache 响应头与 ttfb。

直接用 Nginx 代理 OSS(如阿里云 OSS、腾讯云 COS 或 S3)做 CDN 前端,不是“完全替代 CDN”,而是构建一个轻量、可控、可调试的高性能静态资源分发原型——核心在于利用 Nginx 的缓存能力 + OSS 的海量存储 + HTTP 协议级优化,绕过商业 CDN 的中间层,实现低延迟、高并发、低成本的静态内容交付。
一、为什么用 Nginx 代理 OSS 而不直连?
OSS 提供公网 Endpoint,但直接暴露给终端用户存在几个实际问题:
- 无法精细化缓存控制:OSS 默认缓存策略有限(如仅支持简单 Cache-Control),而 Nginx 可按路径、状态码、文件类型灵活设置 max-age、stale、revalidate 等;
- 缺少请求优化与安全收敛:Nginx 可统一处理防盗链(Referer / Token 验证)、压缩(gzip / brotli)、HTTP/2 / HTTP/3 升级、URL 重写、限速限连;
- 规避 OSS 公网带宽成本波动:通过 Nginx 缓存命中大幅降低回源次数,尤其对热门资源(如 logo、JS/CSS、图片),节省 70%+ 回源流量;
- 统一入口 & 灰度发布能力:多个 OSS Bucket、甚至混合源(OSS + 本地静态目录)可由 Nginx 路由调度,便于灰度、AB 测试或故障切换。
二、关键配置实战(以阿里云 OSS 为例)
假设 OSS Bucket 域名为 myapp.oss-cn-hangzhou.aliyuncs.com,自定义域名已绑定为 static.example.com,我们让 Nginx 对外提供 cdn.example.com 作为 CDN 入口。
1. 启用 proxy_cache 并定义缓存区
在 http 块中添加:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=oss_cache:256m max_size=20g inactive=3d use_temp_path=off;
说明:keys_zone 是内存索引区(256MB 可存约 800 万 key),max_size 控制磁盘上限,inactive=3d 表示 3 天未被访问则自动清理。
2. 配置 upstream 与 server 块
upstream oss_backend {
server myapp.oss-cn-hangzhou.aliyuncs.com resolve;
keepalive 32;
}
<p>server {
listen 80;
server_name cdn.example.com;</p><pre class="brush:php;toolbar:false;"># 强制 HTTPS(生产环境务必启用)
return 301 https://$host$request_uri;}
server { listen 443 ssl http2; server_name cdn.example.com;
ssl_certificate /etc/nginx/ssl/cdn.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/cdn.example.com.key;
# 关键:开启缓存
proxy_cache oss_cache;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
# 透传关键头 & 清除上游干扰头
proxy_set_header Host myapp.oss-cn-hangzhou.aliyuncs.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Oss-Server-Time;
proxy_hide_header X-Oss-Request-Id;
# 防盗链(按需开启)
valid_referers none blocked *.example.com;
if ($invalid_referer) {
return 403;
}
# 静态资源路由(所有请求转发到 OSS)
location / {
proxy_pass https://oss_backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
}
# 可选:对特定后缀强制缓存更久
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
proxy_cache_valid 200 302 1y;
}}
三、必须做的性能与安全加固
-
启用 OCSP Stapling:减少 TLS 握手时的证书吊销查询延迟,在 SSL 配置块中加入:
ssl_stapling on;<br>ssl_stapling_verify on;<br>resolver 8.8.8.8 114.114.114.114 valid=300s;
-
限制连接与请求频率:防恶意刷量,例如每 IP 每秒最多 10 个请求:
limit_req_zone $binary_remote_addr zone=cdn_limit:10m rate=10r/s;<br>limit_req zone=cdn_limit burst=20 nodelay;
-
关闭 Server 签名 & 隐藏版本号:在
http块加server_tokens off;; -
OSS 端最小权限授权:Nginx 回源账号仅授予
oss:GetObject权限,禁用 List/Bucket 操作,避免信息泄露。
四、验证与可观测性要点
部署后别急着上线,用以下方式快速验证效果:
-
看响应头:访问资源,检查是否返回
X-Cache: HIT或MISS(需在 Nginx 中添加add_header X-Cache $upstream_cache_status;); - 测首字节时间(TTFB):对比直连 OSS 和走 Nginx 的 TTFB,缓存命中时应
-
查日志确认缓存行为:打开
log_format记录$upstream_cache_status和$request_time; -
模拟回源失败:临时屏蔽 OSS 域名解析,观察是否返回
502还是缓存 stale 内容(取决于proxy_cache_use_stale配置)。
这不是一个“开箱即 CDN”的方案,而是一套可深度定制、可监控、可演进的静态分发基座。它适合中小规模业务快速落地、对缓存策略有强诉求的场景,也适合作为理解现代 CDN 工作原理的实践入口。真正上生产前,建议搭配 Prometheus + nginx-vts-exporter 做缓存命中率、回源速率等核心指标监控。











