Varnish auf Rootservern installieren

Wie wichtig eine geringe „Time to first byte“ (TTFB) ist, muss vermutlich jeder Webseitenbetreiber mindestens einmal am eigenen Leib erfahren. Umso komplexer und frequentierter die eigene Webseite ist, desto schwieriger wird es, eine gute Performance zu erreichen.

Bessere Ladezeiten (TTFB) dank Varnish Cache

Um die Ladezeiten der Webseite durchgehend gering zu halten und den eigenen Server zu entlasten, wird gerne ein sog. „Reverse Proxy“ verwendet. Dabei handelt es sich um einen eigenständigen Server, welcher vor den eigentlichen Webserver (das Backend) geschaltet wird und die Anfragen der Besucher beantwortet. Er speichert die angeforderten Inhalte in seinem Cache und beantwortet wiederkehrende Anfragen selbstständig, ohne eine erneute Kommunikation mit dem Backend aufzubauen. Eine sehr beliebte Software für Reverse Proxys ist „Varnish Cache“. Das Alleinstellungsmerkmal von Varnish ist, dass die freie Software als Webbeschleuniger designt und weiterentwickelt wurde. Um Varnish Cache zu nutzen, werden Root-Rechte auf einem UNIX-Betriebssystem mit installiertem Webserver – zum Beispiel NGINX oder Apache – vorausgesetzt.

Varnish Cache für Onlineshops

Der E-Commerce-Gigant Amazon hat schon 2012 errechnet, dass eine Ladezeit, die länger als 100 Millisekunden beträgt, den Umsatz um etwa 1% reduziert. Der Tagesumsatz von Amazon.com liegt bei ca. 67 Millionen Dollar. Das entspräche entgangenen Opportunitätskosten von 670.000 Dollar am Tag, die sich im Jahr auf 244,5 Millionen Dollar summieren würden.

Die Funktionsweise von Varnish Cache

Varnish Cache ist ein Webbeschleuniger bzw. „HTTP reverse proxy“. Der Varnish Proxy wird direkt vor den Webserver geschaltet, welcher die Inhalte der Webseite ausliefert.

Ruft ein Nutzer die Webseite auf, prüft Varnish zunächst, ob er die angeforderten Inhalte bereits in seinem Cache finden kann. Sollten die Inhalte nicht im Cache vorliegen, werden Selbige vom Backend (dem Webserver) angefragt, über die virtuelle Speicherverwaltung abgelegt und an den Besucher ausgeliefert. Varnish legt grundsätzlich alle Anfragen im virtuellen Speicher ab und überlässt dadurch dem Betriebssystem die Entscheidung, welche Inhalte auf der Festplatte und welche im Arbeitsspeicher (RAM) gespeichert werden. Auf diese Weise wird verhindert, dass Daten vom Betriebssystem zwischengespeichert werden, während Varnish Selbige auf die Festplatte schreibt.

Die Varnish Software selbst arbeitet thread-basiert. Dabei wird jede eingehende Verbindung als ein eigener Arbeitsthread behandelt und alle Threads werden bis zum konfigurierten Limit zeitgleich abgearbeitet. Ist das Limit erreicht, werden neue Threads in eine Warteschlange gestellt und erst, wenn das eingestellte Limit der Warteschlange erreicht ist, werden weitere Verbindungen abgelehnt.

Varnish unterstützt außerdem eine Lastverteilung á la „Round Robin“ sowie eine zufällige Verteilung, jeweils mit einer eigenen Gewichtung der Backends. Zusätzlich ist Varnish in der Lage, sog. „health-checks“ der Backends durchzuführen. Dabei wird überprüft, ob der Backendserver noch in der Lage ist, Webseiten auszuliefern. Sollte das Backend nicht erreichbar sein spricht Varnish den betreffenden Webserver automatisch nicht mehr an.

