10. 简化配置管理
让大型 HAProxy 配置更易维护的方法
组成集群的两个 HAProxy 节点通常使用完全相同的配置,只有少数地址不同。与其为每个节点分别维护一份最终必然产生差异的重复配置,不如在配置中引用环境变量。这样,多个配置实例便可共用同一个文件,只需在系统级环境变量中保留少量差异。此功能始于 1.5 版,当时只有地址可以包含环境变量;1.6 版进一步支持在所有位置使用环境变量。其语法与 UNIX shell 相同:变量以美元符号(’$’)开头,后接左花括号(’{’)、变量名和右花括号(’}’)。除地址外,环境变量只在双引号包围的参数中解析;这是为了避免破坏使用含美元符号正则表达式的现有配置。
环境变量也便于编写可在多个站点使用、仅地址不同的通用配置,还可以把密码从部分配置文件中移出。以下示例中的 “site1.env” 文件会在启动时由 init 脚本加载:
$ cat site1.env
LISTEN=192.168.1.1
CACHE_PFX=192.168.11
SERVER_PFX=192.168.22
LOGGER=192.168.33.1
STATSLP=admin:pa$$w0rd
ABUSERS=/etc/haproxy/abuse.lst
TIMEOUT=10s
$ cat haproxy.cfg
global
log "${LOGGER}:514" local0
defaults
mode http
timeout client "${TIMEOUT}"
timeout server "${TIMEOUT}"
timeout connect 5s
frontend public
bind "${LISTEN}:80"
http-request reject if { src -f "${ABUSERS}" }
stats uri /stats
stats auth "${STATSLP}"
use_backend cache if { path_end .jpg .css .ico }
default_backend server
backend cache
server cache1 "${CACHE_PFX}.1:18080" check
server cache2 "${CACHE_PFX}.2:18080" check
backend server
server cache1 "${SERVER_PFX}.1:8080" check
server cache2 "${SERVER_PFX}.2:8080" check