Google Page Speed - Installation unter Ubuntu

Seit 2011 stellt Google ein Apachemodul namens Google Page Speed zur Verfügung. Dieses bietet einige nette Features mit denen man die Ladezeiten seiner Seite deutlich reduzieren kann. In diesem Artikel möchte ich Euch zeigen, wie man G oogle Page Speed unter Ubuntu installiert und Euch mit einer Beispielkonfiguration und ein paar Tipps den Einstieg erleichtern.

1. Installation unter Ubuntu

Zur Installation benötigen wir Zugriff auf den Terminal des Servers. Habt Ihr diesen nicht, bittet Euren Hoster darum mod_pagespeed zu installieren. Wenn Ihr Glück habt ist das bereits der Fall und Ihr könnt direkt zu Punkt 2 springen. Für alle anderen geht es hier weiter.

Zuerst einmal laden wir die aktuelle Version des Moduls herunter und entpacken diese:

$ wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb
$ sudo dpkg -i mod-pagespeed-*.deb
$ apt-get -f install

Anschließend können wir das Paket entfernen.

$ rm mod-pagespeed-*.deb

Zum Abschluss müssen wir pagespeed noch aktivieren und den Apache neu starten.

$ a2enmod pagespeed
$ apache2ctl restart

Einzelheiten zur Installation auf anderen Systemen könnt Ihr hier erfahren: https://developers.google.com/speed/pagespeed/module/download

2. Konfiguration

Google Page Speed ist nun installiert und läuft hoffentlich nun problemlos. Die Konfiguration kann in der pagespeed.conf verändert werden (/etc/apache2/mods-available/pagespeed.conf). Sollte sich die Datei wider Erwarten nicht an diesem Ort befinden, könnt Ihr sie mit folgendem Befehl finden:

$ locate pagespeed.conf

Ich persönlich ziehe es allerdings vor die Einstellungen je nach Seite unterschiedlich zu handhaben. Für diesen Fall können wir auf die .htaccess Datei zugreifen. Ihr habt die Möglichkeit mehrere Filter auszuwählen, die Google Page Speed verwenden soll. Eine detaillierte Auflistung findet Ihr auf folgender Seite:

https://developers.google.com/speed/pagespeed/module/config_filters

Beispiel: christianhanne.de

Als kleines Anwendungsbeispiel möchte ich Euch die Konfiguration für meine eigene Seite nicht vorenthalten. Durch die Anweisung ModPagespeedRewriteLevel PassThrough deaktivieren wir die Core-Filter von ModPageSpeed. Dadurch können wir direkter bestimmen was wirklich benötigt wird. Prinzipiell kann man die Filter auch als Komma-separierte Liste definieren. Ich ziehe diese Variante allerdings vor, weil sie übersichtlicher und einzelne Anweisungen schneller auskommentiert werden können.

<IfModule pagespeed_module> 
  ModPagespeed on
  ModPagespeedRewriteLevel PassThrough
  ModPagespeedEnableFilters extend_cache
  ModPagespeedEnableFilters collapse_whitespace
  ModPagespeedEnableFilters combine_css
  ModPagespeedEnableFilters move_css_to_head
  ModPagespeedEnableFilters flatten_css_imports
  ModPagespeedEnableFilters remove_comments
  ModPagespeedEnableFilters inline_css
  ModPagespeedEnableFilters insert_image_dimensions
  ModPagespeedEnableFilters rewrite_css
  ModPagespeedEnableFilters rewrite_images
  ModPagespeedEnableFilters rewrite_javascript
  ModPagespeedEnableFilters defer_javascript
  ModPagespeedEnableFilters lazyload_images
</IfModule>

Google Page Speed - Filter