Der Varnish Cache Server wird mittels „Varnish Configuration Language“ (VCL) konfiguriert. Dabei handelt es sich um eine anwendungsspezifische Sprache, die es ermöglicht, an wichtigen Stellen der Anfragebehandlung Schnittstellen zu erstellen und dadurch Code einzuschleusen. Wird ein VCL-Skript geladen, übersetzt die Software es in C, kompiliert es als Programmbibliothek und linkt es direkt in den Varnish.

Varnish Cache für Pagespeed

Varnish Cache Server? Klingt kompliziert. Lohnt sich der Aufwand?

Eine Optimierung der eigenen Anwendung mittels Varnish Cache ist in vielen Fällen die beste Möglichkeit, um einem großen Besucherandrang sowie der steigenden Komplexität der eigenen Webseite entgegenzutreten. Die einzig wirkliche Hürde stellt dabei die Konfiguration des Varnish mittels VCL dar. Um eine VCL für seine Webseite zu erstellen, benötigt man entweder entsprechendes Know-How oder die Lust, Neues zu lernen sowie viel Zeit und Sitzfleisch.

Da Varnish nicht in der Lage ist, SSL- bzw. TLS-Verbindungen aufzubauen, benötigt man außerdem einen Proxy, der das SSL-Offloading übernimmt, wenn man seine Webseite verschlüsselt ausliefern möchte.

Wurde diese Hürde gemeistert und der Varnish Cache ist erfolgreich eingerichtet, erreicht die eigene Anwendung Ladezeiten, die mit den gängigen Caching-Methoden nicht möglich sind. Die spürbar verringerte Ladezeit verbessert das Surferlebnis der Besucher massiv und wirkt sich sehr positiv auf das Ranking in Suchmaschinen aus.

Aus diesen Gründen ist Varnish vor allem im E-Commerce-Hosting sehr beliebt.

Neben der Möglichkeit, Varnish selbst auf einem Server aufzusetzen, gibt es außerdem verschiedene Managed Varnish Anbieter im Netz, die einen Varnish Proxy für Euch aufsetzen und sich um die Technik kümmern.

Varnish auf einem Rootserver installieren

Wir installieren uns jetzt Varnish Cache auf einem vRoot L bei Mittwald, um damit Webseiten auszuliefern, die auf unserem Managed vServer L liegen. Als Betriebssystem unseres vRoots nutzen wir Ubuntu 16.04 LTS und als Webserver für das SSL-Offloading kommt Apache zum Einsatz. Zusätzlich installieren wir einen Certbot, der uns Let’s Encrypt Zertifikate ausstellt, damit unsere Webseiten verschlüsselt ausgeliefert werden. Voraussetzung für die Ausstellung eines LE-Zertifikates ist, dass eine Domain per A-Record auf den Rootserver zeigt.

Varnish installieren: Auf „los“ geht’s los. LOS!

1. Zunächst gehen wir sicher, dass unser Server auf einem aktuellen Stand ist:

sudo apt update && sudo apt upgrade -y

2. Dann installieren wir alle benötigten Binaries:

sudo apt install software-properties-common apt-transport-https -y

3. Jetzt installieren wir unseren Apache:

sudo apt install apache2 -y

Nach der Installation sollten unser Apache bereits laufen. Wir verifizieren das wie folgt:

sudo systemctl status apache2

Wenn jetzt die IP des Rootservers aufgerufen wird, sollte eine „Apache2 Ubuntu Default Page“ erscheinen.

4. Dann noch die benötigten Apache2 Module installieren:

sudo a2enmod headers && \
sudo a2enmod xml2enc && \
sudo a2enmod proxy && \
sudo a2enmod proxy_http && \
sudo a2enmod proxy_html && \
sudo a2enmod proxy_balancer && \
sudo a2enmod lbmethod_byrequests && \
sudo systemctl restart apache2

5. Jetzt erstellen wir einen vHost für unsere Domain.

