Buộc CloudFront chuyển qua tệp HTML mới nhất từ ​​S3


13

Lý lịch

Tôi đang lưu trữ một trang web tĩnh trên S3, với CloudFront trên đầu trang. Vấn đề tôi gặp phải là với các tệp HTML của mình.

Theo Câu hỏi thường gặp của CloudFront :

Amazon CloudFront sử dụng các tiêu đề kiểm soát bộ đệm này để xác định tần suất cần kiểm tra nguồn gốc của phiên bản cập nhật của tệp đó

Những gì tôi đã làm cho đến nay

Với suy nghĩ này, tôi đã đặt các tệp HTML trong Nhóm S3 của mình để thêm vào các tiêu đề sau:

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

Trong cuộc gọi đầu tiên của tôi samplefile.htm, tôi thấy các tiêu đề phản hồi sau (Tôi đã loại trừ các tiêu đề rõ ràng (ví dụ Content-Type) để giữ nguyên điểm:

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

Như bạn có thể thấy, Cache-Controltiêu đề của tôi là ở đó. Vấn đề là, nếu tôi cập nhật tệp này và làm mới tôi sẽ nhận được nội dung được lưu trong bộ nhớ cache (chứ không phải tệp mới nhất) và tôi có thể thấy CloudFront đang phục vụ phiên bản được lưu trong bộ nhớ cache của mình bằng cách xem các tiêu đề phản hồi:

X-Cache:Hit from cloudfront

Tóm tắt / câu hỏi

Với suy nghĩ trên, làm cách nào tôi có thể tự động truy xuất HTML mới nhất khi sử dụng CloudFront?

Theo Câu hỏi thường gặp của tôi, tôi sẽ có thể làm điều này với các tiêu đề Kiểm soát bộ đệm, nhưng dường như tôi không thể làm việc này.

Thực hiện theo các câu trả lời dưới đây

Cuối cùng, tôi quyết định thay đổi www CNAME của mình để trỏ trực tiếp vào nhóm S3 của mình. Sau đó, thêm một CNAME mới gọi là "tĩnh", trỏ đến CloudFront.

Điều này có nghĩa là HTML trực tiếp từ S3, sau đó có tất cả các tham chiếu CSS / JS / IMG của nó trỏ đến static.mydomain.com

Câu trả lời:


6

Thứ nhất, quan điểm của Cloudfront là phục vụ nội dung được lưu trong bộ nhớ cache - nếu bạn cố gắng phục vụ nội dung không được lưu trữ từ Cloudfront thì sẽ chậm hơn so với phục vụ trực tiếp từ S3, trong hầu hết các trường hợp (như nội dung phát trực tuyến sẽ là ngoại lệ). Hãy xem xét một lúc những gì cần xảy ra để phân phát nội dung từ Cloudfront - nó cần được truy xuất từ ​​máy chủ gốc đến một vị trí gần với địa lý của người dùng - điều đó có nghĩa là đối với yêu cầu Cloudfront phải truy xuất nội dung từ máy chủ gốc , bạn thêm độ trễ bổ sung vào yêu cầu và người dùng nhận được nội dung chậm hơn. Chỉ một khi nội dung có sẵn ở vị trí cạnh mà các yêu cầu tiếp theo sẽ nhanh hơn.

Cách tiếp cận tốt nhất cho vấn đề này là thay đổi tên tệp của bạn khi bạn cập nhật một trang - điều này sẽ buộc Cloudfront phải truy xuất nội dung mới. Một lần nữa, hãy nhớ rằng Cloudfront thường được sử dụng cho các tệp phương tiện (bao gồm cả hình ảnh) và kiểu / javascript - và không nhiều cho html. Về cơ bản, bạn sẽ có HTML trên S3 và hình ảnh của bạn trên Cloudfront - với bất kỳ thay đổi nào bạn thực hiện, bạn có thể thay đổi tên của tệp trên Cloudfront (ví dụ: file-v1.jpg, file-v2.jpg, v.v.). Một cách phổ biến khác là bao gồm một chuỗi truy vấn với thông tin phiên bản.

Ngoài ra, hãy nhớ rằng Cloudfront không phục vụ nội dung được nén - điều này có thể dẫn đến phản hồi chậm hơn so với máy chủ thông thường (mặc dù, trong trường hợp của bạn, S3 cũng không xác định trình duyệt có khả năng gzip).

Cuối cùng, nếu bạn muốn, bạn có thể sử dụng tính hợp lệ để buộc Cloudfront loại bỏ bản sao hiện có của nó và tìm nạp một bản sao mới từ máy chủ gốc. Tuy nhiên, lưu ý rằng Cloudfront chỉ cung cấp cho bạn 1000 thông tin miễn phí mỗi tháng, sau đó chi phí là 0,005 đô la / không hợp lệ.

Thời gian thấp nhất Cloudfront sẽ giữ nội dung là 1 giờ , mặc dù, mặc định là 24 giờ. Do đó, tôi sẽ cố gắng đặt tuổi tối đa tối thiểu là 3600. Cũng xem xét tiêu đề s-maxage (đối với nội dung được chia sẻ - tức là được ủy quyền). Amazon khuyến nghị hướng dẫn lưu trữ này .

Có một vấn đề gần đây với điều này, đã được khắc phục vài ngày trước


Lý do để gắn CF trên S3 là từ Werner Vogels đề cập đến chính nó trong bài đăng trên blog của mình allthingsdistribution.com/2011/02/website_amazon_s3.html . Tôi có thể xem xét việc định tuyến html trực tiếp từ s3 như bạn nói. Một lưu ý nhỏ: thêm chuỗi truy vấn vào cuối tệp để xóa bộ đệm không phải là ý tưởng hay vì nó có thể khiến một số proxy không bao giờ lưu vào bộ đệm.
isNaN1247

Anh chàng này dường như sử dụng tính hợp lệ trên mỗi lần tải lên có vẻ như quá mức cần thiết jmlacroix.com
isNaN1247

1
Chuỗi truy vấn sẽ không hoạt động với Cloudfront - nó sẽ không lưu trữ các tệp, nhưng chúng có thể hiệu quả nếu bạn phục vụ trực tiếp nội dung của mình. HTML từ S3 sẽ là lựa chọn tốt nhất của bạn. Bạn chắc chắn không muốn làm mất hiệu lực mọi thứ trên mỗi lần tải lên, nhưng việc vô hiệu hóa các tệp đã thay đổi không phải là không có công trong một số trường hợp. Ưu điểm của Cloudfront chỉ thực sự trở nên phù hợp trên các trang web bị buôn bán nặng nề - đối với trang trung bình của bạn, S3 thậm chí có thể cung cấp hiệu suất tốt hơn (thử cả hai và xem - đặc biệt đối với các đối tượng nhỏ Cloudfront có thể chậm).
cyberx86

2
Cloudfront hiện hỗ trợ nén Gzip. Thông báo tại đây .
Greg Sadetsky

Giới hạn @ cyberx86 ngày nay đã khác: 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/ Kẻ
xvga

20

Tôi tin rằng các câu trả lời cho đến nay, trong khi chính xác tại thời điểm đó, đã hết hạn, vì Cloudfront hiện hỗ trợ mức tối thiểu là 0 và nỗ lực ban đầu của OP để sử dụng cache-age = 0 giờ sẽ hoạt động.

Bạn sẽ muốn xem xét liệu có nên sử dụng các tiêu đề kiểm soát bộ đệm khác đó hay không, về mặt liệu chúng có tạo ra kết quả mà bạn đang tìm kiếm hay không - bạn có thể chỉ cần độ tuổi tối đa. Những gì bạn có thể muốn là Cloudfront kiểm tra S3 để xem tệp HTML đã thay đổi chưa. Nếu có, Cloudfront có thể tìm nạp và trả lại tệp mới. Nếu không, nó có thể phục vụ máy khách từ bộ đệm hiện có của nó (bảo toàn băng thông S3 và phục vụ máy khách nhanh hơn và cục bộ hơn).

Quan điểm của Cloudfront là phục vụ nội dung được lưu trong bộ nhớ cache, vâng, nhưng hiện tại điều này bao gồm nội dung đôi khi thay đổi, nhưng có thể được lưu trong bộ nhớ cache nếu nó không thay đổi.

Các chuỗi truy vấn Ps cũng hoạt động với Cloudfront ngay bây giờ (nếu bạn định cấu hình 'hành vi' cho nguồn gốc có liên quan - một tính năng mới khác), tuy nhiên một số proxy vẫn có thể không lưu trữ bất kỳ tệp nào có chuỗi truy vấn.

Hướng dẫn dành cho nhà phát triển Amazon: Hết hạn 1


-1

Không chắc chắn cách CloudFront xử lý tiêu đề như bạn có, nhưng nếu bạn không chỉ định bất kỳ tiêu đề nào thì thời gian mặc định để làm mới các đối tượng là 24 giờ.

Một trong những điều bạn có thể làm để làm mới các đối tượng là Vô hiệu hóa nội dung. Kiểm tra các liên kết dưới đây để biết thêm. http://blog.cloudberrylab.com/2010/08/how-to-manage-cloudfront-object.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.