J'ai haproxy en cours d'exécution comme équilibreur de charge et à partir de l'interface Web de statistiques fournie avec haproxy, je peux mettre un serveur Web en mode de maintenance (et le réactiver) - ce qui est génial!
Cependant, je souhaite également pouvoir effectuer la même action à partir de la ligne de commande (pour une utilisation dans certains workflows de déploiement automatisé). Est-ce possible, et si oui comment?
Merci beaucoup
Mise à jour (28 août 2012): J'ai maintenant tendance à utiliser haproxyctl de nos jours, qui utilise les méthodes décrites ci-dessous.
Je l'ai corrigé après un peu plus de recherche, pour toute autre personne ayant le même problème: -
Vous pouvez ajouter un socket Unix dans votre configuration, puis interagir avec cela ( voici les commandes possibles ).
Installer:
Sudo nano /etc/haproxy/haproxy.cfg
Dans votre section "globale", ajoutez:
stats socket /etc/haproxy/haproxysock level admin
Redémarrez votre démon haproxy (par exemple Sudo service haproxy restart
)
Maintenant, vous avez besoin de socat (si vous ne l'avez pas, juste apt-get install socat
sur Ubuntu).
Il ne vous reste plus qu'à lancer cette commande pour supprimer un nœud:
echo "disable server yourbackendname/yourservername" | socat stdio /etc/haproxy/haproxysock
Pour le réactiver, remplacez disable par enable dans la commande ci-dessus.
En plus de la méthode d'écho de beardwizzle, vous pouvez également le faire de manière interactive:
root@ny-lb01:/etc/haproxy# Sudo socat readline /var/run/haproxy.stat
Prompt
> set timeout cli 1d
> disable server foo/web01
> help
Unknown command. Please enter one of the following commands only :
clear counters : clear max statistics counters (add 'all' for all counters)
clear table : remove an entry from a table
help : this message
Prompt : toggle interactive mode with Prompt
quit : disconnect
show info : report information about the running process
show stat : report counters for each proxy and server
show errors : report last request and response errors for each proxy
show sess [id] : report the list of current sessions or dump this session
show table [id]: report table usage stats or dump this table's contents
get weight : report a server's current weight
set weight : change a server's weight
set timeout : change a timeout setting
disable server : set a server in maintenance mode
enable server : re-enable a server that was previously in maintenance mode
Si vous n'avez accès qu'à netcat (nc
), vous pouvez l'utiliser pour interagir avec le fichier socket de HAProxy de la même manière que socat
.
$ echo "show info" | nc -U /var/lib/haproxy/stats | head -10
Name: HAProxy
Version: 1.5.2
Release_date: 2014/07/12
Nbproc: 1
Process_num: 1
Pid: 29745
Uptime: 0d 0h14m35s
Uptime_sec: 875
Memmax_MB: 0
Ulimit-n: 8034
Pour désactiver un serveur:
$ echo "enable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats
Veillez à ce que le fichier socket ait le niveau d'accès approprié pour effectuer les opérations ci-dessus. Principalement quelque chose comme ça:
stats socket /var/lib/haproxy/stats level admin
Sinon, vous obtiendrez des erreurs d'autorisation refusée:
$ echo "disable server bk_dservers/ds02" | nc -U /var/lib/haproxy/stats
Permission denied
$
La manière la plus simple est:
1 - Configurez votre serveur Web pour renvoyer le code 503 si un fichier nommé maintenance.html (par exemple) existe. Avec Apache, vous pouvez le faire comme suit:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} !=503
RewriteCond "/var/www/maintenance.html" -f
RewriteRule ^(.*)$ /$1 [R=503,L]
</IfModule>
2 - Configurez votre backend haproxy pour vérifier une URL au lieu de ne vérifier qu'un port comme suit:
backend site
balance roundrobin
option httpchk GET /index.html
server myserver1.example.com 192.0.2.1:80 cookie S1 check inter 2000 fall 3
server myserver2.example.com 192.0.2.2:80 cookie S2 check inter 2000 fall 3
3 - Redémarrez votre serveur Web et votre équilibreur de charge.
4 - Mettez votre serveur Web en mode maintenance.
touch /var/www/maintenance.html
5 - Supprimez votre serveur Web du mode maintenance.
rm -f /var/www/maintenance.html
Vous pouvez également "supprimer" temporairement la page de vérification de l'état d'un serveur, pour arrêter le point de terminaison, puis publier votre application.
Si vous avez debian, readline ne fonctionne pas, netcat est une meilleure option pour l'interactivité:
user@server:/etc/haproxy$ Sudo nc -U /etc/haproxy/haproxysock
Prompt
> show info
Name: HAProxy
Version: 1.7.11-1ppa1~xenial
Release_date: 2018/04/30
Nbproc: 1
Process_num: 1
Pid: 12307
Uptime: 0d 10h33m22s
...
Non interactif:
echo "show info;show stat" | Sudo nc -U /etc/haproxy/haproxysock