【问题标题】:Rails + Heroku + Cloudfront & S3 CacheRails + Heroku + Cloudfront 和 S3 缓存
【发布时间】:2016-02-18 04:44:56
【问题描述】:

我正在测试我的站点并收到一条警报,提示我没有为通过 S3/Cloudfront 提供的静态图像配置任何资产缓存。几乎我所有的 get 请求都返回“X-Cache:Miss from cloudfront”响应。几天前我刚刚设置了这个,所有的教程都说要配置每个项目并手动添加标题。我有一个 6k 图标的资产库,所以我宁愿处理这个我不必在上传时设置标题的地方。

我使用 design.cdn.getsprk.com 指向我的云端帐户,该帐户指向我的 s3 作为来源。我在 Heroku 上使用 Rails。

我还使用直接 s3 链接、云端和自定义域测试了标头。没有一个显示正确的标题。

我附上了我的云端配置设置。

示例图标:design.cdn.getsprk.com/icons/space/flat/11-neil-armstrong.svg

请求头:

GET /icons/space/flat/11-neil-armstrong.svg HTTP/1.1
Host: design.cdn.getsprk.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
If-None-Match: "746b7f4bce35cf3e6a8c965207087631"
If-Modified-Since: Tue, 10 Nov 2015 23:59:32 GMT

回复:

Connection:keep-alive
Date:Mon, 16 Nov 2015 22:29:05 GMT
ETag:"746b7f4bce35cf3e6a8c965207087631"
Last-Modified:Tue, 10 Nov 2015 23:59:32 GMT
Server:AmazonS3
Via:1.1 483919577b54800dcfc93dcd11176f74.cloudfront.net (CloudFront)
X-Amz-Cf-Id:mliY9nJt-2KEyu3aPpsxLm-Vd1LTKLRWYj9dTmfg54Mui0SKVhHL-g==
X-Cache:Miss from cloudfront

云端配置:

【问题讨论】:

    标签: ruby-on-rails caching heroku amazon-s3 amazon-cloudfront


    【解决方案1】:

    您似乎在发出有条件的请求,请注意是否存在 If-None-Match/If-Modified-Since。如果对象不在缓存中,它将始终是 Miss。您可以尝试在浏览器中按 Ctrl+F5 发出无条件请求吗?

    curl --compressed -v -o /dev/null design.cdn.getsprk.com/icons/space/flat/11-neil-armstrong.svg
    * About to connect() to design.cdn.getsprk.com port 80 (#0)
    *   Trying 54.192.144.164...
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* connected
    * Connected to design.cdn.getsprk.com (54.192.144.164) port 80 (#0)
    > GET /icons/space/flat/11-neil-armstrong.svg HTTP/1.1
    > User-Agent: curl/7.26.0
    > Host: design.cdn.getsprk.com
    > Accept: */*
    > Accept-Encoding: deflate, gzip
    > 
    * additional stuff not fine transfer.c:1037: 0 0
    * HTTP 1.1 or later with persistent connection, pipelining supported
    < HTTP/1.1 200 OK
    < Content-Type: image/svg+xml
    < Content-Length: 7702
    < Connection: keep-alive
    < Date: Wed, 18 Nov 2015 00:43:12 GMT
    < Last-Modified: Tue, 10 Nov 2015 23:59:32 GMT
    < ETag: "746b7f4bce35cf3e6a8c965207087631"
    < Accept-Ranges: bytes
    < Server: AmazonS3
    < Age: 9094
    < **X-Cache: Hit from cloudfront**
    < Via: 1.1 43ff408868c37128de942a235a1225f2.cloudfront.net (CloudFront)
    < X-Amz-Cf-Id: G7VwUZ3l15YnxjbZaeZmeeqSaj_E4OszrsS2sSfFjqkh1ZlTOXoKEg==
    < 
    { [data not shown]
    100  7702  100  7702    0     0  70606      0 --:--:-- --:--:-- --:--:--  104k
    * Connection #0 to host design.cdn.getsprk.com left intact
    * Closing connection #0
    

    【讨论】:

    • 澄清一下,你的回答是我应该达到的目标?
    • 我不确定您所说的目标是什么。我的回复解释了为什么您可能总是看到有条件请求的遗漏。
    • 谢谢@imperalix 我现在在几张 svg 图片上看到了这一点。我正在为我的icon 页面使用惰性加载程序,因为它有很多图像。有些显示命中,有些显示未命中。我尝试了几个不同的 curl 请求:curl --compressed -v -o /dev/null http://design.cdn.getsprk.com/icons/arrows/flat/157-move-to-bottom.svg &lt; Last-Modified: Tue, 17 Nov 2015 19:22:14 GMT &lt; Age: 209 &lt; X-Cache: Hit from cloudfront vs curl --head http://design.cdn.getsprk.com/icons/arrows/flat/157-move-to-bottom.svg &lt; X-Cache: Miss from cloudfront
    • 我是否必须将 s3/cloudfront 配置为不传递 If-None-Match/If-Modified-Since 标头?
    • 一旦一个对象在缓存中,这种连续的丢失不应该发生。你有一个总是错过的例子吗?你可以将同一个 svg 对象卷曲两次吗?此外,当您的浏览器执行 GET 时,您正在执行头部请求。
    猜你喜欢
    • 2014-10-13
    • 2014-04-29
    • 1970-01-01
    • 2012-01-31
    • 2015-11-16
    • 2013-08-17
    • 1970-01-01
    • 2014-03-28
    • 2023-03-26
    相关资源
    最近更新 更多