Обслуживание gzipped CSS и JavaScript из Amazon CloudFront через S3


Я искал способы сделать загрузку моего сайта быстрее, и один из способов, который я хотел бы изучить, - это более широкое использование Cloudfront.

поскольку Cloudfront изначально не был разработан как CDN пользовательского происхождения и поскольку он не поддерживал gzipping, я до сих пор использовал его для размещения всех моих изображений, на которые ссылается их Cloudfront cname в коде моего сайта и оптимизирован с заголовками far-futures.

файлы CSS и javascript, с другой стороны, размещаются на мой собственный сервер, потому что до сих пор я был под впечатлением, что они не могли быть подан сжатый из CloudFront, и что выигрыш от сжатия (около 75 процентов) перевешивает, что с помощью CDN (около 50 процентов): Амазонка С3 (и, следовательно, оно) не поддерживает подают сжатый контент по стандартной методике с использованием HTTP-принять-Encoding заголовок, который отправляется на браузерах, чтобы указать их поддержка gzip-сжатия, и поэтому они не смогли gzip и обслуживания компонентов летать.

таким образом, до сих пор у меня было впечатление, что нужно выбирать между двумя альтернативами:

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

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

здесь были решения для решите эту проблему, но по существу эти не работает. [ссылке].

теперь, похоже, Amazon Cloudfront поддерживает пользовательский origin, и это теперь можно использовать стандартный метод HTTP Accept-Encoding для обслуживания содержимого gzipped, если вы используете пользовательский источник [ссылке].

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

  • означает ли новая функция, что файлы должны размещаться на моем собственном сервере домена через изготовленное на заказ начало, и если Итак, какая настройка кода достигнет этого;

  • Как настроить заголовки css и javascript, чтобы убедиться, что они обслуживаются gzipped из Cloudfront.

6 189

6 ответов:

обновление: Amazon теперь поддерживает сжатие gzip, так что это больше не нужно. Amazon В Объявлении

оригинальный ответ:

ответ заключается в том, чтобы gzip файлы CSS и JavaScript. Да, вы правильно прочитали.

gzip -9 production.min.css

это произведет production.min.css.gz. Уберите .gz, загрузите в S3 (или любой другой исходный сервер, который вы используете) и явно установите Content-Encoding заголовок для файла в gzip.

это не на лету gzipping, но вы можете очень легко обернуть его в свои сценарии сборки/развертывания. Преимущества:

  1. для Apache не требуется процессор для gzip содержимого при запросе файла.
  2. файлы gzipped на самом высоком уровне сжатия (предполагая gzip -9).
  3. вы обслуживаете файл из CDN.

предполагая, что ваши файлы CSS/JavaScript (a) минимизированы и (b) достаточно велики, чтобы оправдать процессор необходимый для распаковки на компьютере пользователя, вы можете получить значительный прирост производительности здесь.

просто помните: если вы вносите изменения в файл, который кэшируется в CloudFront, убедитесь, что вы аннулируете кэш после внесения этого типа изменений.

мой ответ-взлет на этом: http://blog.kenweiner.com/2009/08/serving-gzipped-javascript-files-from.html

построение ответа Скайлера вы можете загрузить версию gzip и не-gzip css и js. Будьте осторожны именования и тестирования в Safari. Потому что 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 В Объявлении

Cloudfront поддерживает gzipping.

Cloudfront подключается к серверу через HTTP 1.0. По умолчанию некоторые веб-серверы, включая nginx, не обслуживают gzipped-контент для соединений HTTP 1.0, но вы можете сказать это, добавив:

gzip_http_version 1.0

к вашей конфигурации nginx. Эквивалентная конфигурация может быть установлена для любого веб-сервера, который вы используете.

это имеет побочный эффект создания keep-alive соединения не работают для соединений HTTP 1.0, но как преимущества сжатия огромны, это определенно стоит компромисса.

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

Edit

обслуживание контента, который gzipped на лету через Amazon cloud front, опасно и, вероятно, не должно быть сделано. В основном, если ваш веб-сервер gzipping контент, он не будет устанавливать длину контента и вместо этого отправлять данные как куски.

Если соединение между Cloudfront и вашим сервером прервано и преждевременно разорвано, Cloudfront все еще кэширует частичный результат и служит ему в качестве кэшированной версии до истечения срока ее действия.

принятый ответ gzipping сначала на диск, а затем на обслуживание версии gzipped-это лучшая идея, поскольку Nginx сможет установить заголовок Content-Length, и поэтому Cloudfront откажется от усеченных версий.

мы сделали несколько оптимизаций для 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

вчера amazon объявила о новой функции, теперь вы можете включить gzip в своем дистрибутиве.

Он работает с s3 без добавления .GZ файлы сами, я попробовал новую функцию сегодня, и она отлично работает. (нужно аннулировать вы текущие объекты, хотя)

Подробнее

вы можете настроить CloudFront для автоматического сжатия файлов определенных типов и обслуживания сжатых файлов.

смотрите AWS Руководство Для Разработчиков