CloudFront'u S3'ten en son HTML dosyasını geçirmeye zorlama


13

Arka fon

S3'te CloudFront'u en üstte tutan statik bir site barındırıyorum. Sahip olduğum sorun HTML dosyalarımda.

Göre CloudFront en SSS :

Amazon CloudFront, bu önbellek kontrol başlıklarını, dosyanın güncelleştirilmiş bir sürümünün kaynağını ne sıklıkta kontrol etmesi gerektiğini belirlemek için kullanır

Şimdiye kadar ne yaptım

Bunu göz önünde bulundurarak, S3 Bölümümdeki HTML dosyalarını aşağıdaki başlıkları eklemek üzere ayarladım:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 01 Jan 1990 00:00:00 GMT

Benim ilk çağrımda samplefile.htm, aşağıdaki yanıt başlıklarını görüyorum (konuya Content-Typedevam etmek için belirgin başlıkları (örneğin ) hariç tuttum:)

Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Date:Sat, 10 Dec 2011 14:16:51 GMT
ETag:"a5890ace30a3e84d9118196c161aeec2"
Expires:Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified:Sat, 10 Dec 2011 14:16:43 GMT
Server:AmazonS3
X-Cache:Miss from cloudfront

Gördüğünüz gibi, Cache-Controlbaşlığım orada. Sorun, bu dosyayı güncelleyip yenilediğimde önbelleğe alınmış içeriği (en son dosya yerine) alıyorum ve CloudFront'un yanıt başlıklarına bakarak önbelleğe alınmış sürümünü sunduğunu görebiliyorum:

X-Cache:Hit from cloudfront

Özet / soru

Yukarıdakileri göz önünde bulundurarak, CloudFront'u kullanırken en son HTML'yi otomatik olarak nasıl alabilirim?

SSS'ye göre bunu Cache-Control üstbilgileriyle yapabilmeliyim, ancak bunu çalıştıramıyorum.

Aşağıdaki cevapları takip ederek

Sonunda www CNAME'mi doğrudan S3 grubumu gösterecek şekilde değiştirmeye karar verdim. Daha sonra CloudFront'u işaret eden "statik" adlı yeni bir CNAME ekledi.

Bu, HTML'nin doğrudan S3'ten geldiğini ve bunun da tüm CSS / JS / IMG referanslarını static.alan_adim.com.tr'yi işaret ettiğini gösterir.

Yanıtlar:


6

Birincisi, Cloudfront'un amacı önbelleğe alınmış içerik sunmaktır - Cloudfront'tan önbelleğe alınmamış içeriği sunmaya çalışırsanız, hemen hemen tüm durumlarda, doğrudan S3'ten sunmaktan daha yavaştır (akış içeriği gibi bir şey istisna olacaktır). Bir an için Cloudfront'tan içerik sunmak için ne olması gerektiğini düşünün - kaynak sunucudan coğrafi olarak kullanıcıya yakın bir konuma getirilmesi gerekir - bu, Cloudfront'un kaynak sunucudan içerik alması gereken bir istek için anlamına gelir , isteğe ekstra gecikme eklersiniz ve kullanıcı içeriği daha yavaş alır. İçerik yalnızca uç konumda kullanılabilir olduğunda, sonraki isteklerin daha hızlı olması gerekir.

Bu soruna en iyi yaklaşım, bir sayfayı güncellediğinizde dosya adlarınızı değiştirmektir - bu, Cloudfront'u yeni içeriği almaya zorlar. Yine, Cloudfront'un medya dosyaları (görüntüler dahil) ve stil / javascript için kullanıldığını ve html için çok fazla olmadığını unutmayın. Esasında, HTML'nizi S3'te ve resimlerinizi Cloudfront'ta olurdu - yaptığınız değişikliklerle Cloudfront'ta dosyanın adını değiştirebilirsiniz (örn. File-v1.jpg, file-v2.jpg, vb.). Diğer bir yaygın yol da sürüm bilgileri içeren bir sorgu dizesi eklemektir.

Ayrıca, Cloudfront'un düzenli bir sunucudan daha yavaş yanıt vermesine neden olabilecek gzip edilmiş içerik sunmadığını unutmayın (yine de, sizin durumunuzda S3 de gzip özellikli tarayıcıları tanımlamaz).

