Обслуговування gzipped CSS та JavaScript від Amazon CloudFront через S3


194

Я шукав способи якнайшвидше завантажувати свій сайт, і одним із способів, який я хотів би вивчити, є більш широке використання Cloudfront.

Оскільки Cloudfront спочатку не був розроблений як власне CDN, а тому, що він не підтримував gzipping, я до цих пір використовував його для розміщення всіх моїх зображень, на які посилається їх ім'я Cloudfront у коді мого сайту, та оптимізовано далеко -заголовки.

CSS та файли javascript, з іншого боку, розміщені на моєму власному сервері, тому що до цього часу я мав враження, що їх не можна подавати gzipped з Cloudfront, і що виграш від gzipping (близько 75 відсотків) переважає, що від використання CDN (близько 50 відсотків): Amazon S3 (і, таким чином, Cloudfront) не підтримував стандартний спосіб подачі gzipped вмісту за допомогою заголовка HTTP Accept-Encoding, що надсилається браузерами, щоб вказати на підтримку компресії gzip, і тому вони не змогли Gzip та обслуговувати компоненти на льоту.

Таким чином, до цього часу я був під враженням, що треба було вибрати між двома альтернативами:

  1. перемістіть усі активи на Amazon CloudFront та забудьте про GZipping;

  2. тримайте компоненти, розміщені самостійно та налаштовуйте наш сервер, щоб виявляти вхідні запити та виконувати в режимі GZipping в міру необхідності, що я вирішив зробити до цих пір.

Там були обхідні шляхи , щоб вирішити цю проблему, але по суті вони не працюють . [ посилання ].

Тепер, здається, Amazon Cloudfront підтримує користувальницьке походження, і що тепер можна використовувати стандартний метод HTTP Accept-Encoding для подачі gzipped вмісту, якщо ви використовуєте користувацьке походження [ посилання ].

Я поки що не зміг реалізувати нову функцію на своєму сервері. Публікація в блозі, до якої я посилався вище, що є єдиним із них, де я знайшов детальну інформацію про зміни, мабуть, означає, що ви можете ввімкнути gzipping (смуга обхідних шляхів, які я не хочу використовувати), якщо ви вибрали нестандартне походження, яке Я вважаю за краще ні: мені простіше розміщувати відповідні файли на моєму сервері Cloudfront та посилатись на них звідти. Незважаючи на те, що уважно читаю документацію, я не знаю:

  • чи означає, що нова функція означає, що файли повинні розміщуватися на моєму власному сервері домену через користувацьке походження, і якщо так, то яка установка коду досягне цього;

  • як налаштувати заголовки css та javascript, щоб переконатися, що вони подаються gzipped з Cloudfront.

Відповіді:


202

ОНОВЛЕННЯ: Amazon тепер підтримує стиснення gzip, тому це більше не потрібно. Оголошення Amazon

Оригінальна відповідь:

Відповідь - зібрати файли CSS та JavaScript. Так, ви правильно прочитали.

gzip -9 production.min.css

Це призведе до отримання production.min.css.gz. Видаліть .gz, завантажте на S3 (або будь-який сервер-джерело, який ви використовуєте) та явно встановіть Content-Encodingзаголовок для цього файлу gzip.

Це не на ходу gzipping, але ви можете дуже легко зафіксувати його у своїх сценаріях побудови / розгортання. Перевагами є:

  1. Для Apache не потрібен процесор, щоб отримати вміст, коли файл запитується.
  2. Файли gzipped на найвищому рівні стиснення (якщо вважати gzip -9).
  3. Ви подаєте файл із CDN.

Якщо припустити, що ваші файли CSS / JavaScript (а) мінімізовані та (б) достатньо великі, щоб виправдати процесор, необхідний для декомпресії на машині користувача, тут можна отримати значні підвищення продуктивності.

Просто пам’ятайте: Якщо ви внесете зміни до файлу, кешованого в CloudFront, переконайтеся, що ви недійсні кеш після внесення цього типу змін.


37
Прочитавши ваше посилання, мушу сказати, що автор блогу необізнаний. "Однак якщо у користувача є веб-переглядач, який не підтримує кодування gzip, таблиці стилів та javascripts вашого сайту просто не працюватимуть для цього користувача." Цей веб-переглядач, швидше за все, занадто старий для запуску ваших таблиць стилів та файлів сценаріїв. Ці користувачі складають частку відсотка.
Скайлер Джонсон

3
ОНОВЛЕННЯ: Я розробив це. Причина цього не відображалася в тому, що я забув встановити Тип вмісту для тексту / css. Якщо ви це зробите, ви все в порядку, хоча чомусь, здається, ви не можете додати заголовок "Accept-Encoding: Vary" у S3 (що допоможе з рейтингом швидкості Google) з описаних тут причин: [посилання ]. Крім того, я встановив кеш-контроль для кешування активу, але, схоже, це не кешування ...
Дональд Дженкінс

