Haproxy basics
Par pepin le mercredi, janvier 10 2018, 19:47 - Haproxy - Lien permanent
apt install haproxy
la conf de base mise en place est la suivante :
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners 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=haproxyL7OK/200 in 0ms Layer7 check passed: OK 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
Définissions notre premier serveur web :
frontend web01 bind *:80 mode http default_backend web01-backends backend web01-backends 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.1\r\nHost:localhost server http1 172.17.0.2:80 check weight 100 server http2 172.17.0.3:80 check weight 50 server http3 172.17.0.4:80 check weight 50
Notre serveur web01 est paramétré avec trois backends pondérés (100/50/50) vers des container docker faisant tourner apache. L'option "check" vérifie la disponibilité du nœud et ne le servira plus si le check échoue.
Il y'a beaucoup d'options disponibles pour les frontend et backend, comme les acls pour faire un frontend "selectif" ou d'autres options que "check" et "weight" dans les backend. J'essayerai de faire un post ultérieur pour les options et acls les plus utiles !
Deuxième cas, un frontend tcp ! Car oui, dans le cas d'un serveur web, nous avons utilisé un frontend http qui permet comme on le voir dans le backend d'ajouter des informations à l'entête pour informer le serveur réel de la provenance de la demande.Mais dans un cas de ssh, cela n'est pas pertinent :
frontend tk-ssh bind *:2222 mode tcp default_backend tk-ssh-backends backend tk-ssh-backends mode tcp balance roundrobin server host-ssh1 10.0.0.9:22 check server host-ssh2 10.0.0.6:22 check
Ici on voit qu'on peut distinguer le port d'écoute du hlb du port réel du service. Certes, c'est banalement affligeant, mais c'est bon à savoir.
Dans ce cas, si nous ne précisons pas :22 dans le backend, le haproxy conservera le port d'écoute.
Dans tous les cas, il est bon d'être explicite !
Dernier point, l'ajout de stats :
listen stats bind :9000 mode http stats enable stats hide-version stats realm Haproxy\ Statistics stats uri /stats stats auth Username:Password
Cette configuration permet d'accéder aux statistiques via l'url : http://haproxy:9000/stats
Mais il y'a mieux !
Dans la configuration de base que met en place ubuntu pour le package haproxy, la socket unix /run/haproxy/admin.sock est en level admin pour haproxy.
Ce qui nous permet de dialoguer avec haproxy en ligne de commande :
Désactiver un backend pour maintenance :
echo "disable server web01-backends/http2" | nc -U /run/haproxy/admin.sock
Réactiver le noeud :
echo "enable server web01-backends/http2" | nc -U /run/haproxy/admin.sock