开发者社区> 问答> 正文

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

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

展开
收起
保持可爱mmm 2020-03-30 15:02:08 1145 0
1 条回答
写回答
取消 提交回答
  • 详细信息 过期时间控制支持三个维度,优先级依次为 控制台设置 > 源站Header设置 > Cache的默认策略设置。

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

    WebServer缓存策略设置 设置IIS缓存策略详细操作,请参见如何设置IIS缓存策略。 设置Nginx缓存策略详细操作,请参见如何设置Nginx缓存策略。 设置Apache缓存策略详细操作,请参见如何设置Apache缓存策略。

    如何设置IIS缓存策略 设置IIS缓存策略的操作步骤如下。 因为整体的站点只对.html、.jpg、.png、.gif、.apk等文件进行缓存,首先将整个站点设置成不缓存,具体操作如下。 打开IIS信息管理器,右键单击服务网站a.cc.com的属性,本文以a.cc.com服务网站为例。 单击 HTTP头,勾选 启用内容过期,选择 立即过期,单击 确定。

    上述设置后,整个网站的内容都不会被CDN缓存,接着设置.html、.jpg、.png、.gif、.apk等文件类型的缓存策略。 不同扩展名的文件都单独放在一个特定的目录下面,且该目录没有其他扩展名的文件。针对这个扩展名所在的整个目录设置缓存的时间。具体操作如下。 打开IIS信息管理器。 展开网站a.cc.com的目录,选中需要设置缓存时间的目录,如所有jpg文件都存储在img这个目录下,右键单击该目录并选择属性,单击 HTTP头。 注:由于步骤1已经设置整个网站不缓存,所以此时HTTP头选项下的缓存设置和步骤1中的相同。 选择 此时间段后过期,设置具体的过期时间,单击 确定。

    特定扩展名的文件不是统一放在唯一的目录,而是和其他扩展名文件混合放在一个目录下。以bin目录下的test.jpg为例,介绍缓存设置的操作步骤。 注:为了避免针对特定扩展名的文件进行逐个的配置,需要设置IIS支持通配符。 设置IIS支持通配符。 打开IIS信息管理器,右键单击服务网站a.cc.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 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 注: 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:01:00, 则t1=(Curtime-Last_modified)*0.1=6s,t2=max(10,t1)=10s,t=min(t2,3600)=10s,那么缓存时间为10s。 当对象的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: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,每次都回源。

    2020-03-30 15:03:50
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载