Cache

具有自定義源和 ELB 的 CloudFront

  • June 16, 2016

我們將 CloudFront 用於我們的靜態資產,但也希望允許 Gzip。我們建立了一個新的發行版,其自定義來源指向我們位於彈性負載均衡器後面的應用程序伺服器。我們手動使文件在集群中保持同步,並在發佈時更新它們。

但是,通過這種設置,我們只能從 CloudFront 獲得 Miss 和 RefreshHits,這到目前為止已經達到了目的。為了使用 ELB 作為您的自定義來源,是否有任何其他設置?在文件中,它將此稱為可行的解決方案。

當我們將分髮指向生產集群中的單個伺服器時,Cloudfront 會正確記憶體我們的資產。

粘性會話 cookie 和由它添加的後續標頭是否可能是一個問題?

Cache-Control: no-cache="set-cookie"//由負載均衡器添加

有任何想法嗎?

僅供參考 - 目前,我們的自定義原點指向單個 EC2 實例,因此記憶體工作正常 - 以防您嘗試捲曲下面的文件。

範例標題: 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

在 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但是,根據我的經驗,如果設置了指令,CloudFront 總是會重新驗證對象。我相信,他們實際上應該忽略 Set-Cookie 中指定的標頭no-cache

快速修復是創建一個新的 CF Distro 並手動指定大於 0 的 min-ttl,這似乎覆蓋了no-cache指令。您需要使用 API 或第三方程序來執行此操作,因為 AWS 控制台不允許您修改 min-ttl。

CloudFront 可能無法正確處理具有相同名稱的多個標頭並且沒有看到您的max-age指令。根據CloudFront 確實使用Expires標頭(如果存在),因此請嘗試讓您的源伺服器設置它(最好相對於請求時間)。對於 Apache,我認為你想要這樣的mod_expires

ExpiresDefault "access plus 1 hour"

引用自:https://serverfault.com/questions/379276