export DOMAIN=EURE_DOMAIN && \    
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/${DOMAIN}.conf

Ersetzt bitte den Platzhalter EURE_DOMAIN mit der entsprechenden Domain ohne www (z.B. mittwald.de).

6. Dann tragen wir unsere Domain in den vHost ein:

sudo sed -i "s#.*</VirtualHost>.*#ServerName ${DOMAIN}\nServerAlias www.${DOMAIN}\n&#" /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/${DOMAIN}.conf

7. Und wieder den Apache neustarten:

sudo systemctl restart apache2

8. Jetzt besorgen wir uns die Zertifikate. Dazu installieren wir den Certbot wie folgt:

sudo add-apt-repository ppa:certbot/certbot -y && \
sudo apt update && sudo apt upgrade -y && \
sudo apt install python-certbot-apache -y

9. Wenn alles installiert wurde, können wir uns ein Zertifikat für unsere Domain generieren.

sudo certbot --apache -d ${DOMAIN} -d www.${DOMAIN}

WICHTIG: Die Domain – sowohl mit als auch ohne www – muss(!) mittels A-Record auf den Rootserver zeigen. Andernfalls schlägt die Zertifizierung fehl.

Nachdem alle Abhängigkeiten installiert wurden, öffnet sich ein Dialog, den wir Schritt-für-Schritt lesen und beantworten.

10. Für den Fall, dass mehrere Domains ein Zertifikat erhalten sollen, müssen die Schritte 6 und 9 entsprechend wiederholt werden (optional) .

11. Der Certbot erstellt uns einen neuen vHost, mit dem folgenden Pfad:
/etc/apache2/sites-available/000-default-le-ssl.conf
In dieser Datei fügen wir die Weiterleitung der Anfragen an den Varnish ein. Das können wir mit dem folgenden Befehl tun:

sudo sed -i "s#.*</VirtualHost>.*#ProxyPreserveHost On\nProxyPass / http://127.0.0.1:8080/\nRequestHeader set X-Forwarded-Port "443"\nRequestHeader set X-Forwarded-Proto "https"\n&#" /etc/apache2/sites-available/000-default-le-ssl.conf

12. Und nochmal den Apache neustarten:

sudo systemctl restart apache2

13. Jetzt ist der Grundstein gelegt und wir können Varnish installieren:

curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | sudo apt-key add - && \
sudo apt update && \
echo -e "deb https://packagecloud.io/varnishcache/varnish5/ubuntu/ trusty main\ndeb-src https://packagecloud.io/varnishcache/varnish5/ubuntu/ trusty main" | \
sudo tee --append /etc/apt/sources.list.d/varnishcache_varnish5.list > /dev/null && \
sudo apt update && sudo apt install varnish -y

14. Mit dem folgendem Befehl überschreiben wir die Varnish Startparameter:

sudo sed -i "s#Type=.*#Type=simple#g" /lib/systemd/system/varnish.service && \
sudo sed -i "s#ExecStart=.*#ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :8080 -T :8000 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,1024m#g" /lib/systemd/system/varnish.service && \
sudo systemctl daemon-reload

15. Abschließend die Varnish VCL anpassen und auf unseren Managed (v)Server verweisen.

export IP=BACKEND_IP && \
sudo sed -i "s#127.0.0.1#${IP}#" /etc/varnish/default.vcl && \
sudo sed -i "s#8080#80#g" /etc/varnish/default.vcl && \
unset IP

Der Platzhalter BACKEND_IP muss mit der IP-Adresse unseres Managed (v)Servers ersetzt werden.

sudo systemctl start varnish

Mit dem Befehl können wir dann den Varnish Daemon starten.

Fertig: Varnish-Installation abgeschlossen!

Ab sofort läuft die ausgewählte Domain verschlüsselt über den Varnish und man kann sich an die Konfiguration der VCL wagen.

Kommentar hinzufügen