具有自定義源和 ELB 的 CloudFront
我們將 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"