在使用京东云CDN提速静态资源时,为了实现最佳性能和用户体验,Nginx的缓存策略需要与CDN协同工作,避免重复缓存、资源更新延迟等问题。以下是针对京东云CDN场景下Nginx缓存策略的优化建议:
一、明确缓存层级:Nginx + CDN 的角色划分
| 层级 | 作用 | 优化目标 |
|---|---|---|
| Nginx(源站) | 源服务器,提供静态资源 | 减少回源压力,支持高效缓存 |
| 京东云CDN | 边缘节点缓存 | 提高用户访问速度,降低源站负载 |
原则:
- Nginx 缓存主要用于减少源站内部的磁盘I/O或上游请求。
- CDN 是主要的缓存层,应承担大部分用户请求。
- Nginx 不应缓存过长时间,避免CDN回源时获取陈旧内容。
二、Nginx 缓存配置优化策略
1. 启用 Nginx Proxy Cache(可选,适用于反向X_X场景)
如果Nginx作为反向X_X(如X_X到后端应用服务器),可启用缓存减少后端压力:
# 定义缓存区
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static:10m inactive=60m max_size=1g;
server {
listen 80;
server_name static.yourdomain.com;
# 静态资源路径
location ~* .(jpg|jpeg|png|gif|ico|css|js|svg|woff2|ttf)$ {
# 启用缓存
proxy_cache static;
proxy_cache_valid 200 304 1h; # 缓存成功响应1小时
proxy_cache_valid 404 5m; # 404也缓存5分钟,防止频繁查询
proxy_cache_use_stale error timeout updating; # 后端异常时使用旧缓存
proxy_cache_lock on; # 防止缓存穿透
# 设置缓存键
proxy_cache_key "$scheme$host$request_uri";
# 指向真实后端(如应用服务器)
proxy_pass http://backend;
# 设置合理的过期头,便于CDN判断
expires 1y;
add_header Cache-Control "public, immutable";
add_header X-Cache-Status $upstream_cache_status;
}
}
⚠️ 注意:如果静态文件直接由Nginx通过
root或alias提供,无需proxy_cache,只需设置响应头。
2. 直接由 Nginx 提供静态文件时的优化
location ~* .(jpg|jpeg|png|gif|ico|css|js|svg|woff2|ttf|pdf)$ {
root /usr/share/nginx/html;
expires 1y;
add_header Cache-Control "public, immutable";
add_header X-Nginx-Cache "HIT";
access_log off; # 静态资源访问日志可关闭,减少I/O
tcp_nopush on;
tcp_nodelay on;
}
关键点:
expires 1y和Cache-Control: public, immutable:明确告诉CDN和浏览器可长期缓存。immutable:适用于带哈希指纹的资源(如app.a1b2c3.js),确保CDN不会频繁回源验证。- 关闭
access_log:减少磁盘写入,提升性能。
三、与京东云CDN的协同优化
1. CDN 缓存规则配置(京东云控制台)
- 设置静态资源缓存时间:建议设置为
1年(365天)。 - 开启“忽略参数缓存”或“忽略特定参数”(如
?v=1.0)。 - 启用“智能压缩”(Gzip/Brotli)。
- 配置缓存刷新策略(如版本更新时主动刷新)。
2. Nginx 响应头对齐 CDN 要求
确保 Nginx 返回的头信息与CDN策略一致:
add_header Cache-Control "public, immutable, max-age=31536000";
add_header Expires "$date_gmt";
add_header Vary Accept-Encoding; # 支持压缩版本缓存
❗ 避免设置
Cache-Control: no-cache或max-age=0,否则CDN不会缓存。
四、版本控制与缓存更新策略
使用文件指纹(如 Webpack 生成的 main.a1b2c3.js)实现“永不缓存过期”:
<script src="/static/main.a1b2c3.js"></script>
当文件内容变化时,文件名变化 → CDN视为新资源 → 自动拉取新内容。
配合京东云CDN的“URL刷新”接口,在发布时主动刷新HTML等非缓存资源。
五、监控与调试
-
查看缓存命中情况:
add_header X-Cache-Status $upstream_cache_status;HIT:Nginx缓存命中MISS:未命中BYPASS:跳过缓存
-
使用
curl -I检查响应头:curl -I https://static.yourdomain.com/app.js -
在京东云CDN控制台查看“命中率”、“回源率”等指标。
六、总结:最佳实践清单
| 项目 | 推荐配置 |
|---|---|
| Nginx 静态资源过期时间 | expires 1y; |
| Cache-Control 头 | public, immutable, max-age=31536000 |
| CDN 缓存时间 | 365天 |
| 文件命名 | 带内容哈希(如 style.abcd1234.css) |
| 缓存刷新 | 发布时刷新HTML,静态资源无需刷新 |
| 日志 | 静态资源关闭 access_log |
| 压缩 | 启用 Gzip/Brotli(Nginx或CDN) |
通过以上优化,Nginx 将作为高效源站,京东云CDN承担主要缓存职责,实现快速响应、低回源率和良好的用户体验。
云计算导航