没有阅读过《解密Hostker&主机壳CDN——Nginx篇》的读者,需要看一遍我们 CDN 的流程图:
在完成 Nginx 部分之后,请求移交到 Squid 手中。
Squid 会根据这个 URL 访问的频繁程度,决定放置于我们 CDN 节点的内存还是硬盘中进行缓存,访问越频繁越有可能进入内存缓存,其次是硬盘,在硬盘塞满后,访问最少的 URL 将会被删除缓存。
我们的 Squid 默认会把全部请求转发后端确认是否更新,如果后端返回了 Expires 头或者 max-age,将会根据用户自定义的时间进行缓存。缓存期间不会到后端确认是否更新,直接 HIT 命中缓存。客户端浏览器也会根据这两个头进行缓存而不会向 CDN 发出请求,从而加快访问速度。
用户只需要在 .htaccess 写好相应规则,我们的 CDN 和客户端浏览器就能同时收到该缓存规则并依照规则执行。具体规则示例:
ExpiresActive On
ExpiresByType application/x-javascript “access plus 1 month”
ExpiresByType text/html M604800
<FilesMatch “\.(xls|ppt|doc)$”>
ExpiresDefault A9030400
</FilesMatch>
- ExpiresActive On 表示开启缓存模块;
- ExpiresByType [type] [rule] 其中 ExpiresByType 表示根据 MIME 类型执行缓存规则,type 表示 MIME 类型,rule 表示缓存规则;
- ExpiresDefault [rule] 其中 ExpiresDefault 表示默认的缓存规则,rule 表示缓存规则。细分如下:
- “access plus 1 month” 其中 access 表示从用户访问的时间(CDN 节点是根据 CDN 访问后端的时间)算起,plus 表示增加,1 month 表示 1 个月。
同理可以使用 3 days 表示 3 天,1 hours 表示 1 小时,2 minutes 表示 2 分钟。可以连着用 “access plus 1 month 2 days 5 hours 9 minutes” 表示从用户访问后的 1 个月 2 天 5 小时 9 秒内缓存有效,无需找后端确认修改时间; - M604800 表示从文件的修改时间开始缓存 604800 秒(一周);
- A9030400 是 access plus 的另一个用法,同理 M604800 可以写为 “modification plus 7 days”。
※ 多说一点 Apache 和 HTTP 相关的小知识:
- FilesMatch 是根据文件名制定相应规则,双引号内的内容为正则表达式,上面示例是匹配文件名后缀为 xls 或者 ppt 或者 doc 的文件。关于正则表达式有兴趣的用户可以去网上寻找相关资料学习。
- Expires 头和 max-age 可以用 PHP 的 header() 函数模拟发送,靠 .htaccess 主要是为了让静态文件得到缓存。
- Expires 头内容缓存的过期时间,格式示例:Tue, 19 Feb 2013 15:34:21 GMT
- max-age 位于 Cache-Control 头里面,单位是秒,比如 300 秒过期示例:Cache-Control: max-age=300
这样一来,我们就无需专门为 CDN 开发缓存控制面板,用户可以使用 .htaccess 或者 PHP 灵活控制所有的文件的 CDN 缓存规则。
至此,CDN 相关的技术大概介绍完毕,接下来是运算节点的介绍。