+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