HTTP/2 in Node.js

Alle gängigen Webbrowser unterstützen inzwischen das HTTP/2-Protokoll. Auch ohne besondere Vorkehrungen ist das Protokoll für Webentwickler interessant, beispielsweise wegen des Bündelns von Verbindungen. Wie lässt sich eine Node.js-Anwendung auf HTTP/2 umstellen?

In Pocket speichern vorlesen Druckansicht 6 Kommentare lesen
Lesezeit: 4 Min.
Von
  • Golo Roden
Inhaltsverzeichnis

Alle gängigen Webbrowser unterstützen inzwischen das HTTP/2-Protokoll. Auch ohne besondere Vorkehrungen ist das Protokoll für Webentwickler interessant, beispielsweise wegen des Bündelns von Verbindungen. Wie lässt sich eine Node.js-Anwendung auf HTTP/2 umstellen?

Ein äußerst praktisches Merkmal von HTTP/2 ist das sogenannte Multiplexing. Die Funktion beschreibt die Möglichkeit, mehrere Verbindungen zu einem Webserver als eine einzige gemeinsame Verbindung zu bündeln. Das spart Ressourcen und hebt die Einschränkung auf, dass ein Webbrowser nur eine begrenzte Anzahl an HTTP-Verbindungen gleichzeitig zu einer Domain aufbauen darf.

Daher profitieren Webanwendungen unter Umständen von Haus aus von HTTP/2, ohne dass dazu spezielle Anpassungen vorgenommen werden müssten. Da inzwischen alle gängigen Webbrowser das Protokoll unterstützen, stellt sich die Frage, wie eine bestehende Anwendung auf HTTP/2 portiert werden kann. Im Fall von Node.js fällt das sehr leicht.

Da zahlreiche Webanwendungen in Node.js auf Basis von Express geschrieben sind, bietet es sich an, beispielhaft von einer entsprechenden Anwendung auszugehen:

'use strict';

const http = require('http');

const express = require('express');

const app = express();

app.get('/', (req, res) => {
res.send('Hello from HTTP :-)');
});

const server = http.createServer(app);

server.listen(3000, () => {
console.log('Server listening on port 3000.');
});

Startet man die Anwendung, lässt sich die Adresse http://localhost:3000/ im Webbrowser aufrufen, wobei man als Ergebnis eine HTML-Seite mit dem Text Hello from HTTP :-) erhält.

Bevor man den Wechsel auf HTTP/2 durchführt, empfiehlt sich als Zwischenschritt der Wechsel zu HTTPS. Dazu ist lediglich das https- an Stelle des http-Moduls zu verwenden. Außerdem sind beim Aufruf der createServer-Funktion ein privater Schlüssel und ein Zertifikat zu übergeben. Liegen beide im PEM-Format vor, lassen sich die Dateien mit Hilfe des fs-Moduls lesen:

'use strict';

const fs = require('fs'),
https = require('https'),
path = require('path');

const express = require('express');

const cert = fs.readFileSync(path.join(__dirname, 'certificate.pem')),
key = fs.readFileSync(path.join(__dirname, 'privateKey.pem'));

const app = express();

app.get('/', (req, res) => {
res.send('Hello from HTTPS :-)');
});

const server = https.createServer({ cert, key }, app);

server.listen(3000, () => {
console.log('Server listening on port 3000.');
});

Unter der Annahme, dass das Zertifikat von einer vom Webbrowser akzeptierten CA ausgestellt wurde, lässt sich die Webseite danach unter https://localhost:3000/ aufrufen. Als Ergebnis erhält man dieses Mal eine HTML-Seite mit dem Text Hello from HTTPS :-).

Um die Webanwendung nun auf HTTP/2 umzustellen, ist zunächst ein passendes Modul zu installieren. Im Gegensatz zu HTTP und HTTPS enthält Node.js (zumindest derzeit noch) keine serienmäßige Unterstützung von HTTP/2. Ein entsprechendes Modul steht mit spdy zur Verfügung. Die Installation erfolgt wie üblich mithilfe von npm:

$ npm install spdy

Anschließend gilt es, das Modul zu referenzieren und die Verwendung von https durch spdy zu ersetzen:

'use strict';

const fs = require('fs'),
path = require('path');

const express = require('express'),
spdy = require('spdy');

const cert = fs.readFileSync(path.join(__dirname, 'certificate.pem')),
key = fs.readFileSync(path.join(__dirname, 'privateKey.pem'));

const app = express();

app.get('/', (req, res) => {
res.send('Hello from HTTP/2 :-)');
});

const server = spdy.createServer({ cert, key }, app);

server.listen(3000, () => {
console.log('Server listening on port 3000.');
});

Da das spdy-Modul eine zum https-Modul abwärtskompatible API aufweist, sind keine weiteren Anpassungen erforderlich. Ruft man nun erneut die Adresse https://localhost:3000/ auf, erhält man die angepasste Antwort, die dieses Mal allerdings über HTTP/2 ausgeliefert wird, wie sich in den Entwicklerwerkzeugen des jeweils verwendeten Webbrowsers leicht nachvollziehen lässt.

Besonders praktisch ist, dass das spdy-Modul auch den Fallback auf klassisches HTTPS beherrscht, falls der Webbrowser kein HTTP/2 beherrscht. Auf die Art entfällt die Notwendigkeit, einen gesonderten HTTPS-Endpunkt anbieten zu müssen.

tl;dr: HTTP/2 lässt sich in Node.js leicht verwenden, indem man das https- durch das spdy-Modul ersetzt. Dank der Abwärtskompatibilität der API ist die Umstellung problemlos möglich. ()