Могу ли я разделить большой файл конфигурации HAProxy на несколько файлов меньшего размера?

Я создаю файл конфигурации haproxy, который имеет несколько внешних и внутренних сторон. Это будет несколько сотен строк, и я бы предпочел разделить его на отдельные файлы для каждого из разных веб-сайтов, которые я хочу сбалансировать.

Предлагает ли HAProxy возможность ссылаться на частичные файлы конфигурации из основного файла haproxy.cfg?


person stephenmurdoch    schedule 10.09.2014    source источник


Ответы (6)


Файлы конфигурации не могут быть связаны вместе с помощью директивы конфигурации.

Однако HAProxy может загружать несколько файлов конфигурации из командной строки, используя переключатель -f несколько раз:

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

Если вы хотите гибко настраивать количество файлов конфигурации, вы даже можете указать такой каталог: -f /etc/haproxy. Затем файлы будут использоваться в их лексическом порядке, более новые файлы заменят старые файлы. См. Пример в списке рассылки, если там есть ссылки на документация. Эту информацию можно найти в руководстве по управлению, а не в обычных документах.

person Baptiste    schedule 12.09.2014
comment
haproxy -f conf / http-defaults -f conf / http-listeners -f conf / tcp-defaults -f conf / tcp-listeners - person zx1986; 15.03.2016

Наткнулся на этот ответ, где author создал скрипты для имитации nginx, отключив функцию включения сайтов. При запуске haproxy init.d он использует цикл сценариев для построения конкатенации команд 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 скрипт:

#!/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 скрипт:

#!/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"
person Community    schedule 28.06.2016

Это было решение, основанное на ответе @ stephenmurdoch, который включал использование нескольких -f <conf file> аргументов для haproxy исполняемого файла.

Используя стандартный /etc/init.d/haproxy скрипт RPM CentOS 6.x, вы можете изменить его следующим образом:

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
}

После этого вы можете создавать файлы, такие как haproxy_<X>.cfg и haproxy_<Y>.cfg, используя любые имена, какие захотите. Вышеупомянутый цикл for будет включать эти файлы в расширенную daemon haproxy ... строку, если эти файлы присутствуют, в противном случае будет использоваться только стандартный haproxy.cfg файл.

В haproxy_<...>.cfg файлах вам необходимо убедиться, что ваши глобальные значения и значения по умолчанию определены в haproxy.cfg файле "верхнего уровня". Остальные файлы просто должны иметь интерфейс / бэкенд и ничего более.

person slm    schedule 29.08.2016

Вы можете выполнить этот простой шаг.

  1. Вставить однострочный скрипт (cat /etc/$BASENAME/conf.d/*.cfg > $CFG) в /etc/init.d/haproxy
    Здесь вы должны вставить строку
    CFG=/etc/$BASENAME/$BASENAME.cfg cat /etc/$BASENAME/conf.d/*.cfg > $CFG [ -f $CFG ] || exit 1
  2. Перезагрузите конфигурацию демона с systemctl daemon-reload
  3. Сделать каталог mkdir /etc/haproxy/conf.d
  4. Переместите haproxy.cfg по умолчанию в conf.d как global.cfg mv /etc/haproxy/haproxy.cfg /etc/haproxy/conf.d/global.cfg
  5. Создайте другой файл .cfg в каталоге conf.d
  6. Просто перезапустите службу haproxy systemctl restart haproxy
  7. ПРИМЕЧАНИЕ: /etc/haproxy/haproxy.cfg будет автоматически создан из всех файлов в conf.d /
person dek.tiram    schedule 16.07.2018

Ответ @Bapstie отметил, что каталог может быть передан haproxy в качестве файла конфигурации, и файлы внутри будут загружены в алфавитном порядке. Это правильно.

Но проблема в том, что пакет haproxy в репозитории CentOS base / 7 / x86_64 настолько стар, что не поддерживает его.

Итак, вам либо нужно написать оболочку для добавления -f <individual config file> к команде, либо вам нужно установить последнюю версию haproxy:

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

и создайте конфигурацию drop-in для службы haproxy:

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

Если вы используете Ansible, вы можете сделать такой трюк:

- name: haproxy configuration
  copy:
    content: >
      {{ lookup('template', haproxy_cfg_src_top) +
      lookup('template', haproxy_cfg_src_edge) +
      lookup('template', haproxy_cfg_src_bottom) }}

    dest: "{{ haproxy_cfg }}"
    owner: "{{ docker_user }}"
    group: "docker"
    mode: 0664
  register: haproxy_cfg_change
person Rafał W.    schedule 17.12.2020