Node.js-Module: SPDY

SPDY – HTTP2 in Node.js
Kommentare

Ein Blick auf http://caniuse.com/#search=http2 zeigt, dass Sie sich mittlerweile nur noch wenig Gedanken über den Einsatz von HTTP2 für Webapplikationen zu machen brauchen. Grundsätzlich müssen Sie beim Umstieg auf HTTP2 kaum etwas beachten.

Webapplikationen funktionieren nach wie vor auf Request-Basis und auch die übrigen Bestandteile wie Methoden, Header oder Statuscodes bleiben erhalten. Auf Protokollebene tut sich allerdings einiges und das vor allem zum Vorteil des Benutzers.

Webapplikationen, die mit HTTP2 ausgeliefert werden, können wesentlich schneller sein als ihre HTTP1.1-Gegenstücke. Sie können dem Browser beispielsweise mehr Informationen schicken, als er ursprünglich angefordert hat. Diese als Push bezeichnete Methode hat den Vorteil, dass der Browser die für den Seitenaufbau benötigten Daten bereits erhält, bevor er die Seitenstruktur komplett geparst hat. Der Critical Rendering Path kann so verkürzt werden und Benutzer können schneller mit Ihrer Applikation interagieren.

Ein weiteres wichtiges Feature ist die Wiederverwendung von Verbindungen. Zahlreiche Optimierungen in HTTP1.1 zielen darauf ab, möglichst wenige Verbindungen zu einem Server herzustellen. Jeder Verbindungsaufbau kostet wertvolle Zeit. Hinzu kommt, dass die maximale Anzahl von parallelen Verbindungen durch den Browser beschränkt ist. Das bedeutet, dass zu viele gleichzeitige Verbindungen einander ausbremsen. HTTP2 löst dieses Problem, indem bestehende Verbindungen wiederverwendet werden können und der Verbindungsaufbau somit wegfällt.

HTTP2 ist also grundsätzlich eine gute Sache – Sie sollten dieses Protokoll früher oder später auch in Ihrer Applikation unterstützen. Nun sind Sie vielleicht gerade dabei, eine Node.js-Applikation zu implementieren. Ein Blick auf das API der Plattform verrät, dass man HTTP2-Unterstützung vergeblich im Kern von Node.js sucht. Allerdings ist das nicht weiter tragisch, denn es gibt einige Pakete, die mit diesem Missstand aufräumen. Eines der populärsten und stabilsten Module ist das SPDY-Paket.

Installation

Das SPDY-Paket ist, wie die meisten anderen npm-Pakete auch, ein Open-Source-Projekt, das auf GitHub verwaltet wird. Mittlerweile sind seit dem ersten Commit im April 2011 knapp 800 Commits in das Projekt eingeflossen. Das Paket liegt derzeit in Version 3 vor. Installiert wird es wie gewohnt über npm auf der Kommandozeile mit dem Befehl npm install spdy. Sie sollten die Option –save nicht vergessen, um die Abhängigkeit in Ihre package.json-Datei einzutragen. Nach der Installation können Sie das Paket über das Modulsystem von Node.js verwenden und sowohl Clients als auch Server für HTTP2 umsetzen.

Eine kleine Hürde gibt es dennoch bei der Implementierung eines HTTP2-Servers. Zahlreiche Browserhersteller implementieren das Protokoll nur in der verschlüsselten Version. Das bedeutet für Sie, dass Sie sich ein gültiges TLS-Zertifikat organisieren müssen. Das können Sie entweder käuflich erwerben, es kostenlos über Let’s Encrypt beziehen oder sich selbst eines ausstellen. Die letzte Version kommt natürlich nur für den Entwicklungsbetrieb, nicht jedoch für eine produktive Applikation in Frage. Zur Erstellung der Zertifikate kann beispielsweise das Kommandozeilenwerkzeug OpenSSL verwendet werden.

Go for PHP Developers

mit Terrence Ryan (google)

Everything you need to know about PHP 7.2

mit Sebastian Bergmann (thePHP.cc)

Ein Server mit HTTP2

Die Umsetzung des HTTP2-Servers mit dem SPDY-Paket gestaltet sich recht einfach, vor allem, wenn Sie das HTTP-Modul von Node.js selbst schon gewohnt sind. Für die Verwendung der Verschlüsselung definieren Sie ein Options-Objekt, das die Schlüssel key und cert mit jeweils dem Inhalt des privaten Serverschlüssels und des TLS-Zertifikats enthält. Dieses Objekt übergeben Sie der createServer-Methode des SPDY-Moduls. Das zweite Argument ist eine Callback-Funktion, die für jede eingehende Anfrage ausgeführt wird. Hier haben Sie über die Argumente Zugriff auf die Anfrage sowie auf das Antwort-Objekt. Den Serverprozess müssen Sie dann nur noch über die listen-Methode an einen Port binden und fertig ist Ihre Serverimplementierung (Listing 1).

 

