
Ich versuche, einen sehr einfachen HTTP-Load Balancer mit Node.js-Backends in CentOS 7 einzurichten. Die Backends sind alle HTTP-Server.
Wenn ich sowohl das Backend so einstelle, dass es auf Port 80 lauscht, als auch HAProxy so einstelle, dass es auf Port 80 lauscht und Port 80 auf dem Backend verwendet, funktioniert alles einwandfrei. So sieht die Konfigurationsdatei in einer solchen Konfiguration aus:
global
log 127.0.0.1 local2 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 256
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
timeout connect 10s
timeout client 30s
timeout server 30s
frontend http-in
bind :80
default_backend backend_servers
option forwardfor
backend backend_servers
balance roundrobin
server backend1 10.0.4.51:80 check
# server backend2 10.0.4.52:80 check
# server backend3 10.0.4.53:80 check
# server backend4 10.0.4.54:80 check
# server backend5 10.0.4.55:80 check
# server backend6 10.0.4.56:80 check
Wenn ich aber alle Ports beispielsweise auf 8124 ändere, zeigt HAProxy beim Start den folgenden Fehler an:
haproxy[3324]: backend backend_servers has no server available!
So sieht die neue Konfiguration aus
global
log 127.0.0.1 local2 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 256
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
timeout connect 10s
timeout client 30s
timeout server 30s
frontend http-in
bind :8124
default_backend backend_servers
option forwardfor
backend backend_servers
balance roundrobin
server backend1 10.0.4.51:8124 check
# server backend2 10.0.4.52:8124 check
# server backend3 10.0.4.53:8124 check
# server backend4 10.0.4.54:8124 check
# server backend5 10.0.4.55:8124 check
# server backend6 10.0.4.56:8124 check
Sicherlich lauscht das Backend-Node.js-Programm jetzt auf Port 8124.
Die Firewall ist für Port 8124 im Backend geöffnet und der folgende Befehl:
wget http://10.0.4.51:8124/action
funktioniert vom Load Balancer aus einwandfrei, was darauf hindeutet, dass der Load Balancer tatsächlich auf das Backend zugreifen kann.
Unter diesen Umständen scheint der Start von HAProxy fehlgeschlagen zu sein, da ich Port 8124 nicht im LISTEN
Status sehen kann, wenn ich verwende netstat -an
.
Dies ist das erste Mal, dass ich HAProxy verwende, daher kann es sein, dass mir etwas ganz Triviales entgeht.
Gibt es sonst noch etwas, das ich überprüfen sollte?
Antwort1
Ich habe es gerade herausgefunden.
Das Problem liegt nicht in der Konfiguration von HAProxy, sondern in SELinux, das unter CentOS 7 standardmäßig aktiviert und auf den Durchsetzungsmodus eingestellt ist. Es scheint, als ob die Standardkonfiguration von SELinux HAProxy nur auf Port 80 zulässt.
Das Problem wurde behoben, indem SELinux auf den permissiven Modus eingestellt, vollständig deaktiviert oder SELinux anderweitig erlaubt wurde, HAProxy die Verwendung anderer Ports zu gestatten.
Sie können semanage verwenden, um HAProxy die Verwendung des Ports zu erlauben:
sudo semanage port -a -p tcp -t http_port_t 8124