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

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

详细信息

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

  • 关于控制台设置的详细说明,请参见设置缓存过期时间

  • 关于源站Header设置的详细说明,请参见WebServer缓存策略设置

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

    说明

    关于OSS缓存策略设置,请参见设置文件HTTP头

WebServer缓存策略设置

如何设置IIS缓存策略

设置IIS缓存策略的操作步骤如下:

  1. 因为整体的站点只对HTML、JPG、PNG、GIF、APK等文件进行缓存,首先将整个站点设置成不缓存,具体操作如下。

    1. 打开IIS信息管理器,右键单击服务网站example.aliyundoc.com的属性,本文以example.aliyundoc.com服务网站为例。

    2. 单击HTTP头,勾选启用内容过期,选择立即过期,单击确定

      image
  2. 上述设置后,整个网站的内容都不会被CDN缓存,接着设置.html、.jpg、.png、.gif、.apk等文件类型的缓存策略。

    • 不同扩展名的文件都单独放在一个特定的目录下面,且该目录没有其他扩展名的文件。针对这个扩展名所在的整个目录设置缓存的时间。具体操作如下。

      1. 打开IIS信息管理器。

      2. 展开网站example.aliyundoc.com的目录,选中需要设置缓存时间的目录,如所有jpg文件都存储在img这个目录下,右键单击该目录并选择属性,单击HTTP头

        说明

        由于步骤1已经设置整个网站不缓存,所以此时HTTP头选项下的缓存设置和步骤1中的相同。

      3. 选择此时间段后过期,设置具体的过期时间,单击确定

        image
    • 特定扩展名的文件不是统一放在唯一的目录,而是和其他扩展名文件混合放在一个目录下。以bin目录下的test.jpg为例,介绍缓存设置的操作步骤。

      说明

      为了避免针对特定扩展名的文件进行逐个的配置,需要设置IIS支持通配符。

      1. 设置IIS支持通配符。

        1. 打开IIS信息管理器,右键单击服务网站example.aliyundoc.com的属性,选择主目录,单击配置

        2. 在弹出的对话框中,单击映射,单击插入

          image
        3. 在弹出的对话框中,选择C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll文件,单击确定

          说明

          不勾选确认文件是否存在

          image
        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_header和expires命令设置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

示例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
      说明
      • 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:10:00,则t1=(Curtime-Last_modified)*0.1=60s,t2=max(10,t1)=60s,t=min(t2,3600)=60s,那么缓存时间为60s。

      • 当对象的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: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

阿里云首页 CDN 相关技术圈