Обслуживание 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 и обслуживания компонентов летать.
таким образом, до сих пор у меня было впечатление, что нужно выбирать между двумя альтернативами:
переместите все ресурсы в Amazon CloudFront и забудьте о GZipping;
держите компоненты самостоятельно размещенными и настройте наш сервер для обнаружения входящих запросов и выполнения GZipping на лету по мере необходимости, что я и решил сделать до сих пор.
здесь были решения для решите эту проблему, но по существу эти не работает. [ссылке].
теперь, похоже, Amazon Cloudfront поддерживает пользовательский origin, и это теперь можно использовать стандартный метод HTTP Accept-Encoding для обслуживания содержимого gzipped, если вы используете пользовательский источник [ссылке].
Я до сих пор не смог реализовать новую функцию на моем сервере. Сообщение в блоге, на которое я ссылался выше, которое является единственным, которое я найденная детализация изменения, похоже, подразумевает, что вы можете включить только gzipping (обходные пути бара, которые я не хочу использовать), если вы выберете пользовательский источник, который я бы предпочел: я считаю, что проще разместить файлы coresponding на моем сервере Cloudfront и ссылаться на них оттуда. Несмотря на тщательное чтение документации, я не знаю:
означает ли новая функция, что файлы должны размещаться на моем собственном сервере домена через изготовленное на заказ начало, и если Итак, какая настройка кода достигнет этого;
Как настроить заголовки css и javascript, чтобы убедиться, что они обслуживаются gzipped из Cloudfront.
6 ответов:
обновление: Amazon теперь поддерживает сжатие gzip, так что это больше не нужно. Amazon В Объявлении
оригинальный ответ:
ответ заключается в том, чтобы gzip файлы CSS и JavaScript. Да, вы правильно прочитали.
gzip -9 production.min.css
это произведет
production.min.css.gz
. Уберите.gz
, загрузите в S3 (или любой другой исходный сервер, который вы используете) и явно установитеContent-Encoding
заголовок для файла вgzip
.это не на лету gzipping, но вы можете очень легко обернуть его в свои сценарии сборки/развертывания. Преимущества:
- для Apache не требуется процессор для gzip содержимого при запросе файла.
- файлы gzipped на самом высоком уровне сжатия (предполагая
gzip -9
).- вы обслуживаете файл из 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 Руководство Для Разработчиков