1、前言
本文将简述HAProxy服务的配置文件配置以及配置示例。
HAProxy安装完成后其主配置文件为/etc/haproxy/haproxy.cfg,该配置文件主要包含着两个配置段:Global和Proxies,而Proxies又包含着defaults、frontend、backend和listen四个子段。不同的配置段的配置有着不同的关键字和参数,如何灵活使用相应的关键字及参数将是学习HAProxy路上的一门重要功课。
2、Global全局配置段
Global全局配置段主要用于配置进程、安全、性能优化、debug和用户列表等相关的关键字及参数。
常用的关键字有:
- log:用于定义全局的syslog服务器,最多可以定义两个;默认情况下haproxy的日志不是直接记录在本地,而是通过syslog服务来保存在127.0.0.1指定的路径上。
语法格式:
log
[len] [max level [min level]]
使用示例:
log 127.0.0.1 local2
- nbproc
用于设置要启动的haproxy进程数量,默认只会创建一个进程。
语法格式:
nbproc
- ulimit-n
用于设置每个haproxy进程可打开的最大文件数量,默认是会自动计算得出合适的值。
语法格式:
ulimit-n
- maxconn
用于设定每个haproxy进程所能接受的最大并发连接数。总并发连接数等于nbproc的值乘以maxconn的值。
语法格式:
maxconn
- maxconnrate
用于设定每个haproxy进程所能接受的最大并发连接数,当连接到达最大数时,进程会停止接收新的请求。
语法格式:
maxconnrate
- maxsessrate
用于设定每个进程每秒种所能创建的最大连接数量;
语法格式:
maxsessrate
- maxsslconn
用于设置每个HAproxy 进程所支持的并发ssl 连接数。
语法格式:
maxsslconn
- spread-checks
用于为健康查询和检测添加设置随机的时间周期,避免因一个物理服务器上存在多个逻辑主机而导致无法实现精准查询。
语法格式:
spread-checks <0..50, in percent>
3、代理配置段
HAProxy 的配置文件中的代理配置段包含着四个字段,分别为:
default:用于配置其他子段所使用的参数的默认值。
frontend:用于配置接受客户端连接的监控套接字。
backend:用于配置代理转发所使用的后端服务器组。
listen:结合frontend和backend段定义完整的代理。
代理配置段中的关键字基本都属于上述四个子段中,那么接着我们来看看代理配置段的常用关键字及其相关参数。
- bind
用于在frontend中定义一个或多个监听地址或端口。
配置段:frontend、listen
语法格式:
bind [
]:[, ...] [param]
bind /[, ...] [param ]
使用示例:
listen http_proxy
bind :80,:443
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy #监听套接字接口
- balance
用于设置后端服务器组内的负载均衡调度算法,其算法包括:roundrobin、static-rr、leastconn、first、source等等
配置段:defaults、listen、backend
语法格式:
balance
[ ]
balance url_param [check_post]
使用示例:
balance roundrobin
balance url_param userid
balance url_param session_id check_post 64
balance hdr(User-Agent)
balance hdr(host)
balance hdr(Host) use_domain_only
- use_backend
用于结合ACL匹配规则将匹配的连接调度到指定的backend 服务器。
配置段:frontend、listen
语法格式:
use_backend
[{if | unless} ]
使用示例:
#当访问连接匹配指定的ACL时,使用指定的backend server进行调度
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
- default_backend
用于设置默认的backend服务器,如后连接会话没有被任何use_backend所匹配,则最终会使用默认的backend进行调度。
配置段:defaults、frontend、listen
使用示例:
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic
- server
此参数用于设置后端服务器的IP端口及选项。
配置段:listen、backend
使用语法:
server
[:[port]] [param*]
命令解释:
:服务器在haproxy上的内部名称;出现在日志及警告信息;
:服务器地址,支持使用主机名;
[:[port]]:端口映射;省略时,表示同bind中绑定的端口;
[param*]:参数
maxconn :当前server的最大并发连接数;
backlog :当前server的连接数达到上限后的后援队列长度;
backup:设定当前server为备用服务器;
check:对当前server做健康状态检测;
addr :检测时使用的IP地址;
port :针对此端口进行检测;
inter :连续两次检测之间的时间间隔,默认为2000ms;
rise :连续多少次检测结果为“成功”才标记服务器为可用;默认为2;
fall :连续多少次检测结果为“失败”才标记服务器为不可用;默认为3;
cookie :为当前server指定其cookie值,用于实现基于cookie的会话黏性;
disabled:标记为不可用;
on-error :后端服务器在故障时的行动策略;
- fastinter: force fastinter
- fail-check: simulate a failed check, also forces fastinter (default)
- sudden-death: simulate a pre-fatal failed health check, one more failed
check will mark a server down, forces fastinter
- mark-down: mark the server immediately down and force fastinter
redir :将发往此server的所有GET和HEAD类的请求重定向至指定的URL;
weight :权重,默认为1;
使用示例:
server first 10.1.1.1:1080 cookie first check inter 1000 server second 10.1.1.2:1080 cookie second check inter 1000
- stats enable
基于默认参数启用haproxy的统计页。
配置段:defaults、frontend、listen、backend
与之相关的参数还有"stats realm
使用示例:
listen stats
bind :9099
stats enable #启用统计页
stats realm HAPorxy\ Stats\ Page #用于访问统计页的uri
stats auth admin:admin #启用访问认证,需要输入相应的登录账号和密码才能访问到统计页面
stats admin if TRUE
maxconn
为指定的frontend定义其最大并发连接数;默认为2000;
配置段:defaults、frontend、listenmode { tcp|http|health }
定义haproxy的工作模式,其中tcp是基于四层实现代理转发,可代理mysql、pgsql、ssh、ssl等协议;http则仅当代理协议为http时才能使用;health则为健康状态检查的响应模式,当连接氢气到达时回应"OK"后即断开连接;
配置段:defaults、frontend、listen、backend
使用示例:
listen ssh
bind :22022
balance leastconn
mode tcp #定义工作在tcp模式
server sshsrv1 172.16.100.6:22 check
server sshsrv2 172.16.100.7:22 check
- cookie
启用基于cookie的持久连接。
配置段:defaults、listen、backend
使用语法:
cookie
[ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain ]* [ maxidle ] [ maxlife ]
使用示例:
基于cookie的session sticky的实现:
backend websrvs
cookie WEBSRV insert nocache indirect
server srv1 172.16.100.6:80 weight 2 check rise 1 fall 2 maxconn 3000 cookie srv1
server srv2 172.16.100.7:80 weight 1 check rise 1 fall 2 maxconn 3000 cookie srv2
- option forwardfor
用于在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值前端客户端的地址;用于向后端主发送真实的客户端IP。
配置段:defaults、frontend、listen、backend
使用语法:
option forwardfor [ except
] [ header ] [ if-none ]
[ except
[ header
使用示例:
frontend www
mode http
option forwardfor except 127.0.0.1 # stunnel already adds the header
backend www
mode http
option forwardfor header X-Client
- errorfile
当HAproxy代理出错时,使用指定的文件内容进行错误提示。
配置段:defaults、frontend、listen、backend
使用语法:
errorfile
:表示错误提示页面返回的HTTP状态码。
使用示例:
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
类似的参数还有:errorloc、errorloc302和errorloc303。
- reqadd
用于在http请求报文中添加一个http首部字段。
配置段:frontend、listen、backend
使用语法:
reqadd
[{if | unless} ]
使用示例:
#在请求来自81端口时,添加X-Proto首部字段
acl is-ssl dst_port 81
reqadd X-Proto:\ SSL if is-ssl
同理类似的参数还有,reqdel、reqidel(不区分大小写)。
而对于http响应报文来说,则对应着rspadd、rspdel、rpsidel,其用法类似。
- compression
用于启用http协议的压缩机制,指明以及指明要压缩的内容类型。
配置段:defaults、frontend、listen、backend
使用语法:
compression algo ...
compression type ...
compression offload
常见的压缩algorithm有:identity、gzip、deflate等等
使用示例:
#使用gzip算法压缩文本信息
compression algo gzip
compression type text/html text/plain
- option httpchk
用于对后端服务器做http协议的健康检测。
配置段:defaults、listen、backend
使用语法:
option httpchk
option httpchk
option httpchk
option httpchk
使用示例:
backend https_relay
mode tcp
option httpchk HEAD /check.html #用来做健康检查html文档
相关参数还有:"option ssl-hello-chk", "option smtpchk", "option mysql-check", "option pgsql-check", "http-check"
- timeout http-keep-alive
用于设置持久连接的超时时间。
配置段:defaults、frontend、listen、backend
使用语法:
timeout http-keep-alive
类似的参数还有:"timeout check", "timeout queue", "timeout server", "contimeout", "timeout tarpit".
- tcp-request connection
基于四层内容来对请求报文做ACL匹配,bin根据匹配结果执行对应的动作。
配置段:frontend、listen
使用语法:
tcp-request connection
[{if | unless} ]
类似的参数还有:block、http-request、tcp-request connection 等等,其使用方式类似,均是利用acl规则来做匹配调用。
使用示例:
listen ssh
bind :22022
balance leastconn
acl invalid_src src 172.16.200.2
tcp-request connection reject if invalid_src
mode tcp
server sshsrv1 172.16.100.6:22 check
server sshsrv2 172.16.100.7:22 check backup
- acl
HAProxy的ACL规则提供了在不同环境下,对请求报文或响应报文做内容切换或检测的解决方法。
配置段:frontend、listen、backend
其使用的语法如下:
acl
[flags] [operator] [ ] ...
其中aclname的命名区分大小写,只能使用大小写字母、数字、横杠、下划线、点号、冒号等字符。
flags则用来指定acl所使用的标记,常用的有:
-i:不区分大小写;
-m:指定匹配方法;
-n:禁止DNS反向解析;
-u:设置acl的id为唯一,不可重复;
operator则用于设置匹配运算符,如匹配整数值所使用的eq、ge、gt、le、lt 和AND(与)、OR(或)、!
(非),另外还可以使用下列参数来进行字符串匹配:
- exact match (-m str):字符串精确匹配
- substring match (-m sub) : 子串匹配
- prefix match (-m beg) : 前缀匹配
- suffix match (-m end) : 后缀匹配
- subdir match (-m dir) : 子目录匹配
- domain match (-m dom) : 域匹配
criterion用于指明ACL匹配的内容,可分为四层检测以及七层检测。四层检测包括使用src、dst、src_port、dst_port来指明匹配的IP和端口,而七层检测则可以使用path、req.hdr、res.hdr、url等来做匹配检查,如:
#path:提取用户请求的URL路径与对应的请求报文的url作比较,从第一个斜杠开始和到问号之前的内容(没有主机部分)
path : exact string match
path_beg : prefix match
path_dir : subdir match
path_dom : domain match
path_end : suffix match
path_len : length match
path_reg : regex match
path_sub : substring match
#url : string,对请求报文中的请求URL做检测
url : url精确匹配
url_beg : url前缀匹配
url_dir : url子目录匹配
url_dom : url域匹配
url_end : url尾部匹配
url_len : url长度匹配
url_reg : 正则表达式匹配
url_sub : url子串匹配
#req.hdr([[,]]) : string (对请求报文中的内容做检查)
hdr([[,]]) : 首部精确匹配
hdr_beg([[,]]) : 首部前缀匹配
hdr_dir([[,]]) : 首部子目录匹配
hdr_dom([[,]]) : 首部域匹配
hdr_end([[,]]) : 首部尾部匹配
hdr_len([[,]]) : 首部长度匹配
hdr_reg([[,]]) : 正则表达式匹配
hdr_sub([[,]]) : 首部子串匹配
#res.hdr([[,]]) : string (对响应报文中的内容做检测)
shdr([[,]]) : exact string match
shdr_beg([[,]]) : prefix match
shdr_dir([[,]]) : subdir match
shdr_dom([[,]]) : domain match
shdr_end([[,]]) : suffix match
shdr_len([[,]]) : length match
shdr_reg([[,]]) : regex match
shdr_sub([[,]]) : substring match
method : 检测请求报文中的请求方法。
另外HAProxy有着众多预定于的ACL,这些ACL可以直接调用,如:
ACL name Equivalent to Usage
FALSE always_false never match
HTTP req_proto_http match if protocol is valid HTTP
HTTP_1.0 req_ver 1.0 match HTTP version 1.0
HTTP_1.1 req_ver 1.1 match HTTP version 1.1
HTTP_CONTENT hdr_val(content-length) gt 0 match an existing content-length
HTTP_URL_ABS url_reg ^[^/:]*:// match absolute URL with scheme
HTTP_URL_SLASH url_beg / match URL beginning with "/"
HTTP_URL_STAR url * match URL equal to "*"
LOCALHOST src 127.0.0.1/8 match connection from local host
METH_CONNECT method CONNECT match HTTP CONNECT method
METH_GET method GET HEAD match HTTP GET or HEAD method
METH_HEAD method HEAD match HTTP HEAD method
METH_OPTIONS method OPTIONS match HTTP OPTIONS method
METH_POST method POST match HTTP POST method
METH_TRACE method TRACE match HTTP TRACE method
RDP_COOKIE req_rdp_cookie_cnt gt 0 match presence of an RDP cookie
REQ_CONTENT req_len gt 0 match data in the request buffer
TRUE always_true always match
WAIT_END wait_end wait for end of content analysis
使用示例:
#path匹配示例
path /imgs/logos/logo.jpg
path_beg /imgs
path_end jpg
path_sub logos
path_dir logos/logo.jpg
path_reg ^/imgs/.*
#匹配静态内容
acl static path_end .jpg .jpeg .png .gif .txt .html .css .javascript .js
acl static path_beg /imgs /images /css /java/scripts
use_backend staticsrvs if static
#只接收GET和HEAD请求
acl valid_method method GET HEAD
http-request deny if ! valid_method
#禁止客户端为curl的访问
acl bad_curl hdr_sub(User-Agent) -i curl
block if bad_curl