web-dev-qa-db-fra.com

Puis-je diviser un gros fichier de configuration HAProxy en plusieurs fichiers plus petits?

Je construis un fichier de configuration haproxy qui a plusieurs fronts et backends. Cela va faire plusieurs centaines de lignes et je préfère le diviser en fichiers séparés pour chacun des différents sites Web que je souhaite équilibrer.

HAProxy offre-t-il la possibilité de créer des liens vers des fichiers de configuration partiels à partir du fichier haproxy.cfg principal?

27
stephenmurdoch

Les fichiers de configuration ne peuvent pas être liés ensemble à partir d'une directive de configuration.

Cependant, HAProxy peut charger plusieurs fichiers de configuration à partir de sa ligne de commande, en utilisant le -f basculer plusieurs fois:

haproxy -f conf/http-defaults -f conf/http-listeners -f conf/tcp-defaults -f conf/tcp-listeners 

Si vous voulez être flexible avec la quantité de fichiers de configuration, vous pouvez même spécifier un répertoire comme celui-ci: -f /etc/haproxy. Les fichiers seront ensuite utilisés dans leur ordre lexical, les fichiers plus récents remplaçant les fichiers plus anciens. Voir la liste de diffusion pour un exemple, si fournit des liens vers la documentation. Ces informations se trouvent dans le guide de gestion, pas dans les documents habituels.

31
Baptiste

Nous sommes tombés sur cette réponseauteur a créé des scripts pour imiter la fonctionnalité de désactivation des sites d'activation de nginx. Dans le démarrage haproxy init.d, il utilise la boucle de script pour construire la concaténation des commandes haproxy -f.

/etc/init.d/haproxy:

EXTRAOPTS=`for FILE in \`find /etc/haproxy/sites-enabled -type l | sort
-n\`; do CONFIGS="$CONFIGS -f $FILE"; done; echo $CONFIGS`

haensite script:

#!/bin/bash

if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
fi

if [ $# -lt 1 ]; then
  echo "Invalid number of arguments"
  exit 1
fi

echo "Enabling $1..."

cd /etc/haproxy/sites-enabled
ln -s ../sites-available/$1 ./

echo "To activate the new configuration, you need to run:"
echo "  /etc/init.d/haproxy restart"

hadissite script:

#!/bin/bash

if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
fi

if [ $# -lt 1 ]; then
  echo "Invalid number of arguments"
  exit 1
fi

echo "Disabling $1..."

rm -f /etc/haproxy/sites-enabled/$1

echo "To activate the new configuration, you need to run:"
echo "  /etc/init.d/haproxy restart"
8
elpddev

Il s'agissait d'une solution reposant sur la réponse de @ stephenmurdoch, qui impliquait l'utilisation de plusieurs arguments -f <conf file> Pour l'exécutable haproxy.

En utilisant le script /etc/init.d/haproxy Inclus de CentOS 6.x RPM, vous pouvez le modifier comme suit:

start() {
    $exec -c -q -f $cfgfile $OPTIONS
    if [ $? -ne 0 ]; then
        echo "Errors in configuration file, check with $prog check."
        return 1
    fi

    echo -n $"Starting $prog: "
    # start it up here, usually something like "daemon $exec"
    #daemon $exec -D -f $cfgfile -f /etc/haproxy/haproxy_ds.cfg -f /etc/haproxy/haproxy_es.cfg -f /etc/haproxy/haproxy_stats.cfg -p $pidfile $OPTIONS
    daemon $exec -D -f $cfgfile $(for i in /etc/haproxy/haproxy_*.cfg;do echo -n "-f $i ";done) -p $pidfile $OPTIONS
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

Avec ce qui précède en place, vous pouvez ensuite créer des fichiers tels que haproxy_<X>.cfg Et haproxy_<Y>.cfg En utilisant les noms que vous voulez. La boucle for ci-dessus inclura ces fichiers dans une ligne augmentée daemon haproxy ... Si ces fichiers sont présents, sinon le fichier stock haproxy.cfg Sera utilisé uniquement.

Dans les fichiers haproxy_<...>.cfg, Vous devez vous assurer que vos paramètres globaux et par défaut sont définis dans le fichier "toplevel" haproxy.cfg. Le reste des fichiers doit simplement avoir un frontend/backends et rien de plus.

4
slm

Vous pouvez suivre cette étape simple.

  1. Insérez un script de ligne (cat /etc/$BASENAME/conf.d/*.cfg > $CFG) dans /etc/init.d/haproxy
    Voici la position où vous devez insérer la ligne
    CFG=/etc/$BASENAME/$BASENAME.cfg cat /etc/$BASENAME/conf.d/*.cfg > $CFG [ -f $CFG ] || exit 1
  2. Recharger la configuration du démon avec systemctl daemon-reload
  3. Créer un répertoire mkdir /etc/haproxy/conf.d
  4. Déplacez haproxy.cfg par défaut vers conf.d en tant que global.cfg mv /etc/haproxy/haproxy.cfg /etc/haproxy/conf.d/global.cfg
  5. Créez votre autre fichier .cfg dans le répertoire conf.d
  6. Redémarrez simplement votre service haproxy systemctl restart haproxy
  7. REMARQUE: /etc/haproxy/haproxy.cfg sera automatiquement créé à partir de tous les fichiers dans conf.d /
1
dek.tiram

réponse de @Bapstie a rappelé que, un répertoire peut être passé à haproxy en tant que fichier de configuration, et les fichiers à l'intérieur seront chargés dans l'ordre alphabétique. C'est correct.

Mais le problème est que le package haproxy dans le référentiel CentOS 'base/7/x86_64' est tellement ancien qu'il ne le supporte pas.

Vous devez donc soit écrire un wrapper pour ajouter -f <individual config file>à la commande, ou vous devez installer la dernière version de haproxy:

for package in centos-release-scl-rh rh-haproxy18-haproxy; do 
    yum install -y $package
done

et créez une configuration de dépôt pour le service haproxy:

[Service]
ExecStart=
ExecStart=/opt/rh/rh-haproxy18/root/sbin/haproxy -f /etc/haproxy-nutstore/ -p /run/haproxy.pid $OPTIONS
0
Chao Guo