+86 135 410 16684Mon. - Fri. 10:00-22:00

一次 CDN 源站流量暴增的问题分析

一次 CDN 源站流量暴增的问题分析

一次 CDN 源站流量暴增的问题分析

上周经历了一次 CDN 源站流量暴增的问题,原因是有 CDN 有一批文件过期,大量回源。

CDN 回源过程:

1. 第一次回源,如果源站返回 Last-Modified 头,CDN 会记录下来;

2. CDN 的文件过期后,如果源站之前已经返回了 Last-Modified 头,就以 If-Modified-Since 头(内容是 源站返回的Last-Modified 值) 来访问源站,如果文件未变更,则返回 304;如果之前源站没返回  Last-Modified 头,则会下载整个文件,源站返回 200。

流量暴增的问题就出现在源站不返回 Last-Modified 头上,解决方法是源站返回 Last-Modified 头。

但是需要注意几点,先看看源站前面的 Nginx 配置文件:

location ~ /(?<name>.+?)/.* {
expires 100d;

rewrite ^/.+?/(.*)$ /$1 break;

proxy_cache m_wdjcdn_com;
proxy_cache_key “$request_uri”;
proxy_cache_valid 200 30d;

proxy_set_header Host $name.cdn.xxxx.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://new-source-nodes;
}

 

1. 如果源站文件放在本地硬盘(使用 root 指令) 而不是通过 proxy_pass 打到后端,就不会出现这个问题,因为 Nginx 对静态文件完全支持 Last-Modified 和 If-Modified-Since 语义;

2. 如果没有 proxy_cache 指令,即使源站返回 Last-Modified,也不会有 304,因为 Nginx 不会把头保存下来,而当有文件 cache 到本地硬盘上时,则会保存,所以可以返回 304;

3. Nginx 有一个指令 if_modified_since,默认是 exact,表示 If-Modified-Since 头的值必须和上次获取的 Last-Modified 值一致,否则还会 200;可以把 if_modified_since 改成 before,表示 If-Modified-Since 值可以比 Last-Modified 值大,也就是更新。

 

http://nginx.org/en/docs/http/ngx_http_core_module.html 

北京 上海 天津 重庆 河北 山东 辽宁 黑龙江 吉林 甘肃 青海 河南 江苏 湖北 湖南 江西 浙江 广东 云南 福建 海南 山西 四川 陕西 贵州 安徽 广西 内蒙古 西藏 新疆 宁夏 澳门 香港 台湾