我可以将大型HAProxy配置文件拆分为多个较小的文件吗?

时间:2014-09-10 21:52:07

标签: haproxy

我正在构建一个有多个前端和后端的haproxy配置文件。它将长达数百行,我宁愿将其拆分为我想要负载均衡的每个不同网站的单独文件。

HAProxy能否链接到主haproxy.cfg文件中的部分配置文件?

6 个答案:

答案 0 :(得分:29)

配置文件不能从配置指令链接到一起。

但是,HAProxy可以多次使用-f开关从命令行加载多个配置文件:

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

如果您希望灵活配置大量配置文件,您甚至可以指定如下目录:-f /etc/haproxy。然后,文件将按其词法顺序使用,较新的文件将覆盖较旧的文件。 有关示例,请参阅mailing list,如果提供了文档的链接。此信息可在管理指南中找到,而不是常规文档。

答案 1 :(得分:7)

偶然发现this answer 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"

答案 2 :(得分:4)

这是一个基于@ stephenmurdoch的答案的解决方案,其中涉及对-f <conf file>可执行文件使用多个haproxy参数。

使用库存的CentOS 6.x RPM包括/etc/init.d/haproxy脚本,您可以像这样修改它:

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>.cfghaproxy_<Y>.cfg等文件。如果这些文件存在,上面的for循环将在扩充的daemon haproxy ...行中包含这些文件,否则将仅使用stock haproxy.cfg文件。

haproxy_<...>.cfg文件中,您需要确保在&#34; toplevel&#34;中定义全局和默认值。 haproxy.cfg个文件。其余的文件只需要有前端/后端,而不是更多。

答案 3 :(得分:1)

您可以按照以下简单步骤进行操作。

  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. 在conf.d目录中创建其他.cfg文件
  6. 只需重新启动haproxy服务systemctl restart haproxy
  7. 注意:/etc/haproxy/haproxy.cfg将根据conf.d /
  8. 中的所有文件自动创建

答案 4 :(得分:0)

@Bapstie的

answer提到,可以将目录作为配置文件传递给haproxy,并且内部文件将按字母顺序加载。是的。

但是问题是,CentOS“ base / 7 / x86_64”存储库中的haproxy软件包太旧了,以至于它不支持该软件包。

因此,您是否需要编写包装程序以将-f <individual config file>附加到命令中,还是需要安装最新版本的haproxy:

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

并为haproxy服务创建一个嵌入式配置:

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

答案 5 :(得分:0)

如果您使用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