const spdy = require('spdy');
const fs = require('fs');

const options = {
  key: fs.readFileSync('./server.key'),
  cert: fs.readFileSync('./server.crt')
};

spdy.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end('Hello Client!');
}).listen(8080);

Speichern Sie diesen Quellcode in einer Datei, beispielsweise mit dem Namen index.js, können Sie den Server ganz einfach mit dem Befehl node index.js auf der Kommandozeile starten. Sobald Sie das getan haben, können Sie mit Ihrem Browser über den URL https://localhost:8080 darauf zugreifen. Dabei sollten Sie unbedingt darauf achten, dass das Protokoll https lauten muss, da Sie ansonsten keine Antwort vom Server erhalten. Ob es wirklich funktioniert hat, sehen Sie, wenn Sie die Entwicklertools Ihres Browsers öffnen und die Anfragen zum Server im Netzwerktab ansehen. Hier sollten Sie dann als Protokoll h2, was für HTTP2 steht, sehen (Abb. 1).

Abb. 1: HTTP2-Anfrage im Browser

Abb. 1: HTTP2-Anfrage im Browser

Eines der wichtigsten Features von HTTP2 ist das serverseitige Pushen von Inhalten. Diese Funktionalität erreichen Sie, indem Sie die pushMethode des response-Objekts verwenden. Diese Methode akzeptiert als erstes Argument den Namen der Datei, die ausgeliefert wird. Das zweite Argument ist ein Objekt mit Header-Informationen. Danach können Sie mit der write– und end-Methode die Response formulieren. Ihr Server sorgt dann bei einer Anfrage dafür, dass sowohl die eigentlich angefragte Datei als auch der zusätzliche Inhalt zum Client geschickt wird.

Wie auch beim HTTP-Modul von Node.js selbst gilt auch beim SPDY-Paket, dass die Implementierung umfangreicherer Applikation umständlich und wenig praktikabel ist. Da kommt ein Application-Framework wie Express.js gerade recht. Da das SPDY-Paket weitestgehend API-kompatibel mit dem HTTP-Modul ist, ist es möglich, Express.js mit HTTP2 zu betreiben. Die Änderungen, die Sie hierfür vornehmen müssen, beschränken sich auf nur wenige Zeilen. Statt einer Callback-Funktion übergeben Sie der createServer-Methode das Applikationsobjekt Ihrer Express-Applikation und schon ist diese über HTTP2 erreichbar. Den entsprechenden Quellcode finden Sie in Listing 2.

const spdy = require('spdy');
const fs = require('fs');

const express = require('express');
const app = express();

const options = {
  key: fs.readFileSync('./server.key'),
  cert: fs.readFileSync('./server.crt')
};

app.get('/', (req, res) =< {
    res.send('Hello express!');
});

spdy.createServer(options, app).listen(8080);

HTTP2-Client

Mit dem SPDY-Paket sind Sie nicht nur darauf beschränkt, HTTP2-Server zu implementieren. Sie können auch einen HTTP2-Client mit Node.js umsetzen. Für die Implementierung kombinieren Sie die request-Komponente des HTTP-Moduls von Node.js mit dem agent des SPDY-Pakets. Diesen erzeugen Sie mithilfe der createAgent-Methode. Eine beispielhafte Implementierung zeigt Ihnen Listing 3.

const spdy = require('spdy');
const http = require('http');

const agent = spdy.createAgent({
    host: 'www.google.de',
    port: 443
});

const options = {
  protocol: 'https:',
  host: 'www.google.de',
  agent: agent
};

http.get(options, function(response) {
    let body = '';
    response.on('data', (data) =< body += data);
    response.on('end', () =< console.log(body));
    agent.close();
}).end();

Fazit

Viele Browser unterstützen mittlerweile HTTP2, sodass Sie den Umstieg auch für Ihre Applikation in Erwägung ziehen können. Das gilt vor allem vor dem Hintergrund, dass die Änderungen an bestehenden Applikationen minimal sind. Der Nachteil hier ist allerdings, dass die Applikation ohne weitere Anpassungen kaum von den Vorteilen des neuen Protokolls profitiert. Eine weitere Erleichterung für den Umstieg ist die Tatsache, dass HTTP1 immer noch als Fallback unterstützt wird, falls der Browser kein HTTP2 unterstützt.

Sie sehen, es gibt kaum Gründe, die gegen einen Einsatz von HTTP2 in einer Node.js-Applikation sprechen. Wagen Sie den Umstieg, es wird sich lohnen.

PHP Magazin

Entwickler MagazinDieser Artikel ist im PHP Magazin erschienen. Das PHP Magazin deckt ein breites Spektrum an Themen ab, die für die erfolgreiche Webentwicklung unerlässlich sind.

Natürlich können Sie das PHP Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -