• 首页 > 
  • CDN加速静态资源时如何设置服务器端的缓存过期时间

CDN加速静态资源时如何设置服务器端的缓存过期时间

KB: 40080

 · 

更新时间:2020-04-30 17:04

概述

CDN加速静态资源时,将源站上的资源缓存到距离客户端最近的CDN节点上。当您访问该静态资源时,可直接从缓存中获取,本文主要介绍如何设置服务器端的缓存过期时间。

详细信息

过期时间控制支持三个维度,优先级依次为控制台设置>源站Header设置>Cache的默认策略设置

  • 关于控制台设置的详细说明,请参见设置缓存过期时间
  • 关于源站Header设置的详细说明,请参见WebServer缓存策略设置
  • Cache的默认策略是在您既没有在控制台设置过期时间,也没有在源站设置过期时间的情况下,会执行一个默认的全局策略,既保证加速效果,又避免因为动态的文件缓存导致的问题。关于Cache的默认策略设置的详细说明,请参见CDN节点默认缓存策略
    说明:关于OSS缓存策略设置,请参见设置文件HTTP头

WebServer缓存策略设置

如何设置IIS缓存策略

设置IIS缓存策略的操作步骤如下。
  1. 因为整体的站点只对HTML、JPG、PNG、GIF、APK等文件进行缓存,首先将整个站点设置成不缓存,具体操作如下。
    1. 打开IIS信息管理器,右键单击服务网站a.cc.com的属性,本文以a.cc.com服务网站为例。
    2. 单击HTTP头,勾选启用内容过期,选择立即过期,单击确定
  2. 上述设置后,整个网站的内容都不会被CDN缓存,接着设置.html、.jpg、.png、.gif、.apk等文件类型的缓存策略。
    • 不同扩展名的文件都单独放在一个特定的目录下面,且该目录没有其他扩展名的文件。针对这个扩展名所在的整个目录设置缓存的时间。具体操作如下。
      1. 打开IIS信息管理器。
      2. 展开网站a.cc.com的目录,选中需要设置缓存时间的目录,如所有jpg文件都存储在img这个目录下,右键单击该目录并选择属性,单击HTTP头
        说明:由于步骤1已经设置整个网站不缓存,所以此时HTTP头选项下的缓存设置和步骤1中的相同。
      3. 选择 此时间段后过期,设置具体的过期时间,单击 确定
    • 特定扩展名的文件不是统一放在唯一的目录,而是和其他扩展名文件混合放在一个目录下。以bin目录下的test.jpg为例,介绍缓存设置的操作步骤。
      说明:为了避免针对特定扩展名的文件进行逐个的配置,需要设置IIS支持通配符。
      1. 设置IIS支持通配符。
        1. 打开IIS信息管理器,右键单击服务网站a.cc.com的属性,选择主目录,单击配置
        2. 在弹出的对话框中,单击映射,单击插入
        3. 在弹出的对话框中,选择C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll文件,单击确定
          说明:不勾选确认文件是否存在
        4. 分别单击两个对话框中的确定,完成IIS通配符的支持配置。
      2. bin目录下,选择test.jpg并右键单击,选择属性
      3. 单击HTTP头
      4. 选择此时间段后过期,设置具体的过期时间,单击确定
      5. 设置bin目录下其他相同扩展名文件的缓存时间,此时需要修改IIS的配置文件。具体操作如下。
        说明:修改文件,需要在服务中关闭IIS admin Service。
        1. 用记事本程序打开IIS的配置文件,配置文件在C:\WINDOWS\system32\inetsrv\MetaBase.xml(IIS6的设置)目录下。
        2. 查找/bin/test.jpg,找到bin目录下test.jpg文件的缓存设置。
        3. test.jpg改为*.jpg并保存。
      6. 其他扩展名的文件缓存设置操作同上。

如何设置Nginx缓存策略

HTTP头处理模块(HTTP Headers)允许设置任意的HTTP头,您可以使用add_headerexpires命令设置Nginx缓存策略。

 
指令 语法 默认值 使用字段
add_header add_header name value none
  • http
  • server
  • location
expires
说明:这个指令控制是否在应答中标记一个过期时间以及如何标记。
expires [time|epoch|max|off]
 
说明
  • Time:控制Cache-Control的值,负数表示no-cache。
  • epoch:将Expires头设置为1 January, 1970 00:00:01 GMT
  • max:将Expires头设置为31 December 2037 23:59:59 GMT,将Cache-Control最大化到10年。
  • off:将禁止修改头部中的Expires和Cache-Control字段。
expires off
  • http
  • server
  • location
 
  • 通过expires设置,示例如下。
    • 设置PHP的文件类型过期时间,设置为1小时。

      设置成功后,系统显示类似如下。
    • 设置PHP的文件类型为no-cache,Cache服务器不缓存。

      设置成功后,系统显示类似如下。
  • 通过add_header设置,以动态的PHP文件设置为不缓存为例。
    location ~ .*\.php$ {
        if ($request_uri !~ ^/dynamicimg/) {
            add_header              Cache-Control "no-cache";
            add_header              Pragma no-cache;
        }
      }

如何设置Apache缓存策略

您可以通过Apache的mod_expires和mod_headers两个模块设置Apache的缓存策略。
  • mod_expires模块
    • mod_expires模块允许通过配置文件控制HTTP的Expires和Cache-Control头内容,它的主要作用是自动生成页面头部信息中的Expires标签和Cache-Control标签,从而降低客户端的访问频率和次数,达到减少不必要流量和增加访问速度的目的。
    • mod_expires是Apache众多模块中配置比较简单的一个,它一共包括三条指令。
      • ExpiresActive指令:打开或关闭产生Expires:Cache-Control:头的功能。 
      • ExpiresByType指令:指定MIME类型的文档(如text或html)的过期时间。
      • ExpiresDefault指令:默认所有文档的过期时间。
    • 过期时间的写法如下。
      "access plus 1 month"
      "access plus 4 weeks"
      "now plus 30 days"
      "modification plus 5 hours 3 minutes"
      A2592000
      M604800
      说明
      • accessnowA这三种写法的意义相同,都是指过期时间从访问时开始计算。
      • modificationM的意义相同,指过期时间从被访问文件的最后修改时间开始计算。
    • 本种写法只对静态文件起作用,对于由脚本生成的动态页面无效。配置实例如下。
       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响应头。
      1. 计算t1的值。
        t1 = (Curtime - Last_Modified) * 0.1
      2. 将上一步计算的t1之与10进行比较,取最大值为t2。
        t2 = max(10,t1)
      3. 通过上一步计算的t2值与3600进行比较,取最小值为t,则t为缓存时间。
        t = min(t2,3600)
    • 示例如下。 
      • 当对象的Last-Modified20140801 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-Modified20140801 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-Modified20140801 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响应头,但有ETag,则该对象极有可能是静态资源,将其默认缓存时间设置为dft_expires指令配置的最小值。
  • 如果源站没有Last-Modified响应头,也没有ETag,则认为该对象为动态内容,将其默认缓存时间设置为0,每次都回源。

适用于

  • CDN