High Performance und Feature Upgrade: HTTP/2 und WebSockets

by , on


Zum 1. März haben wir zahlreiche neue Funktionen und Verbesserungen bei unseren HTTP Content Delivery Diensten aktiviert. Ein wesentlicher Aspekt ist hierbei die Unterstützung von HTTP/2 und das Routing von WebSocket Verbindungen.

HTTP/2 ist die neue Version des allgegenwärtigen HTTP-Protokolls, welches inzwischen nahezu 80% aller Webbrowser unterstützen. Mit aktuellen Webseiten lässt sich dank HTTP/2 die Ladezeit um bis zu 70% verbessern. Es lohnt sich also einen genaueren Bick hierauf zu werfen.

Deutlich schnellere Ladezeiten durch HTTP/2

Der nachwievor am weitesten verbreitete Standard HTTP/1.1 ist nun nahezu 20 Jahre alt - eine Ewigkeit in IT Maßstäben. Damals bestanden Webseiten aus vergleichsweise wenigen Elementen. Spätestens mit dem Einzug des Web 2.0 hat sich dies drastisch geändert und so besteht eine aktuelle Website nicht selten aus weit mehr als 200 Einzelkomponenten. Um diese schnell und effizient an den Browser auszuliefern, müssen zahlreiche Optimierungen erfolgen. Letztlich muss bei dem ersten Seitenaufruf jedes dieser Elemente von dem Browser des Besuchers angefragt und geladen werden. Ziel dieser Optimierungen ist daher primär die Größe der einzelnen Elemente bestmöglich zu reduzieren, diese in einer sinnvollen Reihenfolge zu laden und dies mit möglichst wenige Verbindungen. Mit HTTP 2.0 ändert sich dies.

Das primäre Zauberwort heißt "Multiplexed Streams". Hierbei können über eine einzige Verbindung gleich mehrere Elemente parallel übertragen werden. Dies klingt zunächst vielleicht nicht sonderlich spektakulär, hat in der Praxis aber gravierende Auswirkungen.

 

Auswirkungen der "Multiplexed Streams"

TLS/SSL

Das HTTP/2 Protokoll ist ein rein binäres Protokoll, welches sichere Verbindungen per Transport Layer Security als festen Bestandteil hat. Lange Zeit galten TLS Verbindungen als langsam. Grund dieser Behauptung war die zeitaufwendige Aushandlung der Verschlüsselung bei einem Verbindungsaufbau. Durch das Multiplexing von HTTP 2.0 ist dies nicht mehr wie bisher für die zahlreichen parallelen Verbindungen erforderlich.

 

Verteilung auf Asset URL's (Domain Sharding)

Browser öffnen nur eine vordefinierte Anzahl von Verbindungen zu einem Zielsystem. Um dies zu umgehen, wurden in der Vergangenheit oftmals Elemente einer Seite auf mehrere Zielsysteme verteilt, um diese möglichst parallel zu laden. Dies ist durch das Multiplexing nicht weiter erforderlich und kann sich sogar nachteilig auswirken.

 

Zusammenfassung von Scripts (Bundling)

Die zahlreichen Scripts und Stylesheets einer Website werden zumeist als funktionale Gruppe gebündelt und in einer Datei an den Browser übertragen. Dies bringt gravierende Nachteile mit sich: Ändert sich auch nur ein Byte in einer der Quellen, muss der Browser die gesamte Datei neu laden. Durch das Multiplexing entfällt diese Notwendigkeit ebenfalls und das Caching im Browser und ggf. durch Content Delivery Networks kann hiermit besser genutzt werden.

Neuerungen für Webentwickler

Wie man sieht gibt es hier zahlreiche Dinge bei neuen Webprojekten zu beachten. Was bisher für HTTP/1 die Geschwindigkeit optimierte, kann die Vorteile von HTTP/2 wiederum ausbremsen.

Wer sich weitergehend hierüber informieren möchte, dem empfehlen wir das frei verfügbare Buch „HTTP2 explained“ von Daniel Steinberg, welches unter https://daniel.haxx.se/http2/ in zahlreichen Sprachen verfügbar ist.

Wer es ganz genau wissen möchte, dem Sie hier noch der Link zum IETF Draft gegeben: https://tools.ietf.org/html/draft-ietf-httpbis-http2-17

Eine Liste zum Stand der HTTP/2 Implementierung in Software Produkte ist unter https://github.com/http2/http2-spec/wiki/Implementations verfügbar.

Aktivieren der HTTP/2 Unterstützung

Für alle über die IDNT Content Delivery Systeme ausgelieferten Inhalte ist das Protokoll nun standardmäßig aktiv und wird für alle TLS/SSL gesicherte Verbindungen bevorzugt verwendet. Um von den Vorteilen vollständig zu profitieren, sollten die Backend- Server ebenfalls HTTP/2 unterstützen. Dies ist über die folgenden Einstellungen möglich:

NGINX

Nginx unterstützt dies ab Version 1.9.5. Zur Aktivierung ist die listen Direktive um den Wert http zu erweitern:

server {
  listen        443 ssl http2;
  ...
}

Apache

Hier ist Version 2.4 oder höher erforderlich. Zur Aktivierung muss zunächst das Modul mod_http2 geladen werden:

LoadModule http2_module modules/mod_http2.so

Weiterhin muss das Protokoll über die Protocols Direktive aktiviert werden:

Protocols h2 http/1.1

Weitere Maßahmen sind nicht erforderlich. Die IDNT Content Delivery Systeme erkennen die Unterstützung für HTTP/2 über die Backend- Server automatisch.


What do you think?