cdn动态查询?或不

时间:2013-07-04 13:24:30

标签: caching optimization cdn

我需要一些关于CDN动态查询使用的反馈。我会知道动态和静态查询之间的最佳选择。

就我而言,我们有一个包含大量静态内容的网页游戏。我们每两周执行一次转发,在CDN上我们会添加一些内容,但我们也会更新一些内容。

我看到三种可能的方式:     1)对每个文件使用版本控制(例如:welcome01.jpg,welcome02.jpg)     2)对每个文件使用动态查询(例如:welcome.jpg?v = 01,welcome.jpg?v = 02)     3)使用没有版本控制的命名,对于每个已修改的文件,在CDN上执行无效(清除)。

对我来说,解决方案3是最差的,因为我们无法设置高缓存,我们必须使已经在CDN中的每个更新文件无效。

在解决方案1和解决方案2之间,我认为1是最好的,因为当我在我的orign服务器上传新的静态内容并在CDN上执行部署时,我的所有内容都会在每个边缘发送。在这种情况下,我可以设置高缓存内容值。 在解决方案2中,我认为性能比解决方案1差,因为当我在原始服务器中添加新内容(有一些文件更新)时,只有新文件被发送到Edge。更新后的文件仅在客户端使用新参数执行查询时可用(例如:welcome.jpg?v = 03)。在这种情况下,Edge服务器将在我的源服务器上下载welcome.jpg并将其与新参数相关联。但他没有在其他所有Edge中复制。

对我来说,解决方案2在性能级别上低于解决方案1,但对于它们两者,我们可以设置高缓存内容值。

你能否就此提出你的意见或更多信息?

提前致谢。

PS:我们使用cloudfront,但这是所有CDN提供商的一般性问题。

1 个答案:

答案 0 :(得分:1)

并非所有代理缓存或ISP都会分别使用查询字符串缓存资源。换句话说,它们可能无法正确地使您的缓存失效。有关here

的更多信息

所以如果你想确定你的新文件并下载,我不得不说解决方案1更安全。一个新的唯一URI将为您提供此信息。对文件进行版本控制将很有效。

根据您的CDN的工作方式,您可以使用mod-rewrite强制下载,而不必手动繁琐地编辑文件。

例如,如果您的CDN可以通过CNAME获取更改,例如,这是MaxCDN的工作方式,您可以执行类似html5boilerplate的操作。

基于文件名的缓存清除

# If you're not using a build process to manage your filename version revving,
# you might want to consider enabling the following directives to route all
# requests such as `/css/style.12345.css` to `/css/style.css`.

# To understand why this is important and a better idea than `*.css?v231`, read:
# http://stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring

<IfModule mod_rewrite.c>
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L]
</IfModule>

基于文件夹的缓存清除

或者,如果您不需要/想要对每个文件进行版本控制,并且必须繁琐地更改所有代码和CSS。你拥有整个文件夹版本系统而不是基于文件的东西可能会更好。例如,让我们说您的物理资源文件位于/ assets / css和/ assets / img和/ assets / js中,您可以使用mod重写使/v1.0/assets/*映射到您的真实文件夹。这样,您可以正常上传新的更新资源,然后在站点配置中增加版本变量,并将所有资源指向新文件夹。这是类似的东西的modrewrite。

<IfModule mod_rewrite.c>
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^/v([0-9\.]+)/assets/(.+)$ /assets/$2 [L,QSA]
</IfModule>