Obsługa gzipped CSS i JavaScript z Amazon CloudFront przez S3

Szukałem sposobów na szybsze ładowanie mojej witryny, a jednym ze sposobów, który chciałbym zbadać, jest większe wykorzystanie Cloudfront.

Ponieważ Cloudfront pierwotnie nie był zaprojektowany jako CDN pochodzenia niestandardowego i ponieważ nie obsługiwał gzipping, do tej pory używałem go do hostowania wszystkich moich obrazów, do których odwołuje się ich Cloudfront cname w kodzie mojej witryny i zoptymalizowany za pomocą nagłówków dalekiej przyszłości.

Pliki CSS i javascript, z drugiej strony, są hostowane na własną rękę do tej pory miałem wrażenie, że nie mogą być obsługiwane przez Gzipping z Cloudfront, i że zysk z gzipping (około 75 procent) przeważa nad tym, że z korzystania z CDN (około 50 procent): Amazon S3 (a więc Cloudfront) nie obsługuje serwowania treści gzip w standardowy sposób za pomocą nagłówka HTTP Accept-Encoding, który jest wysyłany przez przeglądarki w celu wskazania ich wsparcia dla kompresji gzip, a więc nie byli w stanie Gzip i obsługiwać komponentów na serwerze. leć.

Stąd do tej pory miałem wrażenie, że trzeba wybierać pomiędzy dwoma alternatywami:

  1. Przenieś wszystkie aktywa do Amazon CloudFront i zapomnij o GZipping;

  2. Utrzymuj komponenty samodzielnie hostowane i skonfiguruj nasz serwer, aby wykrywał przychodzące żądania i wykonywał GZipping w locie, co do tej pory postanowiłem zrobić.

Istnieją były obejścia, aby rozwiązać ten problem, ale zasadniczo te nie praca . [link ].

Teraz wydaje się, że Amazon Cloudfront obsługuje niestandardowe pochodzenie i że jest teraz możliwe użycie standardowej metody HTTP Accept-Encoding do serwowania treści gzipped, jeśli używasz niestandardowego pochodzenia [link].

Do tej pory nie udało mi się zaimplementować nowej funkcji na moim serwerze. Wpis na blogu, który podlinkowałem powyżej, który jest jedynym, który znalazłem szczegółowo opisując zmianę, wydaje się sugerować, że możesz włączyć tylko gzipping (bar obejścia, których nie chcę używać), jeśli zdecydujesz się na niestandardowe pochodzenie, którego wolałbym nie: uważam, że łatwiej jest hostować pliki rdzeniowe na moim serwerze Cloudfront i łączyć się z nimi stamtąd. Pomimo uważnego przeczytania dokumentacji, Nie wiem:

  • Czy nowa funkcja oznacza, że pliki powinny być hostowane na moim własnym serwerze domeny poprzez custom origin, a jeśli tak, to jaka konfiguracja kodu to osiągnie;

  • Jak skonfigurować css i javascript nagłówki, aby upewnić się, że są one obsługiwane z Cloudfront.

Author: Jo Liss, 2011-03-26

6 answers

Aktualizacja: Amazon obsługuje teraz kompresję gzip, więc nie jest to już potrzebne. Amazon Announcement

Oryginalna odpowiedź:

Odpowiedzią jest gzip plików CSS i JavaScript. Tak, dobrze to przeczytałeś.

gzip -9 production.min.css

To da production.min.css.gz. Usuń .gz, prześlij do S3 (lub dowolnego serwera źródłowego, którego używasz) i jawnie Ustaw nagłówek Content-Encoding dla pliku na gzip.

Nie jest to gzipping on-the-fly, ale można go łatwo zapakować do skryptów budowania/wdrażania. Zalety:
  1. nie wymaga CPU dla Apache do gzip zawartości, gdy plik jest wymagane.
  2. pliki są gzipowane na najwyższym poziomie kompresji(zakładając gzip -9).
  3. Podajesz Plik z CDN.

Zakładając, że pliki CSS/JavaScript są (a) minifikowane i (b) wystarczająco duże, aby uzasadnić procesor wymagany do dekompresji na komputerze użytkownika, możesz uzyskać znaczny wzrost wydajności proszę.