Son olarak, isterseniz, Cloudfront'u mevcut kopyasını atmaya ve kaynak sunucudan yenisini almaya zorlamak için geçersiz kılmayı kullanabilirsiniz. Bununla birlikte, Cloudfront'un ayda yalnızca 1000 ücretsiz geçersiz kılma sağladığını ve bunun ardından maliyetin 0,005 ABD doları / geçersiz kılma olduğunu unutmayın.

Cloudfront içeriği en düşük süre 1 saat , varsayılan değer ise 24 saattir . Bu nedenle, maksimum yaşı en az 3600 olarak ayarlamaya çalışacağım. Ayrıca bir s-maxage üstbilgisini de (paylaşılan - yani proxy içerik için) düşünün. Amazon bu önbellek eğitimini önerir .

Bununla ilgili yeni bir sorun vardı, birkaç gün önce düzeltildi


CF'yi S3 üzerine yapıştırmanın nedeni, Werner Vogels'ten blog yazısında allthingsdistributed.com/2011/02/website_amazon_s3.html'den bahsetti . Dediğiniz gibi html'yi s3'ten doğrudan yönlendirmeyi düşünebilirim. Küçük bir not: önbellek bozma için dosyaların sonuna sorgu dizesi eklemek iyi bir fikir değildir, çünkü bazı proxy'lerin hiçbir zaman önbelleğe alınmamasına neden olabilir.
isNaN1247

Bu adam overkill gibi görünen her yükleme için geçersiz kılma kullanıyor gibi görünüyor jmlacroix.com
isNaN1247

1
Sorgu dizeleri Cloudfront ile çalışmaz - dosyaları önbelleğe almaz, ancak içeriğinizi doğrudan sunuyorsanız etkili olabilir. S3'ten gelen HTML en iyi bahistir. Kesinlikle her yüklemede her şeyi geçersiz kılmak istemezsiniz, ancak değişen dosyaları geçersiz kılmak bazı durumlarda haklı değildir. Cloudfront'un esası yalnızca yoğun trafik alan sitelerde gerçekten alakalı hale gelir - ortalama siteniz için S3 daha da iyi bir performans sunabilir (her ikisini de deneyin ve özellikle küçük nesneler için Cloudfront yavaş olabilir).
cyberx86

2
Cloudfront artık Gzip sıkıştırmasını destekliyor. Duyuru burada .
Greg Sadetsky

@ cyberx86 sınırları günümüzde farklıdır: The minimum expiration time CloudFront supports is 0 seconds for web distributions and 3600 seconds for RTMP distributions. docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…
xvga

20

Cloudfront şu anda minimum TTL'yi desteklediğinden ve OP'nin önbellek çağını = 0 kullanmaya yönelik orijinal girişiminin çalışması gerektiği için, şu ana kadar doğru olan cevapların şu anda güncel olmadığına inanıyorum.

Aradığınız sonucu üretip üretmeyecekleri açısından, bu diğer önbellek denetim başlıklarını kullanıp kullanmayacağınıza bakmak istersiniz - yalnızca en fazla yaşa ihtiyacınız olabilir. Muhtemelen istediğiniz şey Cloudfront'un HTML dosyasının değişip değişmediğini görmek için S3'ü kontrol etmesidir. Varsa, Cloudfront yeni dosyayı alabilir ve döndürebilir. Değilse, istemciye mevcut önbelleğinden hizmet verebilir (S3 bant genişliğini koruyarak ve istemciye daha hızlı ve daha yerel olarak hizmet verebilir).

Cloudfront'un amacı, önbelleğe alınmış içeriği sunmaktır, evet, ancak şimdi bu bazen değişen, ancak değişmediyse önbelleğe alınabilen içeriği içerir.

Ps sorgu dizeleri artık Cloudfront ile de çalışır (ilgili kaynak için bir 'davranış' yapılandırırsanız - başka bir yeni özellik), ancak bazı proxy'ler yine de sorgu dizeleri olan dosyaları önbelleğe alamayabilir.

Amazon Geliştirici Kılavuzu: Sona Erme 1


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.