Für alle die des Englischen weniger mächtig sind oder die Auflistung bei Google zu unübersichtlich finden, habe ich mir die Mühe gemacht die Beschreibung der Filter zu übersetzen. Die Filter sind hierarchisch aufgebaut. Das bedeutet, dass es übergeordnete Gruppen gibt, die automatisch eine Reihe von untergeordneten Filtern aktivieren. Ich habe versucht diese Hierarchie in meiner Auflistung verständlich zu machen:

  • add_head
    Fügt jedem Dokument ein <head> Element hinzu, wenn keines vorhanden ist.

  • combine_heads
    ​Fügt mehrere <head> Elemente im Dokument zu einem einzigen zusammen.

  • inline_import_to_link
    Extrahiert @import Anweisungen aus Inline <style> Elementen zu <link> Elementen.

  • outline_css
    Lagert große CSS-Bläcke in cachebare Dateien aus.

  • outline_javascript
    Lagert große Javascript-Blöcke in cachebare Dateien aus.

  • move_css_above_scripts
    Sorgt dafür, dass CSS-Elemente immer oberhalb von <script> Tags stehen.

  • move_css_to_head
    Schiebt alle CSS-Anweisungen in das <head> Tag.

  • combine_css
    Fasst mehrere CSS-Elemente zu einem einzigen zusammen.

  • rewrite_css
    Schreibt CSS-Dateien um und entfernt dabei überflüssigen Whitespace und Kommentare. Außerdem schreibt es Bilder um, die in CSS-Dateien verlinkt sind (Hintergründe etc.). Allerdings nur dann, wenn die entprechenden Filter aktiv sind.

  • fallback_rewrite_css_urls
    Schreibt alle Referenzen in CSS-Dateien um, die ansonsten nicht gelesen oder komprimiert werden können.

  • rewrite_style_attributes
    Schreibt CSS in <style> Elementen um, indem die (für CSS-Dateien) konfigurierten Filter angewendet werden.

  • rewrite_style_attributes_with_url
    Schreibt CSS in <style> Elementen um, wenn dort der String "url(" vorkommt.

  • flatten_css_imports
    Verringert die CSS-Verschachtelung indem die @import Anweisungen reduziert werden.

  • prioritize_critical_css
    Ersetzt alle CSS-Tags mit <style> Elementen, die nur das vom Dokument benötigte CSS enthalten.

  • make_google_analytics_async
    Ändert die Nutzung von synchronem Laden der Google Analytics API zu ansynchronem Laden.

  • rewrite_javascript
    Schreibt Javascript-Dateien um und entfernt Whitespace und Kommentare.

  • combine_javascript
    Kombiniert mehrere Script-Elemente zu einem einzigen.

  • canonicalize_javascript_libraries
    Leitet Javascript-Bibliotheken zu einem Javascript Hosting Service um.

  • inline_css
    Konvertiert kleine CSS-Dateien zu Inline-Elementen.

  • inline_google_font_css
    Konvertiert kleine CSS-Dateien, die von fonts.googleapis.com genutzt werden, zu Inline-Elementen.

  • inline_javascript
    Konvertiert kleine Javascript-Dateien zu Inline-Elementen.

  • local_storage_cache
    Speichert Inline-Elemente via HTML4 Local Storage.

  • insert_ga
    Fügt ein Google Analytics Snippet zur Seite hinzu.

  • rewrite_images
    Optimiert Bilder, kodiert sie neu, entfernt überflüssige Pixel und konvertiert kleine Bilder zu Inline-Elementen.

    • inline_images
      Ersetzt kleine Bilddateien mit data:-Urls.

    • recompress_images
      Komprimiert Bilder neu und entfernt dabei überflüssige Metatags, konvertiert GIFs zu PNGs.

      • recompress_jpeg
        Komprimiert Jpegs neu und entfernt dabei überflüssige Metatags.

      • recompress_png
        Komprimiert PNGs neu und entfernt dabei überflüssige Metatags.

      • recompress_webp
        Komprimiert Webp-Dateien neu und entfernt dabei überflüssige Metatags.

      • convert_gif_to_png
        Konvertiert GIFs zu PNGs.

      • strip_image_color_profile
        Entfernt alle Farbprofile aus Bildern.

      • strip_image_meta_data
        Entfernt EXIF-Tags aus Bildern.

      • jpeg_sampling
        Reduziert das Color Sampling von Jpegs zu 4:2:0.

    • resize_images
      Verkleinert Bilder, wenn das <img>-Tag eine kleine Größe für das Bild vorsieht, als die tatsächliche Größe des Bildes.

    • resize_rendered_image_dimensions
      Verkleinert Bilder automatisch, wenn die Anzeigegröße des Bildes kleiner ist als die Größe des Bildes.

  • convert_jpeg_to_progressive
    Konvertiert große Jpegs in das Format progressive.

  • convert_png_to_jpeg
    Konvertiert alle GIF- und PNG-Dateien zu Jpegs.

  • convert_jpeg_to_webp
    Generiert Webp- anstatt Jpeg-Dateien für Browser, die dieses Format unterstützen.

  • insert_image_dimensions
    Fügt allen <img> Elementen width- und height-Attribute hinzu, wenn diese nicht vorhanden sind.

  • inline_preview_images
    Verwendet Inline-Bilder schlechter Qualität als Platzhalter für noch nicht geladene Bilder.

  • resize_mobile_images
    Funktiniert genau wie inline_preview_images, verwendet aber kleinere Bilder für Mobile Browser.

  • remove_comments
    Entfernt HTML-Kommentare.

  • collapse_whitespace
    Entfernt überflüssigen Whitespace in HTML-Dateien, außer solchen in <pre>, <script>, <style> oder <textarea> Elementen.

  • elide_attributes
    Entfernt alle unwichtigen Attribute aus HTML-Elementen (laut der HTML-Spezifikation).

  • extend_cache
    Erweitert die Cache-Lebensdauer von CSS-, Javascript- und Bildreferenzen die nicht bereits anderweitig optimiert wurden, indem die URLs mit einem Content-Hash signiert werden.

    • extend_cache_css
      Erweitert die Cache-Lebensdauer von CSS-Dateien die nicht bereits anderweitig optimiert wurden, indem die URLs mit einem Content-Hash signiert werden.

    • extend_cache_images
      Erweitert die Cache-Lebensdauer von Bild-Dateien die nicht bereits anderweitig optimiert wurden, indem die URLs mit einem Content-Hash signiert werden.

    • extend_cache_scripts
      Erweitert die Cache-Lebensdauer von Javascript-Dateien die nicht bereits anderweitig optimiert wurden, indem die URLs mit einem Content-Hash signiert werden.

  • extend_cache_pdfs
    Erweitert die Cache-Lebensdauer von PDF-Dateien, indem die URLs mit einem Content-Hash signiert werden.

  • sprite_images
    Kombiniert Hintergrundbilder zu einem einzigen Sprite.

  • rewrite_domains
    Schreibt Domains um, die nicht anderweitig von PageSpeed optimiert wurden, basierend auf den Einstellungen MapRewriteDomain und ShardDomain in der pagespeed.conf.

  • trim_urls
    Kürzt Urls, indem sie relativ zur Basisurl angegeben werden.

  • pedantic
    Fügt Default-Typen zu <script> und <style> Elementen hinzu, wenn kein type-Attribut angegeben wurde und das Dokument kein HTML5-Dokument ist.

  • remove_quotes
    Entfernt Anführungsstriche um HTML-Attribute, wo sie nicht notwendig sind.

  • add_instrumentation
    Fügt Javascript hinzu, welches die Latenz misst und zum Server zurücksendet.

  • convert_meta_tags
    Fügt jedem Metatag einen Response Header hinzu mit einem http-equiv-Attribut.

  • defer_javascript
    Verzögert die Ausführung von Javascript bis das Dokument vollständig geladen ist.

  • dedup_inlined_images
    Ersetzt sich wiederholende Bilder mit Javascript, dass das entsprechend Bild automatisch aus dem ersten Vorkommen des Bildes dupliziert.

  • lazyload_images
    Lädt Bilder erst dann, wenn der User sie im Viewport des Browsers betrachtet.

  • insert_dns_prefetch
    Fügt <link rel="dns-prefetch" href="//www.example.com"> hinzu um die für die DNS-Auflösung benötigte Zeit zu reduzieren.