Po prostu pamiętaj: jeśli zmienisz plik, który jest buforowany w CloudFront, upewnij się, że anulujesz pamięć podręczną po dokonaniu tego typu zmiany.

 196
Author: Skyler Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 22:19:35

Moja odpowiedź to start na to: http://blog.kenweiner.com/2009/08/serving-gzipped-javascript-files-from.html

Bazując na odpowiedzi Skylera możesz wgrać gzip i nie-gzipową wersję css i js. Ostrożnie nazywaj i testuj w Safari. Ponieważ safari nie obsługuje plików .css.gz ani .js.gz.

site.js i site.js.jgz oraz site.css i site.gz.css (musisz ustawić nagłówek content-encoding na prawidłowy typ MIME, aby te serwowały poprawnie)

Następnie na swojej stronie put.

<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 jest po prostu sr_gzipEnabled = true; testuje, aby upewnić się, że przeglądarka może obsłużyć kod gzipped i zapewnić kopię zapasową, jeśli nie mogą.

Następnie zrób coś podobnego w stopce zakładając, że wszystkie Twoje js są w jednym pliku i mogą przejść do stopki.

<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> 

Aktualizacja: Amazon obsługuje teraz kompresję gzip. Ogłoszenie, więc to już nie jest potrzebne. Ogłoszenie Amazona

 15
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-29 21:41:33

Cloudfront obsługuje gzipping.

Cloudfront łączy się z Twoim serwerem poprzez HTTP 1.0. Domyślnie niektóre serwery, w tym nginx, nie obsługują zawartości gzipped do połączeń HTTP 1.0, ale możesz powiedzieć, aby to zrobić, dodając:
gzip_http_version 1.0
Do twojego nginx config. Równoważna konfiguracja może być ustawiona dla dowolnego serwera www, którego używasz.

To ma efekt uboczny sprawiania, że połączenia keep-alive nie działają dla połączeń HTTP 1.0, ale ponieważ korzyści z kompresji są Ogromne, na pewno warto się wymienić.

Wzięte z http://www.cdnplanet.com/blog/gzip-nginx-cloudfront/

Edit

Serwowanie treści, które są gziped w locie przez Amazon Cloud front jest niebezpieczne i prawdopodobnie nie powinno być zrobione. Zasadniczo, jeśli serwer WWW jest gzipping treści, nie będzie ustawić długość zawartości i zamiast tego wysłać dane jako chunked.

Jeśli połączenie między Cloudfront a twoim serwerem zostanie przerwane i przedwcześnie zerwane rozwiązanie Cloudfront nadal buforuje wynik częściowy i służy jako wersja buforowana, dopóki nie wygaśnie.

Akceptowana odpowiedź gzipping najpierw na dysku, a następnie serwowanie wersji gzipped jest lepszym pomysłem, ponieważ Nginx będzie w stanie ustawić nagłówek Content-Length, a więc Cloudfront odrzuci wersje okrojone.

 14
Author: Danack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-01 11:04:47

Wykonaliśmy kilka optymalizacji dla uSwitch.com ostatnio do kompresji niektórych zasobów statycznych na naszej stronie. Chociaż skonfigurowaliśmy do tego cały serwer proxy nginx, zebrałem również małą aplikację Heroku, która proxy między CloudFront i S3 kompresują zawartość: http://dfl8.co

Podane publicznie dostępne obiekty S3 mogą być dostępne za pomocą prostej struktury URL, http://dfl8.co po prostu używa tej samej struktury. Tzn. następujące adresy URL są równoważne:

http://pingles-example.s3.amazonaws.com/sample.css
http://pingles-example.dfl8.co/sample.css
http://d1a4f3qx63eykc.cloudfront.net/sample.css
 5
Author: pingles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-18 14:17:07

Wczoraj amazon ogłosił nową funkcję, możesz teraz włączyć gzip w swojej dystrybucji.

Działa z s3 bez dodawania .pliki gz sam, wypróbowałem dziś nową funkcję i działa świetnie. (trzeba jednak unieważnić bieżące Obiekty)

Więcej informacji

 5
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-18 12:55:36

Możesz skonfigurować CloudFront tak, aby automatycznie kompresował pliki określonych typów i obsługiwał skompresowane pliki.

Zobacz AWS poradnik programisty

 0
Author: Rafi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-06 07:42:51