CloudFront与自定义起源和ELB

我们正在使用CloudFront作为我们的静态资产,但也希望允许使用Gzip。 我们build立了一个新的发行版,其中自定义来源指向我们在弹性负载均衡器后面的应用程序服务器。 我们手动保持群集中的文件同步,并在发布时进行更新。

但是,随着这个build立,我们除了CloudFront的小姐和RefreshHits以外,什么都没有,这一直到目前为止已经失败了。 是否有任何额外的设置,以便使用ELB作为您的自定义原点? 在文档中,它将其作为可行的解决scheme。

当我们将分发指向我们的生产集群中的单个服务器时,cloudfront会正确地caching我们的资产。

粘滞会话cookie和随后添加的头可能是一个问题吗?

Cache-Control: no-cache="set-cookie" //由负载平衡器添加

有任何想法吗?

仅供参考 – 目前,我们有我们的自定义来源指向单个EC2实例,所以caching工作正常 – 万一你试图curl下面的文件。

示例标题:curl -I http://static.quick-cdn.com/css/9850999.css

 HTTP/1.0 200 OK Accept-Ranges: bytes Cache-Control: max-age=3700 Cache-Control: no-cache="set-cookie" Content-Length: 23038 Content-Type: text/css Date: Thu, 12 Apr 2012 23:03:52 GMT Last-Modified: Thu, 12 Apr 2012 23:00:14 GMT Server: Apache/2.2.17 (Ubuntu) Vary: Accept-Encoding X-Cache: RefreshHit from cloudfront X-Amz-Cf-Id: K_q7Zy3_jdzlEJ85ukELVtdx1GmuXqApAbZZ7G0fPt0mxRMqPKX5pQ==,RzJmPku-rEIO9WlvuSoKa8hiAaR3dLk5KC4cQMWWrf_MDhmjWe8n6A== Via: 1.0 28c34f9fbf559a21ee16594849e4fc9c.cloudfront.net (CloudFront) Connection: close 

CloudFront可能无法正确处理具有相同名称的多个标头,并且没有看到您的max-age指令。 根据这个 CloudFront使用Expires头文件(如果存在的话),所以请尝试让原始服务器设置,而不是(最好是相对于请求时间)。 对于Apache我想你想要这样的mod_expires :

 ExpiresDefault "access plus 1 hour" 

当在ELB上使用粘性会话时,负载均衡器将添加以下两个头信息: Set-Cookie (带有AWSELB cookie)和Cache-Control: no-cache="set-cookie"

如果CF Distro上的min-ttl为0(现在是默认值),则CloudFront将使用no-cache指令。 亚马逊代表与我联系: w3.org – RFC2616 。

来自no-cache部分的以下内容适用于:

如果no-cache指令没有指定一个或多个字段名称,则caching可以使用该响应来满足后续的请求,但是要遵守对caching的任何其他限制。 但是,指定的字段名不得在对后续请求的响应中发送,而不要使用源服务器成功重新生效

但是,根据我的经验,如果设置了no-cache指令,CloudFront将始终重新validation对象。 我相信,他们实际上应该忽略no-cache指定的Set-Cookie头,以便开始。

快速解决scheme是创build一个新的CF发行版,并手动指定一个大于0的min-ttl,这似乎覆盖了no-cache指令。 您需要使用API​​或第三方程序来执行操作,因为AWS控制台不允许您修改min-ttl。