HAProxy

First Steps in Sachen HAProxy, Backup und Loadbalancer für einfache Webseiten.

Heute versuchen wir uns doch mal an das Thema HAProxy. Das mit einem möglichst einfachem Setup.

haproxy

Wir haben ein einfaches Netzwerk, im Beispiel ein 172.16.1.0/24 Netz.

Für den Test machen wir 3 VMs bereit, 2 VMs stellen den Webserver dar. Eine Maschine nutzen wir für das Backup und danach für den Loadbalancer.

frontend-01 und frontend-02:

  • 1 CPU | 2 GB Memory | 16 GB Harddisk
  • Als Disti nutze ich ein Debian Stretch 9.6.0 netinst
  • Als ersten Nutzer installiere ich irgendeinen Namen und entferne diesen nach der ersten Anmeldung mit userdel username
  • Im Fenster "tasksel" installiere ich auf dem Server nur "webserver" und "standard system utilities"
  • Das Setup abschliessen und schon jetzt kann an via Browser http://frontend-01 und http://frontend-02 erreichen
  • Damit ich die Server später besser auseinanderhalten kann, modifiziere ich mit nano -c /var/www/html/index.html die Zeile 219
    It works! ersetzte ich durch FRONTEND-01<br>It works! und auf dem zweiten durch FRONTEND-01<br>It works!
  • Das wars schon, die Webserver sind nun beide bereit, präsentieren sich mit ihrer eigenen Indexseite, damit man die beiden auseinanderhalten kann
  • Installier noch mit apt-get install open-vm-tools die VMTools, falls du auf VMware arbeitest.

Falls jetzt jemand auf die Idee kommt, den Webserver einfach so ins Web zu stellen, es empfiehlt sich zuerst, sich mit Apache2 auseinander zu setzen, der Server ist ledliglich zum Testen im geschützten Bereich gedacht.

haproxy-01:

  • 1 CPU | 2 GB Memory | 16 GB Harddisk
  • Auch hier kommt wieder Debian zum Einsatz
  • Der erste Nutzer ist hier wiederum irgend ein Name, wer jetzt auf die Idee kommt, diesen "haadmin" zu nennen, für den ist umso wichtiger, das der User vor Installation von HAProxy entfernt wird, das Paket erstellt nämlich selber einen Nutzer haproxy und wenn der Name schon vergeben ist, reklamiert er.
  • Im Fenster "tasksel" begüngen wir uns nun nur noch mit den "standard system utilities".
  • Das Setup wieder abschliessen.
  • Installier auch hier mit apt-get install open-vm-tools die VMTools, falls du auf VMware arbeitest.
  • Nun wird haproxy unstalliert mit apt-get install haproxy.

So damit sind die Server fertig installiert, jetzt machen wir uns mal an die Arbeit, HAProxy so breitzustellen, damit er enstprechend reagieren kann.

Als erster erstellen wir mal ein Backup der bestehenden Konfiguration:

cd /etc/haproxy
cp haproxy.cfg haproxy.backup

Nun bearbeiten wir die Datei haproxy.cfg:

nano -c haproxy.cfg

Der Parameter -c zeigt im Editor nano zusätzlich Zeile und Zeichenposition an, was es einfacher macht, die richtige Position zu finden.

Den oberen Teil lassen wir mal einfach unberührt:

global

log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon

# Default SSL material locations

ca-base /etc/ssl/certs
crt-base /etc/ssl/private

# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3

defaults

log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

 

HAProxy als Backup

Unterhalb der Standartkonfiguration ergänzen wir mal mit folgenden Zeilen:

frontend frontend-80

bind :80
mode http
default_backend backend-80

backend backend-80

mode http
server frontend-01 172.16.1.121:80 check
server frontend-02 172.16.1.122:80 check backup

Die Konfiguration ist recht selbstsprechend. Die erste Zeile dient der Identifizierung, da habe ich mir abgeschaut, einen eindeudigen Namen und dem Port, welche durch Bindestrich getrennt sind. Frontend repräsentiert die Seite des HAProxy gegenüber den Client. Die Backendseite zeigt nach hinten auf den Server, auf den gelenkt werden will.

frontend-80:

Welche Verbindungen soll der HAProxy nach aussen zeigen.

  • bind :80, gibt an, auf welchem Port gehört werden soll
  • mode http, gibt das Protokoll an, welches genutzt werden soll
  • default_backend backend-80, referenziert auf welche Backendkonfiguration verwiesen werden soll

backend-80:

