Nginx 作为企业级 CDN 边缘节点需深度配置 proxy_cache、动静分离与浏览器缓存协同、回源安全加固。关键包括:定义高效磁盘缓存区;按资源类型设置差异化缓存策略;启用 stale、lock、background_update 提升可用性;配合 expires 与 immutable 实现强缓存;通过限速、白名单、健康检查保障回源稳定。

要让 Nginx 真正承担起企业级静态资源 CDN 加速节点的角色,不能只靠简单反代或加个 expires。关键在于把 Nginx 当作“边缘缓存服务器”来设计:既要高效响应用户请求,又要智能回源、可控缓存、抗压防刷,并与公共 CDN 或自建 CDN 平滑协同。
一、Nginx 作为 CDN 边缘节点的定位与架构选型
企业级场景下,Nginx 不应只是源站代理,而应部署在离用户更近的位置(如骨干网 POP 点、IDC 边缘机房),直接对外提供 static.example.com 域名服务。典型拓扑为:
- 用户 → DNS 解析到最近的 Nginx 边缘节点(通过 GeoDNS 或 Anycast)
- Nginx 节点本地命中缓存 → 直接返回,毫秒级响应
- 未命中 → 按策略回源(可指向主源站、对象存储 OOS/S3,或上层商业 CDN 的回源地址)
- 回源响应带标准缓存头(
Cache-Control: public, immutable)→ Nginx 自动写入本地磁盘缓存
二、核心缓存模块深度配置(proxy_cache)
启用 Nginx 内置缓存是构建自控 CDN 节点的基石。需在 http 块中定义缓存区,并在 server 或 location 中启用:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cdn_cache:200m inactive=7d max_size=100g use_temp_path=off;
-
keys_zone=cdn_cache:200m:200MB 共享内存用于存储缓存键和元数据,支撑千万级文件索引 -
inactive=7d:7 天内未被访问的缓存自动清理,避免磁盘堆积 -
max_size=100g:磁盘缓存上限,超出时按 LRU 清理最久未用项 -
use_temp_path=off:禁止使用临时目录,提升 IO 效率
在静态资源 location 中调用:
location ~* \.(js|css|png|jpg|webp|woff2|ttf|svg|ico|gif)$ {
proxy_cache cdn_cache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 304 302 365d;
proxy_cache_valid 404 10m;
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_cache_background_update on;
<pre class="brush:php;toolbar:false;">proxy_pass https://origin-upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
三、动静分离 + 浏览器强缓存双生效
CDN 边缘节点加速效果 = 本地缓存命中率 × 浏览器缓存复用率。二者必须协同:
- 对带哈希指纹的构建产物(如
app.a1b2c3.js),Nginx 配置expires 1y; add_header Cache-Control "public, immutable";,浏览器永不重验 - 对无指纹资源(如
logo.png),设较短周期(如expires 7d)并配合 ETag/Last-Modified,支持协商缓存 - 禁用不安全头:
add_header X-Content-Type-Options nosniff;、add_header X-Frame-Options DENY;
四、回源安全与稳定性加固
防止恶意刷量、绕过 CDN、源站暴露,需多层防护:
- IP 白名单回源:仅允许已知 CDN 节点段或上游负载均衡 IP 访问静态路径,其余
deny all - 限速限连:用
limit_req控制单 IP 请求频次(如burst=10 nodelay),防爬虫打爆缓存 - 健康检查:搭配
upstream的max_fails=3 fail_timeout=30s,自动屏蔽故障源站 - 回源超时收紧:
proxy_connect_timeout 3s; proxy_send_timeout 5s; proxy_read_timeout 10s; - 添加调试头:
add_header X-Cache-Status $upstream_cache_status;,便于前端和运维快速识别是否命中