32
Щойно я знайшов це через Google, і мені дуже шкода, що це потрібно сказати. Хоча <1% настільних браузерів не може обробляти gzipped вміст, дуже багато мобільних браузерів не можуть. Скільки залежить від того, яку цільову аудиторію ви дивитесь; але більшість старих Nokia S40 мають, наприклад, стискання gzip-компресії. Правильним способом є "Спеціальне джерело", яке вказує на веб-сервер Apache / IIS, який робить стиснення вмісту і обслуговує належні заголовки HTTP. Ось один допис у блозі, який описує суть його: nomitor.com/blog/2010/11/10/…
Jesper M

14
Яка ситуація зараз, на початку 2015 року? Чи посилання, розміщені @JesperMortensen та Саймоном Пеком, все ще є актуальними?
ItalyPaleAle

5
У грудні 2015 року Amazon оголосив про підтримку стиснення gzip, тому це вже не має значення, просто завантажте базовий файл, і він буде працювати. aws.amazon.com/blogs/aws/…
Sean

15

Моя відповідь - це зняття з цього приводу: http://blog.kenweiner.com/2009/08/serving-gzipped-javascript-files-from.html

Створюючи відповідь skyler, ви можете завантажити gsip та non-gzip версію css та js. Будьте уважні, називаючи і тестуючи Safari. Тому що сафарі не обробляє файли .css.gzчи .js.gzфайли.

site.jsі site.js.jgzі site.cssта site.gz.css (вам потрібно буде встановити content-encodingзаголовок на правильний тип MIME, щоб вони слугували правильно)

Потім на свою сторінку покладіть.

<script type="text/javascript">var sr_gzipEnabled = false;</script> 
<script type="text/javascript" src="http://d2ft4b0ve1aur1.cloudfront.net/js-050/sr.gzipcheck.js.jgz"></script> 

<noscript> 
  <link type="text/css" rel="stylesheet" href="http://d2ft4b0ve1aur1.cloudfront.net/css-050/sr-br-min.css">
</noscript> 
<script type="text/javascript"> 
(function () {
    var sr_css_file = 'http://d2ft4b0ve1aur1.cloudfront.net/css-050/sr-br-min.css';
    if (sr_gzipEnabled) {
      sr_css_file = 'http://d2ft4b0ve1aur1.cloudfront.net/css-050/sr-br-min.css.gz';
    }

    var head = document.getElementsByTagName("head")[0];
    if (head) {
        var scriptStyles = document.createElement("link");
        scriptStyles.rel = "stylesheet";
        scriptStyles.type = "text/css";
        scriptStyles.href = sr_css_file;
        head.appendChild(scriptStyles);
        //alert('adding css to header:'+sr_css_file);
     }
}());
</script> 

gzipcheck.js.jgz - це просто sr_gzipEnabled = true; Цей тест, щоб переконатися, що браузер може обробляти код gzipped та створювати резервну копію, якщо вони не можуть.

Потім зробіть щось подібне у нижньому колонтитулі, припускаючи, що всі ваші js є в одному файлі і можуть перейти в колонтитул.

<div id="sr_js"></div> 
<script type="text/javascript"> 
(function () {
    var sr_js_file = 'http://d2ft4b0ve1aur1.cloudfront.net/js-050/sr-br-min.js';
    if (sr_gzipEnabled) {
       sr_js_file = 'http://d2ft4b0ve1aur1.cloudfront.net/js-050/sr-br-min.js.jgz';
    }
    var sr_script_tag = document.getElementById("sr_js");         
    if (sr_script_tag) {
    var scriptStyles = document.createElement("script");
    scriptStyles.type = "text/javascript";
    scriptStyles.src = sr_js_file;
    sr_script_tag.appendChild(scriptStyles);
    //alert('adding js to footer:'+sr_js_file);
    }
}());
</script> 

ОНОВЛЕННЯ: Amazon тепер підтримує стиснення gzip. Оголошення, тому це більше не потрібно. Оголошення Amazon


велике спасибі за цю пропозицію. Якщо я вас правильно зрозумів, ви звертаєтесь до випадку, коли браузер користувача не в змозі прочитати gzipped файл, який все ще може виникнути, хоча це стосується досить невеликого відсотка браузерів на сьогодні. Один з можливих недоліків цього рішення, якщо ви посилаєтесь на посилання, яке я розмістив у своєму запитанні [посилання ], - це те, що це означає, що ви не можете кешувати свою сторінку, оскільки воно буде працювати лише в тому випадку, якщо ваш код буде динамічно запускатися кожного разу, коли користувач завантажує. сторінка (що, звичайно, моя).
Дональд Дженкінс