Wohin und wie soll er die Verbindungen herstellen.

  • mode http, auch hier gibt der Server an, mit welchem Protokoll kommuniziert werden soll
  • server ID IP:Port check, hier wird mit dem Parameter server begonnen, eine eindeutige ID vergeben, die entsprechende IP und der richtige Port, getrennt durch Doppelpunkt.
  • server ID IP:Port check backup, der zusätzliche Parameter backup gibt hier an, dass es sich hier um den Backup Server handelt, der einspringen soll, wenn der Default ausfallen sollte.

Nun die Datei speichern und den Dienst haproxy neu starten:

service haproxy restart

Wenn alles funktioniert, solltest du beim Aufrufen des Statuses keinen Fehler erhalten, ansonsten prüf mal die Konfig auch Schreibfehler.

service haproxy status

Nun öffnest du einen Browser und gehst auf die Seite http://haproxy-01 und achtest dich, auch welchen Server dich HAProxy lenkt. Normalerweise auf frontend-01. Nun schalte den frontend-01 ab und refreshe die Seite neu. Du wirst sehen, sobald HAProxy merkt, dass der frontend-01 nicht mehr vorhanden ist, wechselt er auf frontend-02. Schaltest du den frontend-01 wieder an, wechselt er zurück und schiebt den frontend-02 wieder auf die Backupposition.

 

HAProxy als Loadbalancer

Damit HAProxy als Loadbalancer fungiert, müssen wir das dem backend-80 mitteilen.

backend backend-80

balance roundrobin
mode http

server frontend-01 172.16.1.121:80 check
server frontend-02 172.16.1.122:80 check

Was hat sich geändert? Die Zeile balance roundrobin kam dazu, der Parameter backup ist beim frontend-02 verschwunden.

balance die wichtigsten Varianten:

roundrobin wechselt zwischen den Servern ab, je nachdem wie stark ein Server gewichtet wird. Maximal können damit 4095 Server im Backend betrieben werden. Die Gewichtung des Server wir dabei dynamisch gehandelt.
static-rr arbeitet ähnlich wie Roundrobin, nur das eine Änderung der Gewichtung des Servers keinen Effekt hat, da diese statisch bleibt. Dafür benötigt dieser Algorythmus weniger CPU Leistung (-1%)
leastconn lenkt immer auf dne Server, welcher am wenigsten Verbindungen aufweist.

Weitere Varianten sind hier zu finden: https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4-balance

Im Beispiel nutzen wir nun den balancer roundrobin, speichere die Datei und prüfe, ob die Konfiguration angenommen wurde und der Service gestartet wurde:

service haproxy restart
service haproxy status

Nun geht es wieder ans Testen. Dafür müssen wir nun nicht mehr Server aus- und einschalten, öffne die Seite http://frontend-01 und lass mal den Finger auf der F5-Taste, du wirst merken, dass HAProxy zwischen den Servern hin un her wechselt.

 

Statistikseite

So und nun möchten wir natürlich noch ein wenig sehen, wie den die Auslastung und das Verhalten von HAProxy ist.

Dafür schieben wir unterhalb Sektion defaults diese Zeilen ein:

listen stats

bind :8080
mode http

stats enable
stats hide-version
stats refresh 30s
stats show-node
stats auth admin:ilovestats
stats uri /

  • bind :8080, auf welchem Port sollen die Statistiken vorhanden sein
  • mode http, Webserver hätte gerne http, später können diese auch mit Zertifikat geschützt werden
  • stats enable, aktivieren der Statistiken
  • stats hide-version, keine Anzeige der HAProxy Version auf den Statistiken
  • stats refresh 30s, automatisches Refresh auf der Webseite
  • stats show-node, anzeige des Node-Namens
  • stats auth user:password, Passwortschutz, damit nicht jeder auf die Statistiken einfach zugreifen kann
  • stats uri: wie soll die URL für die Statistiken heissen? Beispiele zeigen z.B. /haproxy?stats, du kannst aber auch /statistics nehmen.

Viele weiter Informationen zu HAProxy findest du auch hier: http://www.haproxy.org/

Wofür ist nun der HAProxy gut? Im Beitrag PoC PSC und vCenter HA kam genau dieser Proxy zum Einsatz. Die Konfiguration werde ich noch später zeigen, aber zuerst ist mal Grundverständnis gefragt, damit man später auch weiss, was man damit genau macht. Jedenfalls kann man damit ein wirklich geniales Plattform Service Controller Konstrukt bauen, dass kaum kaputt zu kriegen ist.

So das wars für heute, viel Spass mit ausprobieren.


Drucken