Nginx mit SPDY unter Debian Wheezy

sdpy Ich habe mir am Wochenende mal angeschaut wie man auf einem aktuellen Debian Server eine Webseite über das SPDY Protokoll ausliefern kann. Hier ein paar Tipps wie man SPDY ans laufen bekommt:

1. System und Software

Ich verwende eine Nginx Webserver in der Version 1.4.1. Das Betriebssytem ist Debian Wheezy. Ich bevorzuge das Dotdeb Repository denn hier braucht man (zumindest unter Debian Wheezy) Nginx nicht mehr selbst zu patchen. Das SPDY Modul ist bereits mit kompiliert und aktiv.

2. SSL Zertifikat

SPDY funktioniert (leider) nur zusammen mit SSL, deshalb wir für die verwendete Domain ein SSL Zetifikat benötigt. Ich habe mich hierzu bei startssl.com angemeldet. Hier bekommt man ein kostenloses Zertifikat welches für ein Jahr gültig ist. Im Gegensatz zu einem selbst signierten Zertifikat wird dieses von den meisten Browsern ohne nervige Hinweise akzeptiert. Natürlich besteht auch die Möglichkeit für teures Geld ein Zertifikat zu kaufen.

Nachdem man das Zertifikat erzeugt hat sollten man zwei Dateien haben, eine ssl.crt Datei mit dem Zertifikat sowie eine ssl.key Datei mit der persönlichen Schlüssel. Diese beiden Dateien läd man nun auf den Server. Bei startssl ist die Schlüsseldatei in der Regel mit einem Passwort geschützt. Wenn man die Datei also so in die Webserver Konfiguration eintragen würde, müsste man bei jedem Neustart des Webservers das entsprechende Passwort eingeben. Folgender Befehl entschlüsselt das Perivate-Key-File und sorgt dafür, dass dieser ohne Eingabe des Passwortes benutzt werden kann:

openssl rsa -in ssl.key -out ssl_nopass.key

Ein weiteres Problem: Nicht alle Browser haben das Root CA von startssl.com bereits vorinstalliert. Deswegen sollte man dafür sorgen dass es vom Webserver mit ausgeliefert wird. Bei Nginx wird das Root CA einfach mit an das eigene Zertifikat angehangen. Dazu läd man sich zwei Dateien von startssl.com herunter und hängt Sie an das eigene Zertifikat an:


wget http://www.startssl.com/certs/ca.pem
wget http://www.startssl.com/certs/sub.class1.server.ca.pem
cat ssl.crt sub.class1.server.ca.pem ca.pem > ssl_unified.crt

Damit haben wir die beiden benötigten Dateien um eine Webseite über SSL auszuliefern.

3. Webserver konfigurieren

Die eigentliche Konfiguation des Webservers ist denkbar einfach. Es wird lediglich ein entsprechender Vhost-Eintrag benötigt. Hierbei sind folgende Dinge zu beachten:

  • spdy muss in der listen Direktive mit angegeben sein.
  • Per add_header muss dem Browser mitgeteilt werden, dass die Webseite SPDY unterstützt.

Die restlichen Anweisungen können in der Regel aus dem normalen Vhost Eintrag (ohne SSL) übernommen werden.


server {
        listen 443 ssl spdy;
        server_name lemmingzshadow.net www.lemmingzshadow.net;

        ssl_certificate      /path/to/cert/ssl_unified.crt;
        ssl_certificate_key  /path/to/cert/ssl.key;

        add_header Alternate-Protocol 443:npn-spdy/2;

        ...
}

Ich habe zusätzlich noch den nicht-SSL Vhost Eintrag so angepasst, dass automatisch von http auf https weitergeleitet wird:


server {
    listen      80;
    server_name lemmingzshadow.net www.lemmingzshadow.net;
    rewrite     ^   https://$server_name$request_uri? permanent;
}

Danach den Webserver neustarten:

/etc/init.d/nginx restart

4. Testen

Nun sollte die entsprechende Webseite bereits über SPDY ausgeliefert werden. Um dies zu testen gibt es verschiedene Möglichkeiten:

  • http://spdycheck.org/ testet ob eine Webseite SPDY unterstützt und liefert weitere nützliche Infos und Tipps.
  • Indikator Addons für Chrome und Firefox zeigen direkt in der Address-Bar ob eine Webseite SPDY unterstützt.
  • Chrome hat ein intigriertes Tool welches live anzeigt auf welchen Webseiten SPDY aktiv ist. Dieses Tool kann man über folgende URL aufrufen: chrome://net-internals/#spdy

5. Fazit

lemmingzshadow_spdy Unter Debian Wheezy mit Nginx 1.4.1 ist das aktivieren von SPDY schnell gemacht. Einzig das erzeugen des SSL Zertifikates ist etwas nervig. Zu den Geschwindigkeits-Vorteilen kann nicht noch nicht allzuviel sagen. Da mein Blog sowieso nicht besonders viele Requests pro Seitenaufruf benötigt ist der Vorher-Nacher Unterschied hier nicht enorm. Dennoch konnte ich rein rechnerich eine verbesserte Ladezeit von ca. 30% ausmachen. Ineressant wird es vermutlich jedoch erst bei größeren Webseiten mit vielen parallelen Requests. Sobald ich hier Testwerte habe werden diese natürlich nachgereicht.