CDN加速静态资源时如何设置服务器端的缓存过期时间
CDN加速静态资源时,将源站上的资源缓存到距离客户端最近的CDN节点上。当您访问该静态资源时,可直接从缓存中获取,本文主要介绍如何设置服务器端的缓存过期时间。
详细信息
过期时间控制支持三个维度,优先级依次为控制台设置>源站Header设置>Cache的默认策略设置。
关于控制台设置的详细说明,请参见设置缓存过期时间。
关于源站Header设置的详细说明,请参见WebServer缓存策略设置。
Cache的默认策略是在您既没有在控制台设置过期时间,也没有在源站设置过期时间的情况下,会执行一个默认的全局策略,既保证加速效果,又避免因为动态的文件缓存导致的问题。关于Cache的默认策略设置的详细说明,请参见CDN节点默认缓存策略。
说明关于OSS缓存策略设置,请参见设置文件HTTP头。
WebServer缓存策略设置
设置IIS缓存策略详细操作,请参见如何设置IIS缓存策略。
设置Nginx缓存策略详细操作,请参见如何设置Nginx缓存策略。
设置Apache缓存策略详细操作,请参见如何设置Apache缓存策略。
如何设置IIS缓存策略
设置IIS缓存策略的操作步骤如下:
因为整体的站点只对HTML、JPG、PNG、GIF、APK等文件进行缓存,首先将整个站点设置成不缓存,具体操作如下。
打开IIS信息管理器,右键单击服务网站
example.aliyundoc.com
的属性,本文以example.aliyundoc.com
服务网站为例。单击HTTP头,勾选启用内容过期,选择立即过期,单击确定。
上述设置后,整个网站的内容都不会被CDN缓存,接着设置.html、.jpg、.png、.gif、.apk等文件类型的缓存策略。
不同扩展名的文件都单独放在一个特定的目录下面,且该目录没有其他扩展名的文件。针对这个扩展名所在的整个目录设置缓存的时间。具体操作如下。
打开IIS信息管理器。
展开网站
example.aliyundoc.com
的目录,选中需要设置缓存时间的目录,如所有jpg文件都存储在img这个目录下,右键单击该目录并选择属性,单击HTTP头。说明由于步骤1已经设置整个网站不缓存,所以此时HTTP头选项下的缓存设置和步骤1中的相同。
选择此时间段后过期,设置具体的过期时间,单击确定。
特定扩展名的文件不是统一放在唯一的目录,而是和其他扩展名文件混合放在一个目录下。以bin目录下的
test.jpg
为例,介绍缓存设置的操作步骤。说明为了避免针对特定扩展名的文件进行逐个的配置,需要设置IIS支持通配符。
设置IIS支持通配符。
打开IIS信息管理器,右键单击服务网站
example.aliyundoc.com
的属性,选择主目录,单击配置。在弹出的对话框中,单击映射,单击插入。
在弹出的对话框中,选择
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll
文件,单击确定。说明不勾选确认文件是否存在。
分别单击两个对话框中的确定,完成IIS通配符的支持配置。
在bin目录下,选择test.jpg并右键单击,选择属性。
单击HTTP头。
选择此时间段后过期,设置具体的过期时间,单击确定。
设置bin目录下其他相同扩展名文件的缓存时间,此时需要修改IIS的配置文件。具体操作如下。
说明修改文件,需要在服务中关闭IIS admin Service。
用记事本程序打开IIS的配置文件,配置文件在
C:\WINDOWS\system32\inetsrv\MetaBase.xml
(IIS6的设置)目录下。查找
/bin/test.jpg
,找到bin目录下test.jpg文件的缓存设置。将test.jpg改为
*.jpg
并保存。
其他扩展名的文件缓存设置操作同上。
如何设置Nginx缓存策略
HTTP头处理模块(HTTP Headers)允许设置任意的HTTP头,您可以使用add_header和expires命令设置Nginx缓存策略。
指令 | 语法 | 默认值 | 使用字段 |
add_header | add_header name value | none |
|
expires 说明 这个指令控制是否在应答中标记一个过期时间以及如何标记。
| expires [time|epoch|max|off] 说明
| expires off |
|
示例1: 通过nginx.conf配置文件中的expires参数来设置gif、jpg、jpeg、png这几种常见图片类型文件的过期时间为30天。
location ~ .*\.(gif|jpg|jpeg|png)$
{
expires 30d;
}
设置成功后,用户访问jpg类型的文件,服务端返回的信息里面将会包含类似下面这样的内容,其中cache-control: max-age=2592000表示缓存30天。
cache-control: max-age=2592000
content-length: 593
content-type: image/png
date: Sat, 21 May 2022 06:17:18 GMT
expires: Sun, 21 May 2023 06:17:18 GMT
last-modified: Mon, 07 Aug 2017 09:18:19 GMT
server: Teng
示例2: 通过nginx.conf配置文件中的add_header参数来设置js、css、html这三种文件类型在不缓存。
location ~ .*\.(js|css|html)$
{
add_header Cache-Control "no-cache";
}
设置成功后,用户访问JavaScript类型的文件,服务端返回的信息里面将会包含类似下面这样的内容,其中cache-control: no-cache表示不缓存。
cache-control: no-cache
content-type: application/javascript
date: Thu, 09 Mar 2023 12:05:36 GMT
etag: W/"BB528E92046E4069E2B2084CE2CBF65C"
last-modified: Mon, 16 Jan 2023 08:41:35 GMT
server: Tengine
如何设置Apache缓存策略
您可以通过Apache的mod_expires和mod_headers两个模块设置Apache的缓存策略。
mod_expires模块
mod_expires模块允许通过配置文件控制HTTP的Expires和Cache-Control头内容,它的主要作用是自动生成页面头部信息中的Expires标签和Cache-Control标签,从而降低客户端的访问频率和次数,达到减少不必要流量和增加访问速度的目的。
mod_expires是Apache众多模块中配置比较简单的一个,它一共包括三条指令。
ExpiresDefault指令:默认所有文档的过期时间。
ExpiresByType指令:指定MIME类型的文档(如text或html)的过期时间。
ExpiresActive指令:打开或关闭产生
Expires:
和Cache-Control:
头的功能。
过期时间的写法如下。
"access plus 1 month" "access plus 4 weeks" "now plus 30 days" "modification plus 5 hours 3 minutes" A2592000 M604800
说明access
、now
和A
这三种写法的意义相同,都是指过期时间从访问时开始计算。modification
和M
的意义相同,指过期时间从被访问文件的最后修改时间开始计算。
本种写法只对静态文件起作用,对于由脚本生成的动态页面无效。配置实例如下。
ExpiresActive On(开启mod_expires功能) ExpiresDefault "access plus 6 months"(默认的过期时间是6个月) ExpiresByType image/* "access plus 10 years"(图片的文件类型缓存时间为10年) ExpiresByType text/* "access plus 10 years"(文本类型缓存时间为10年) ExpiresByType application/* "access plus 30 minutes"(application文件类型缓存30分钟)
验证结果如下,
image/jpeg
的缓存时间为315360000s(10年)。如果将
image/jpeg
设置为不缓存,即将max-age设置为0s。#ExpiresByType image/* "access plus 10 years" ExpiresByType image/* A0
系统显示类似如下。
mod_headers模块
# YEAR Header set Cache-Control "max-age=2592000" # WEEK Header set Cache-Control "max-age=604800″ # NEVER CACHE Header set Expires "Thu, 01 Dec 2003 16:00:00 GMT" Header set Cache-Control "no-store, no-cache, must-revalidate" Header set Pragma "no-cache"
CDN节点默认缓存策略
以下为CDN节点的默认缓存策略:
因为网站开发及其相关技术人员更清楚自身网站的业务逻辑、静态和动态因素,所以建议您通过控制台根据文件类型和文件所在目录,设置缓存时间。详细说明,请参见设置缓存过期时间。
如果您已经配置了缓存策略,那么Cache的默认缓存策略不生效。
默认情况下,CDN节点将根据公式计算出默认的缓存时间。为了便于理解,此处将介绍默认缓存时间的计算公式和相关示例。
计算公式。该公式分为如下三个步骤。
说明缓存时间为t,单位为秒(s);Curtime为当前时间,Last_Modified为源站的Last-Modified响应头。
计算t1的值。
t1 = (Curtime - Last_Modified) * 0.1
将上一步计算的t1之与10进行比较,取最大值为t2。
t2 = max(10,t1)
通过上一步计算的t2值与3600进行比较,取最小值为t,则t为缓存时间。
t = min(t2,3600)
示例如下。
当对象的
Last-Modified
为20140801 00:00:00
,当前时间Curtime为20140801 00:10:00
,则t1=(Curtime-Last_modified)*0.1=60s,t2=max(10,t1)=60s,t=min(t2,3600)=60s,那么缓存时间为60s。当对象的
Last-Modified
为20140801 00:00:00
,当前时间Curtime为20140802 00:00:00
,则t1=(Curtime-Last_modified)*0.1=8640s,t2=max(10,t1)=8640s,t=min(t2,3600)=3600s,那么缓存时间为3600s。当对象的
Last-Modified
为20140801 00:00:00
,当前时间Curtime为20140801 00:01:00
, 则t1=(Curtime-Last_modified)*0.1=6s,t2=max(10,t1)=10s,t=min(t2,3600)=10s,那么缓存时间为10s。
如果源站没有
Last-Modified
响应头,但有ETag
,则该对象极有可能是静态资源,将其默认缓存时间设置为dft_expires
指令配置的最小值。如果源站没有
Last-Modified
响应头,也没有ETag
,则认为该对象为动态内容,将其默认缓存时间设置为0,每次都回源。
适用于
CDN