Testen und Feintuning

Nachdem wir unsere Einstellungen vorgenommen haben ist natürlich die große Frage, ob Google Page Speed überhaupt läuft und seine Arbeit tut. Wir können uns mit einem Aufruf vergewissen, dass pagespeed tatsächlich aktiv ist.

$ curl -D - http://www.christianhanne.de

Wenn Google Page Speed aktiv ist, muss im Response-Header des Requests folgender String vorkommen (die Versionsnummer kann bei Euch variieren):

X-Mod-Pagespeed: 1.6.29.7-3566

Nachdem wir uns vergewissert haben, dass mod_pagespeed aktiv ist, können wir auf ein weiteres Tool von Google zurück greifen: Pagespeed Insights. Dies ist eine Erweiterung für Chrome, mit deren Hilfe Ihr Eure Seiten analysieren könnt. Spaßes halber könnt Ihr mod_pagespeed für Eure Seite ausschalten, um einen größeren Eindruck von Unterschied in der Performance zu bekommen.

Welche Filter nun letztendlich für Euch relevant sind, solltet Ihr je nach Seite bzw. Projekt entscheiden. Darum ist es sinnvoll die Einstellungen je Projekt in der .htaccess zu definieren. Ich wünsche Euch viel Spaß beim Ausprobieren.

Noch keine Kommentare vorhanden.