@DonaldJenkins Я думаю, що js все одно буде кешовано. Коли ви будуєте тег скрипту в js snip, js все одно повинен викликатися, і я вважаю, що якщо він знаходиться в кеші, браузер використовував би його звідти.
Шон

2
Тестова сторінка blog.kosny.com/testpages/safari-gz вказує на те, що попередження "Будьте уважні, називаючи та тестуючи в Safari. Оскільки сафарі не обробляє css.gz або js.gz", застаріло. У Safari 7 на Mavericks і в Safari на iOS 7 працюють і css.gz, і js.gz. Я не знаю, коли відбулася ця зміна, я тестую лише ті пристрої, які у мене є.
garyrob

14

Cloudfront підтримує gzipping.

Cloudfront підключається до вашого сервера через HTTP 1.0. За замовчуванням деякі веб-сервери, включаючи nginx, не подають gzipped вміст у з'єднання HTTP 1.0, але ви можете сказати це, додавши:

gzip_http_version 1.0

до конфігурації nginx. Еквівалентну конфігурацію можна встановити для будь-якого веб-сервера, який ви використовуєте.

Це має побічний ефект від того, щоб не підтримувати постійні з'єднання для HTTP 1.0-з'єднань, але, оскільки переваги стиснення величезні, це, безумовно, варто скасувати.

Взято з http://www.cdnplanet.com/blog/gzip-nginx-cloudfront/

Редагувати

Обслуговування вмісту, який збирається на льоту через хмарний фронт Amazon, є небезпечним, і, ймовірно, цього не слід робити. В основному, якщо ваш веб-сервер збирає вміст, він не встановить Довжину вмісту, а натомість надсилатиме дані як розділені.

Якщо зв’язок між Cloudfront та вашим сервером перервано та передчасно перервано, Cloudfront все одно кешує частковий результат і виконує функцію кешованої версії до його закінчення.

Прийнята відповідь про gzipping його спочатку на диску, а потім подачі gzipped версії - краща ідея, оскільки Nginx зможе встановити заголовок довжини вмісту, і тому Cloudfront відкине усічені версії.


5
-1, Ця відповідь не має нічого спільного з питанням. Nginx! = S3 та Cloudfront
Джонатан

@Danack, у вас виникли багато проблем із кешуванням Cloudfront напіввитягнутих файлів через цю проблему? Я намагаюся зрозуміти, наскільки ця проблема була для вас на практиці.
найкраще

1
@poshest Це сталося. Користь подачі gzipped на льоту була дуже мала (оскільки gzip так швидко працює на сервері), тому я вимкнув її, як тільки побачив, що це відбувається. Пошкоджені дані - набагато більша проблема, ніж "час на перший байт" бути 200 мс повільним у рідкісних випадках, коли вміст ще не існує у форматі gzipped.
Данак

Якщо в заголовку відсутнє властивість Content-Length у заголовку, але включає Transfer-Encoding: фрагмент (як це часто буває з gzipped активами), CloudFront НЕ буде кешувати частковий актив, якщо він не отримує кінцевий фрагмент. Якщо в ньому відсутні обидва ці властивості, можливе кешування неповного активу. Дивіться: docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…
Cody Duval

5

Нещодавно ми зробили кілька оптимізацій для uSwitch.com для стиснення деяких статичних активів на нашому сайті. Хоча для цього ми налаштували цілий проксі-сервер nginx, я також зібрав невеличку програму Heroku, яка проксі-сервера між CloudFront та S3 для стиснення вмісту: http://dfl8.co

Дані загальнодоступні об’єкти S3 можна отримати за допомогою простої структури URL-адрес, http://dfl8.co просто використовує ту саму структуру. Тобто такі URL-адреси еквівалентні:

http://pingles-example.s3.amazonaws.com/sample.css
http://pingles-example.dfl8.co/sample.css
http://d1a4f3qx63eykc.cloudfront.net/sample.css

5

Вчора Amazon оголосив про нову функцію, тепер ви можете ввімкнути gzip у своєму розповсюдженні.

Він працює з s3 без доданих .gz файлів самостійно, я спробував нову функцію сьогодні, і вона працює чудово. (Вам потрібно визнати недійсними поточні об’єкти)

Більше інформації


0

Ви можете налаштувати CloudFront для автоматичного стиснення файлів певних типів та обслуговування стислих файлів.

Дивіться Посібник для розробників AWS


Чи можете ви додати більше інформації про своє рішення (можливо, приклад), щоб зробити це кращою відповіддю.
Ягамі Світло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.