Amazon S3 和 Cloudfront 不会即时进行 gzip

Mar*_*zyk 2 caching ruby-on-rails amazon-s3 amazon-web-services amazon-cloudfront

我想使用 Cloudfront 中的新功能,该功能允许使用Accept-Encoding: gzip header即时 gzip 文件。我设置了 CDN 分发,打开“自动压缩对象”,将标头列入白名单:Origin、Accept-Control-Request-Headers 和 Accept-Control-Request-Method(我使用的是 AngularJS,我需要它用于 OPTIONS 方法)。我的 S3 存储桶上没有设置任何 CORS。

正如他们的文档中所述,当我将Accept-Encoding: gzip标头添加到请求中时,它应该开始工作。但是,我仍然收到原始文件。

Response Headers

Accept-Ranges:bytes
Age:65505
Cache-Control:public, max-age=31557600
Connection:keep-alive
Content-Length:408016
Content-Type:text/css
Date:Mon, 21 Mar 2016 16:00:36 GMT
ETag:"5a04faf838d5165f24ebcba54eb5fbac"
Expires:Tue, 21 Mar 2017 21:59:21 GMT
Last-Modified:Mon, 21 Mar 2016 15:59:22 GMT
Server:AmazonS3
Via:1.1 0e6067b46ed4b3e688f898d03e5c1c67.cloudfront.net (CloudFront)
X-Amz-Cf-Id:gKYTTq0cIcUvHTtlrdMig8D1R2ZVdea4EnflV0-IxhtaxgRvLYj6LQ==
X-Cache:Hit from cloudfront

Request Headers

Accept:text/css,*/*;q=0.1
Accept-Encoding:gzip, deflate, sdch
Accept-Language:pl,en-US;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Host: XXX.cloudfront.net
Referer: XXX
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
Run Code Online (Sandbox Code Playgroud)

我的配置是:

  • Unicorn 上的 Rails 和 Angular(使用 asset_sync)
  • nginx
  • S3 和 Cloudfront

Mic*_*bot 5

请注意这两个响应标头。

\n\n
Age: 65505\nX-Cache: Hit from cloudfront\n
Run Code Online (Sandbox Code Playgroud)\n\n

该对象已被之前的请求缓存,即您在此特定时间请求之前 65,505 秒(\xe2\x89\x85 18 小时)。

\n\n

一旦 CloudFront 在特定边缘缓存了对象,如果您稍后配置相关缓存行为以启用动态压缩,CloudFront 将不会返回并重新压缩其缓存中已有的对象。它将继续提供对象的原始版本,直到它被驱逐。

\n\n

如果这个 18 小时间隔早于您在发行版上启用压缩的时间,那么这最有可能解释您所看到的情况。

\n\n
\n

当 CloudFront 从您的源获取文件时,会压缩每个边缘位置中的文件。当您配置 CloudFront 来压缩内容时,它不会压缩已位于边缘位置的文件。此外,当边缘站点中的某个文件过期并且 CloudFront 将该文件的另一个请求转发到您的源时,如果您的源返回 HTTP 状态代码 304(这意味着边缘站点已具有该文件),则 CloudFront 不会压缩该文件。文件的最新版本。如果您希望 CloudFront 压缩已位于边缘位置的文件,则需要使这些文件失效。

\n\n

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html

\n
\n\n

通过提交路径的无效请求(以覆盖所有内容)或仅此特定的 或 等,从您的发行版缓存中逐出所有内容*/path几分钟/path*之内,您的发行版的所有缓存内容(或特定路径匹配,如果你没有指定*所有内容)将被驱逐(等待失效以表明它已完成),你应该看到压缩对后续请求起作用。

\n\n

密切关注Age:(CloudFront 拥有特定响应副本的时间),一旦它消失然后重置,我大胆猜测您会看到您所期望的内容。

\n\n

如果这不能解决问题,还有另一种可能性,但我希望这是一个相当不寻常的情况:

\n\n
\n

在极少数情况下,当 CloudFront 边缘站点异常繁忙时,某些文件可能无法压缩。

\n\n

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html

\n
\n