Kami baru saja bermigrasi ke Amazon AWS. Saat ini kami memiliki instance EC2 yang berfungsi dengan baik. Ini menjalankan Nginx di depan dan Apache di back-end. Itu berjalan dengan baik juga. Semua situs diluncurkan dengan benar dan termasuk header Kontrol-Cache untuk file yang dilayani dari EC2.
Masalahnya adalah dengan SEMUA file statis yang kami tempatkan di Amazon S3 yang sedang diakses melalui CloudFront CDN . Kami dapat mengakses file dengan baik (dan tidak ada masalah dengan CORS), tetapi tampaknya CloudFront tidak melayani file dengan header Cache-Control. Kami ingin memanfaatkan caching browser.
Cara saya melihatnya, instance EC2 tidak berperan di sini karena file statis dilayani langsung oleh S3 + CloudFront, permintaan tidak masuk ke Server Web di EC2.
Saya benar-benar bingung.
Pertanyaan: 1) Bagaimana cara saya mengatur Kontrol-Cache dalam kasus ini? 2) Apakah mungkin untuk mengatur Kontrol-Cache? Dari S3 atau CloudFront?
Catatan: Saya telah menekan beberapa halaman di Google di mana Anda dapat mengatur Header di S3 untuk objek individual. Itu benar-benar bukan cara yang produktif untuk melakukannya secara khusus karena dalam kasus saya kita berbicara tentang beberapa objek.
Terima kasih!
Jawaban:
Ya, "produktif" atau tidak, begitulah sebenarnya dirancang untuk bekerja.
CloudFront tidak menambahkan
Cache-Control:
header.CloudFront melewati-melalui (dan juga hal, kecuali dinyatakan dikonfigurasi) yang
Cache-Control:
header yang disediakan oleh server asal, yang dalam hal ini adalah S3.Untuk mendapatkan
Cache-Control:
tajuk yang disediakan oleh S3 saat sebuah objek diambil, mereka harus disediakan saat objek diunggah ke dalam S3, atau ditambahkan ke metadata objek dengan operasi put + copy berikutnya, yang dapat digunakan untuk menyalin objek secara internal ke dalam dirinya sendiri di dalam S3, memodifikasi metadata dalam proses. Inilah yang dilakukan konsol, di balik layar, jika Anda mengedit objek metadata.Ada juga (kalau-kalau Anda bertanya-tanya) tidak ada pengaturan global di S3 untuk memaksa semua objek dalam ember untuk mengembalikan header ini - itu adalah atribut per objek.
Pembaruan: Lambda @ Edge adalah fitur baru di CloudFront yang memungkinkan Anda untuk mengaktifkan pemicu terhadap permintaan dan / atau tanggapan, antara penampil dan cache dan / atau cache dan asal, menjalankan kode yang ditulis dalam Node.js terhadap struktur objek permintaan / respons yang sederhana diekspos oleh CloudFront.
Salah satu aplikasi utama untuk fitur ini adalah memanipulasi header ... jadi sementara di atas masih akurat - CloudFront sendiri tidak menambahkan
Cache-Control
- sekarang mungkin untuk fungsi Lambda untuk menambahkannya ke respons yang dikembalikan dari CloudFront.Contoh ini
Cache-Control: public, max-age=86400
hanya akan ditambahkan jika tidak adaCache-Control
tajuk yang sudah ada pada respons.Menggunakan kode ini dalam pemicu Respons Asal akan menyebabkannya menyala setiap kali CloudFront mengambil objek dari asal, dan memodifikasi respons sebelum CloudFront menyimpannya.
Pembaruan (2018-06-20): Baru-baru ini, saya mengirimkan permintaan fitur ke tim CloudFront untuk memungkinkan konfigurasi header respons asal statis sebagai atribut asal, mirip dengan cara header permintaan statis dapat ditambahkan, sekarang ... tetapi dengan twist, memungkinkan setiap header dikonfigurasikan untuk ditambahkan secara kondisional (hanya jika asal tidak memberikan header itu dalam respons) atau tanpa syarat (menambahkan header dan menimpa header dari asal kemudian, jika ada).
Dengan permintaan fitur, Anda biasanya tidak menerima konfirmasi apakah mereka benar-benar mempertimbangkan untuk mengimplementasikan fitur baru ... atau bahkan apakah mereka mungkin sudah mengerjakannya ... itu baru diumumkan ketika sudah selesai. Jadi, saya tidak tahu apakah ini akan dilaksanakan. Ada argumen yang harus dibuat bahwa karena kemampuan ini sudah tersedia melalui Lambda @ Edge, tidak perlu untuk itu dalam fungsionalitas basis ... tetapi argumen kontra saya adalah bahwa basis fungsional tidak melengkapi fitur tanpa kemampuan untuk lakukan manipulasi header respons statis yang sederhana, dan bahwa jika ini adalah satu-satunya alasan pemicu diperlukan, maka diperlukan pemicu Lambda adalah biaya yang tidak perlu, secara finansial dan dalam latensi tambahan (walaupun keduanya tidak selalu merupakan biaya aneh).
sumber