HAProxy ist ein hochverfügbares Open-Source-Load-Balancing- und Proxy-Service-Tool für TCP- und HTTP-basierte Netzwerkanwendungen. Es ist einfach zu bedienen, eignet sich für hochvolumige Websites und lässt sich nahtlos in bestehende Architekturen integrieren. Es bietet neben seiner primären Funktion als Proxy-Dienst transparente Verbindungen, Server-Offloading, Durchsetzung von Richtlinien und Begrenzung von Verbindungen. In diesem Artikel erklären wir, wie man Haproxy in Ubuntu 16.04 einrichtet.
1. Netzwerk einrichten
Wir werden drei Webserver hinzufügen, die mit Apache2 laufen, und einen HAPROXY-Server, der alle Anfragen/Antworten der drei Webdienste in unserem Netzwerk weiterleitet.
Im Folgenden werden Webserverdetails in unserem Netzwerk aufgelistet.
Server 1: site1.local 10.0.1.116
Server 2: site2.local 10.0.1.117
Server 3: site3.local 10.0.1.119
HAProxy-Server:
load-balancer.local 10.0.1.118
Wir werden auch eine öffentliche IP an load-balancer.local anhängen, um von der öffentlichen Domäne aus darauf zuzugreifen (optional). Wenn Sie nicht von der Public Domain darauf zugreifen möchten, können Sie das Anhängen der öffentlichen IP überspringen, vorausgesetzt, Sie greifen auf den Proxy-Server innerhalb Ihres Netzwerks zu.
2. Hostnamen konfigurieren
Da wir über ihren Namen auf den Load Balancer und den Webserver zugreifen werden (nicht über IPADDRESS), werden wir daher den Hostnamen von drei Webservern und einem Proxyserver einrichten. Wir werden den Hostnamen von drei Webservern und Proxyservern als site1.local, site2.local, site3.local bzw. load-balancer.local einrichten.
Wir werden den Hostnamen 10.0.1.116 als site1.local in /etc/hosts und /etc/hostname
einrichtenroot@site1:~# vi /etc/hosts
127.0.0.1 localhost
10.0.1.116 site1.local
root@site1:~# vi /etc/hostname
site1.local
Netzwerk neu starten
root@site1:~# service networking restart
Apache installieren und aktivieren.
root@site1:~# apt-get install apache2
root@site1:~# service apache2 enable
root@site1:~# service apache2 start
Erstellen Sie eine Indexdatei für site1.local
root@site1:~# vi /var/www/html/index.html
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
Firewallregel für http hinzufügen
# ufw allow 80/tcp
# ufw reload
Prüfen Sie nun, ob Sie auf Seite1 zugreifen können
root@site1:~# curl -I site1.local
HTTP/1.1 200 OK
Date: Sun, 14 Aug 2016 14:30:29 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Sun, 14 Aug 2016 03:50:35 GMT
ETag: "ec-53a0004a26c6d"
Accept-Ranges: bytes
Content-Length: 236
Vary: Accept-Encoding
Content-Type: text/html
ODER
root@site1:~# curl site1.local
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
Wiederholen Sie Schritt 2 für Site2 ( 10.0.1.117 ) und Site3 ( 10.0.1.119 ).
Fügen Sie im Proxy-Server alle drei Webserver-Einträge ( IPADDRESS HOSTNAME ) außer seinem eigenen Hostnamen als load-balancer.local
hinzuroot@load-balancer:~# vi /etc/hosts
127.0.0.1 localhost
10.0.1.118 load-balancer.local
10.0.1.116 site1.local
10.0.1.117 site2.local
10.0.1.119 site3.local
Richten Sie den Hostnamen des Proxy-Servers ein
root@load-balancer:~# vi /etc/hostname
load-balancer.local
3. Installieren Sie HAProxy
Aktualisieren Sie Ubuntu vor der Installation. Führen Sie den folgenden Befehl als root aus oder verwenden Sie sudo, um Ubuntu zu aktualisieren.
root@load-balancer:~# apt-get update
Jetzt Pakete auf dem System aktualisieren.
root@load-balancer:~# apt-get upgrade
Installieren Sie es, indem Sie den folgenden Befehl im Terminal ausführen.
root@load-balancer:~# apt-get install haproxy
Um den Dienst als Daemon zu aktivieren, bearbeiten Sie /etc/defaults/haproxy und fügen Sie die folgende Zeile hinzu.
ENABLED=1
root@load-balancer:~# vi /etc/defaults/haproxy
ENABLED=1
# Add extra flags here
#EXTRAOPTS="-de -m 16"
Starten Sie den Dienst
root@load-balancer:~# service haproxy start
4. HAProxy konfigurieren
Die Konfigurationsdatei befindet sich in /etc/haproxy/haproxy.cfg und besteht aus zwei Teilen global und proxies. Der Abschnitt Global legt prozessweite Parameter fest und der Abschnitt Proxy besteht aus den Abschnitten defaults, listen, front-end und back-end.
Bearbeiten Sie die Konfigurationsdatei mit dem Texteditor vi
root@load-balancer:~# vi /etc/haproxy/haproxy.cfg
Die Standardkonfigurationsdatei sieht etwa wie folgt aus. Behalten Sie den globalen und den Standardabschnitt unverändert bei.
Globaler Abschnitt
global
log 127.0.0.1 local0
log 127.0.0.1 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/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH
+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
Standardabschnitt
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
Zuhörer hinzufügen:
Ein "Front-End"-Abschnitt beschreibt einen Satz von Listening-Sockets, die Client-Verbindungen akzeptieren. Das Front-End definiert, wie Anfragen behandelt und an den Back-End-Server gesendet werden sollen:
frontend Local_Server
bind 10.0.1.118:80
mode http
default_backend My_Web_Servers
Hinzufügen von Back-End-Webservern:
Ein "Back-End"-Abschnitt beschreibt eine Reihe von Servern, mit denen sich der Proxy verbindet, um eingehende Verbindungen weiterzuleiten. Gemäß der obigen Konfiguration lauscht der Load Balancer jetzt auf Port 80. Definieren Sie nun die Back-End-Webserver, an die er die Anfrage senden wird.
backend My_Web_Servers
mode http
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1rnHost:localhost
server site1.local 10.0.1.116:80
server site2.local 10.0.1.117:80
server site3.local 10.0.1.119:80
Sie können am Ende der obigen drei Zeilen den Parameter „check“ hinzufügen, um den Zustandsparameter Ihrer Webserver zu überprüfen.
Sie können je nach Ihren Anforderungen andere Ausgleichsalgorithmen verwenden.
Leastconn
Wählt den Server mit der geringsten Anzahl von Verbindungen aus – dies wird für längere Sitzungen empfohlen. Server im selben Backend werden ebenfalls im Round-Robin-Modus rotiert.
Quelle
Dies wählt aus, welcher Server basierend auf einem Hash der Quell-IP, d. h. der IP-Adresse Ihres Benutzers, verwendet werden soll. Dies ist eine Methode, um sicherzustellen, dass sich ein Benutzer mit demselben Server verbindet.
Statistiken aktivieren (optional)
Wenn Sie möchten, können Sie jetzt Statistiken aktivieren, indem Sie Folgendes in die Konfigurationsdatei einfügen.
listen stats
bind :9000
stats enable
stats hide-version
stats refresh 20s
stats show-node
stats uri /stats
5. Starten Sie HAProxy neu
Da Sie alle erforderlichen Konfigurationen für den Proxy-Server vorgenommen haben, überprüfen Sie die Konfigurationsdatei, bevor Sie den Dienst mit dem folgenden Befehl neu starten.
root@load-balancer:~# haproxy -c -f /etc/haproxy/haproxy.cfg
Wenn der obige Befehl die Ausgabe als „Konfigurationsdatei ist gültig“ zurückgegeben hat, starten Sie den HAProxy-Dienst neu
root@load-balancer:~# service haproxy restart
Überprüfen Sie nun den Status des HAProxy-Servers.
root@load-balancer:~# service haproxy status
6. Testen Sie HAProxy
Stellen Sie vor dem Testen sicher, dass Sie den Webserver (site1.local, site2.local, site3.local) von load-balancer.local aus anpingen können
root@load-balancer:~# ping site1.local
PING site1.local (10.0.1.116) 56(84) bytes of data.
64 bytes from site1.local (10.0.1.116): icmp_seq=1 ttl=64 time=0.906 ms
64 bytes from site1.local (10.0.1.116): icmp_seq=2 ttl=64 time=0.906 ms
64 bytes from site1.local (10.0.1.116): icmp_seq=3 ttl=64 time=0.648 ms
root@load-balancer:~# ping site2.local
PING site2.local (10.0.1.117) 56(84) bytes of data.
64 bytes from site2.local (10.0.1.117): icmp_seq=1 ttl=64 time=3.02 ms
64 bytes from site2.local (10.0.1.117): icmp_seq=2 ttl=64 time=0.687 ms
64 bytes from site2.local (10.0.1.117): icmp_seq=3 ttl=64 time=0.778 ms
root@load-balancer:~# ping site3.local
PING site3.local (10.0.1.119) 56(84) bytes of data.
64 bytes from site3.local (10.0.1.119): icmp_seq=1 ttl=64 time=0.830 ms
64 bytes from site3.local (10.0.1.119): icmp_seq=2 ttl=64 time=0.631 ms
64 bytes from site3.local (10.0.1.119): icmp_seq=3 ttl=64 time=0.771 ms
HAPROXY mit CURL testen
Um das folgende Skript vom Terminal aus zu testen, werden Sie feststellen, dass der Load Balancer Anfragen an drei Webserver in einer Round-Robin-Methode sendet.
root@load-balancer:~# while true; do curl http://10.0.1.118; sleep 1; done
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.119 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.117 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.119 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.117 </h1>
</body>
</html>
...............................
...............................
...............................
Im Browser testen:
Richten Sie Ihren Browser auf http://load-balancer.local oder http://Server-Public-IP, Sie erhalten eine Antwort von drei Webservern in Round-Robin-Weise, die bestätigen, dass er mit unserer Erwartung funktioniert. Bei jeder Aktualisierung sendet der Proxy-Server eine Anfrage nach der anderen an den Back-End-Webserver.
Sie können auch die Statistik-URL aufrufen, die im letzten Abschnitt der Konfigurationsdatei konfiguriert ist, um zu bestätigen, dass die Ports für den Datenverkehr geöffnet sind. Navigieren Sie einfach zu Public IP oder http://load-balancer.local auf Port 9000.
Navigieren Sie beispielsweise zu http://load-balancer.local:9000/stats
Sie können den Status des Servers auch vom Terminal aus mit HATOP überwachen. HATOP ist ein Drittanbieter-Tool, das die Statistiken aus einer vom Load Balancer erstellten Socket-Datei extrahiert. Installieren Sie HATOP, indem Sie den folgenden Befehl vom Terminal ausführen.
root@load-balancer:~# apt-get install hatop
Normalerweise müssen Sie beim Ausführen von HATOP den Parameter -s mit dem Befehl sudo hatop -s /var/run/haproxy.sock verwenden. Um die Eingabe des Parameters -s beim Aufruf von HATOP zu vermeiden, können Sie die folgende Zeile in Ihre ~/.bashrc-Datei einfügen:
export unix-socket=/var/run/haproxy.sock
7. Protokollierung von HAProxy
Bearbeiten Sie /etc/rsyslog.d/haproxy.conf und fügen Sie die folgenden Zeilen hinzu.
local0.* -/var/log/haproxy_0.log
local1.* -/var/log/haproxy_1.log
Starten Sie rsyslog neu
root@load-balancer:~# service rsyslog restart
Überprüfen Sie nun die Protokolle mit dem folgenden Befehl
root@load-balancer:~# tail -f /var/log/haproxy*.log
Fügen Sie außerdem die Zeile „debug“ in den globalen Abschnitt der Konfigurationsdatei für die ausführliche Protokollierung ein.
Schlussfolgerung
Mit HAProxy steigern Sie die Performance und Verfügbarkeit Ihrer Webanwendung. Dieses Tutorial ist nur eine Einführung in das Load Balancing, obwohl es viel mehr kann als das, was in diesem Tutorial beschrieben wird. Sie können die Hochverfügbarkeit verbessern, indem Sie Floating IP zwischen mehreren Load Balancern einrichten, um einen Schutz vor Fehlern in einem einzelnen Load Balancer zu bieten.