Einen Apache-Server als Reverse-Proxy einrichten mit Ubuntu

Reverse-Proxy – Ein praktisches Tool

Ein Reverse-Proxy ist ein Tool, dass http(s)-Anfragen abfängt und diese verarbeitet. Der Reverse-Proxy kann diese an verschiedene Server weiterleiten, die Antwort cachen und damit die dahinterliegenden Webserver entlasten oder die Last auf gleichmäßig unterschiedliche Systeme verteilen. Alles in allem ein sehr praktisches Tool für viel besuchte Dienste oder mehrere kleine schwache Server.

Vorgehen

Heute zeige ich dir, wie du mit Apache einen Proxy baust, der deine Anfragen von http zu https umwandelt, inklusive gültigem Zertifikat, und diese dann an zwei weitere Server weiterleitet. Sind die beiden anderen Systeme in deinem Use Case im gleichem lokalen Netzwerk, kannst du das ganze per http weiterleiten. Nutzen deine Server alle öffentliche IPs, solltest du auch die Weiterleitung mit https schützen. Ich zeige dir beide Varianten.

Den Server vorbereiten und Apache2 installieren

Zuerst benötigst du einen Server mit Ubuntu 16.04 LTS oder Ubuntu 18.04 LTS. Erstelle dir schnell einen bei dem Cloud-Anbieter deiner Wahl und fahre dann hier fort.

Wie du bei gridscale einen Server erstellst, zeige ich dir hier : How to gridscale. Die Erstellung deines Servers dauert bei gridscale nur wenige Sekunden.

Bevor wir uns deinem Server zuwenden muss noch eine Kleinigkeit vorbereitet werden: Deine Domain muss via A-Record auf die IPv4-Adresse deines Servers zeigen und via AAAA-Record auf die IPv6-Adresse deines Servers. Wie das funktioniert erfährst du bei deinem Domain-Provider.
Nachdem nun beide Records gesetzt sind, kannst du dich via SSH mit deinem Server verbinden. Anschließend bringst du mit folgendem Befehl, deinen Server auf den neuesten Stand:

apt –y update && apt –y upgrade

Installiere dir nun Apache und das Apache Plugin für Let’s Encrypt. Unter Ubuntu 16.04 müsstest du folgendes Kommando anwenden.

apt –y install apache2 python-letsencrypt-apache

Läuft dein Server jedoch unter Ubuntu 18.04, ist das Modul python-letsencrypt-apache nicht verfügbar. Alternativ würde das Kommando dann lauten:

apt -y install apache2 python3-certbot-apache

Wenn du das ganze ohne Domain machen willst, kannst du die Punkte mit Let’s Encrypt überspringen.
Sobald die Installation fertig gestellt ist, bearbeite die Config für deinen vHost. Der Einfachheit halber nehme ich dafür Nano, du kannst natürlich einen Editor deiner Wahl benutzen:

nano /etc/apache2/sites-available/000-default.conf

Hier hinterlegst du in der ersten Zeile deine Domain so dass das Ergebnis am Ende etwa so aussieht:

<VirtualHost meine-domain.tld:80>

Den unterstrichenen Teil musst du natürlich durch deine Domain ersetzen. Als nächstes etwas weiter unten noch den ServerName und ServerAlias festlegen:

ServerName meine-domain.tld
ServerAlias www.meine-domain.tld

Wenn du eine Sub-Domain nutzt, dann kannst du den ServerAlias einfach weglassen.
Die gesamte Config sollte dann ungefähr so aussehen:

Bist du bereit zu starten?

Oder hast du noch Fragen? Erstelle dir jetzt dein kostenloses Konto oder lass dich in einem persönlichen Gespräch beraten.

Let’s Encrypt: Erstelle ein Zertifikat für deine Domain

Dann wird es Zeit für Let’s Encrypt. Mit folgendem Befehl erstellst du dir ein neues Zertifikat für deine Domain und konfigurierst den Redirect auf https:

Letsencrypt --apache -d meine-domain.tld –d www.meine-domain.tld

Auch hier gilt, den zweiten Eintrag kannst du ignorieren, wenn du eine Sub-Domain nutzt.
Im nächsten Schritt fragt Let’s Encrypt dich nach deiner E-Mail-Adresse. Hier solltest du eine gültige Adresse eingeben, da du über diese informierst wirst, wenn dein Zertifikat abläuft. Im nächsten Schritt akzeptierst du die AGBs und wählst anschließend die „Secure“-Config.
Nach kurzer Ladezeit, sollte Let’s Encrypt dich zu deinem neuen Zertifikat beglückwünschen und eine neue Config angelegt haben. Diese nehmen wir uns jetzt vor:

nano /etc/apache2/sites-available/000-default-le-ssl.conf

Zuerst kommt es drauf an, ob die Server hinter dem Proxy, also die, auf denen der eigentliche Dienst liegt, mit einer öffentlichen oder einer lokalen IP erreichbar sind. Im ersten Fall empfehle ich, die Server ebenfalls mit Let’s Encrypt über https erreichbar zu machen. Ansonsten kannst du auch eine http-Verbindung herstellen.
Als erstes zeige ich dir die empfohlene Variante für https-Verbindungen.
Ersetze den Teil zwischen <VirtualHost …> und </VirtualHost> mit folgenden Angaben:

<VirtualHost meine-domain.tld:443>

    SSLProxyEngine On
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    ProxyPreserveHost off
           	
    <Proxy balancer://meinloadbalancer>
       	BalancerMember https://webserver01.tld/
      	BalancerMember https://webserver02.tld/
    </Proxy>

    ProxyPass / balancer://meinloadbalancer/
    ProxyPassReverse / balancer://meinloadbalancer/
 
…

</VirtualHost>

Am Ende sollte das Ganze dann ungefähr so aussehen:

Wenn du kein https zwischen deinen Servern nutzen möchtest, muss du die erste Datei bearbeiten und zwar wie folgt:

nano /etc/apache2/sites-available/000-default.conf

In dieser Datei kannst du alles zwischen den VirtualHost-Tags löschen und durch folgenden Text ersetzen:

<VirtualHost meine-domain.tld:80>
    ProxyPreserveHost on
           	
    <Proxy balancer://meinloadbalancer>
         BalancerMember http://webserver01.tld/
         BalancerMember http://webserver02.tld/
    </Proxy>
 
    ProxyPass / balancer://meinloadbalancer/
    ProxyPassReverse / balancer://meinloadbalancer/
 
    ServerName meine-domain.tld
    ServerAlias www.meine-domain.tld
 
</VirtualHost>

In beiden Fällen die Config speichern und Nano beenden.Noch ein Paar Mods aktivieren und Apache neustarten und dann sind wir auch schon durch.

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests
a2enmod proxy_connect
service apache2 restart

Fazit

Mit diesen einfachen Schritten kannst du deinen eigenen Reverse Proxy bauen und dadurch die Last auf deine Server ausgleichen. Neben den hier gezeigten Beispiele kannst du einen Reserve Proxy für viele weitere Zwecke einsetzten.