主要用于为tcp和基于http应用提供,高可用,负载均衡和代理服务器的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点
工作原理如上图所示
当客户端请求到达时,经过层层解封装得到httpd的报文,然后hapoxy按照事先的配置文件对报文进行处理,而后,层层封装,传到后端,响应报文同样的也会解封装再封装最后到达客户端
Haproxy的配置结构
Global setting :全局配置段
Proxies:代理配置段
Backend:后端服务器组的定义
Frontend:定义面向客户的监听的地址和端口,以及关联的后端的服务器组
Listen:组合的方式直接定义frontend及相关的backend
Defaults:默认的配置
Global配置中的参数为进程级别参数,且通常与其运行的OS有关
进程与安全相关的查宿
Chroot [dir]:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot(),以提高安全级别,注意要确保指定的目录为空目录且任何用户不能有写权限
Daemon:以守护进程的方式工作于后台,其等同于-D选项的功能
Gid:指定GID
Group:同GID不过指明的是组名
Log <address> <facility> {Max level [min level]]:定义全局的syslog服务器,最多两个
Log-send-hostname :子syslog的信息的***添加当前主机名,可以为后面的字符串指定的名称,也可以缺省使用当前的主机名
Nbproc :指定进程个数,只能用于守护进行模式的haproxy:默认只启动一个进程,鉴于调试困难等原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式
Pidfile
Uid:指定UID
Ulimit-n:设定没进程所能打开的最大的文件描述符的个数,默认情况下会自动计算,一次不必修改此项
User:同UID,但是用的是用户名
Stats
Node:定义当前节点的名称,用于HA场景中多haproxy进程共享一个IP地址时
Description:当前实例的描述信息
性能调整的相关参数
Maxconn:设定每个haproxy进程所接受的最大并发连接数其等同于命令行选项-n;
Maxpipes:使用pipe完成没和的tcp报文重组
noepoll: 禁用epoll机制
Nokqueue:禁用kqueue
Nopoll:禁用poll
Nosepoll:禁用启发式的epoll
Nosplice:禁止在linux套接字上使用tcp重组
Tune.bufsize :设定buffer的大小,同样的内存条件,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以使某些程序使用较大的cookie信息:默认为16384,其可在编译时修改,不过强烈建议使用默认值
Tune.maxaccept:设定内核调度运行时一次性可以接受的连接个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100多进程下为8 设定为-1可以禁止此设置一般不建议修改
Tune.maxpollevents:设定一次系统调用可以处理的最大事件数,默认取决于OS:其值小于200时可节约贷款淡水略微增大网络延迟,而大于200时会降低延迟,但会 稍稍增加网络带宽 的占用量
Tune.maxrewrite:设置首部重写或是追加而预留的缓冲空间,建议值为1024左右:在需要使用更大的空间是,haproxy会自动增加其值
Tune.rcvbuf.client
Tune,rcbuf.server 设定内核套接字中服务端和客户端接受缓存的大小,单位为字节,强烈建议使用默认值
Debug相关的参数
Debug
Quiet
代理段的定义
Defaults <name> 同于定义所有的其他配置段使用的默认彩塑,这个配置的默认配置参数可有下一个defaults重新设定
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
Frontend <name> 定义一系列的监听套接字,这些套接字可以接受客户端的请求并与之建立连接
frontend main *:5000
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
Backend <name> 用于定义一系列的后端服务器,代理会叫对应客户端的请求转发至这些服务器
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
Listen <name> 通过关联前端和后端定义一个完整的代理,通常只对TCP流量有用
所有的代理的名称只能使用大小写字母,数字 - _ .:此外ACL名称会分字母大小写
简单应用实验:
Yum install haproxy
修改配置文件如下
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend weserver 172.16.101.200:80
default_backend httpdserver
backend httpdserver
balance roundrobin
server httpd1 192.168.1.101:80 check
server httpd2 192.168.1.102:80 check
编辑Vim /etc/rsyslog.conf添加如下内容
local2.* /var/log/haproxy.log
后端节点分别安装httpd而后启动
下面查看负载均衡的效果
代理段参数详解
Bind [<address>]:<port_range> [,.....]
例如
Listen http_proxy
Bind :80,:443
Bind 10.0.0.1:10080,10.0.0.1:10443
Balance <algo> [<arguments>]
Balance url_param <pram> [check_post[<max_wait>]]
Aglo:
Roundrobin 轮询 支持权重 后端服务器权重可以动态调整 支持节点慢启动方式 例如后端新加入一个服务器,那么所有客户多的分配不是一下子全部加入此服务器而是慢慢均衡
stratic-rr 静态轮询
Leatconn 最少连接 适用于长连接的应用 支持慢启动
Source 源地址哈希 建议用于TCP模式调整,且不支持使用的cookie插入模式时使用:由hash-type参数决定其是否支持慢启动或是static
Uri 基于请求的uri的左半部分[query之前]或全部进行hash常用于backend为cache server 有hash type决定其是否支持慢启动
url_param 基于params的值进行哈希 即为=后面的值常用语后端服务器要对用户进行认证的场景
Url的语法<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
Hdr (<name>) 根据用户请求报文中指定的http首部进行调度 例如:hdr(host) 根据主机名进行哈希 use_domain_only:在进行哈希时仅使用域名
rdp-cookie
rdp-cookie(name)
这两种主要用于ms远程桌面的不常用
基于cookie的session绑定机制
backend中定义cookie
Cookie node insert nocache
Server name IP:port cookie name
HAProxy的工作模式分为http和tcp 调度时发生的协议层次
http:仅用于调度httpd协议的服务器 会对应用层数据做深入分析,因此支持7层过滤 处理 转换的处理
Tcp:非http协议的服务器调度 包括https
Mode {tcp|http|health} 默认模式不定义的话就是tcp模式
指定代理服务器使用的日志
Log global :使用全局中的定义
No log
Log + 格式 参考配置文件段解释
Capture request header host len 15
Capture rsponse header <name> len <#>
hash-type : map-base[取模法]不支持慢启动和consistent[一致性hash]支持慢启动
推荐cacahe servers负载均衡调度时的配置
Balance uri
hash-type consistent
Server <name> <address>[:port] [params]
[paramas]
Backup 备用节点
Check:健康状态检测
可跟 inter <delay> 设定检测时时间间隔,单位为ms默认2000 也可使用fastinter和downinter来根据服务器端状态优化时间延迟
Rise <count> :恢复时的确认次数
Fall <count> :失时的确认次数
Maxconn:超出此数放入队列
Maxque
Observe <mode>:观察方式检测后端服务器健康状态 layer4 layer7
Redir <prefix>
示例:server srv2 172.16.100.6:80 redir http://www.baidu.com
Weight <weight>
Option使健康状态的检测个精细
语法:option httpchk <method> <uri> <version>
示例
Backend http
Mode tcp
Option httpchk OPTIONS * HTTP/1.1\r\nHost:\www.baidu.com
状态页
启用stats enable stats auth user:password stats hide-version stats uri /ha?ststus stats scope . 有效的范围 . 为但前页 stats realm string 登陆提示
管理接口启用的方式
Stats admin if LOCALHOST|TURE
下面未启用后的页面
ACL 访问控制列表
使用方式
定义列表---------->使用列表
Acl <aclname> <criterion>匹配标准 [flags] [operator] <value> ......
[flags] -i 不区分大小写 -f 从指定的文件加载模式
Value 支持以下四种
整数或范围 如1024:65535 支持的操作符eq ge gt le lt
正则表达式
<critersion>
be_sess_rate 用于测试指定的backend上会话的创建速率
示例
Acl xyz be_sess_rate gt 50
Fe_sess_rate 用于测试指定的frontnd 上会话的创建的速率
Hdr(header) <string>
Hdr(connection) -i close 请求报文测试 shdr则是响应报文
Method <string>
Path_beg <string>用于测试请求的URL是否已指定的模式开头
Acl url_static path_beg -i /static /javescript
Path_end <string>
Acl url_static path_end -i .jpg .png .css .js
hadr_beg <string>
Acl host_static hdr_beg(host) -i img. Video. Download ftp.
hdr_end <string> 同上
Url <string>
Url_beg <string>
url_reg <string>
示例
Acl static_graph url_reg.*\.(jpj|gif|js|css|ico|swf)$
use_backend varnish if static_graph
四层的ACL匹配标准
Dst <ip_adress> 目标地址
Dst_port <interger> 目标端狗
Src <ip_adress> 源地址
src_port <integer> 源端口
示例:
Acl good src 10.0.0.0/24
tcp-request content accept if good
tcp-request conetent reject
其他参数
Redirect location |prefix<to> [code<code> ] <option> [{if|unless}<condition>]
.location重写整个url prefix只重写前缀
示例
Redirect prefix https://centod.com if login_page !secure
Redirect location http://www.centod.com/ if !login_page secure
Reqadd|rspadd <string> [{if|unless} <aclname>]
示例
Acl is-ssl dst_port 81
Reqadd x-proto:\ SSl if is-ssl
请求报文的首部的尾部添加一个首部
Option forwardfor [except <network>] [header <name>] [if-none]将真实客户端的地址加在发往后端服务器的请求首部的X-Fowarded-For中
Option |no option http-server-close 是否使用长连接的在客户端侧
Option |no option httpclose 被动关闭连接,即客户端主动关闭连接是否被允许
Option |no option redispatch 是否在后端server发生故障时将同一个用户的请求定向至其他的server
Block {if|unless} <condition>
阻塞用户请求
Errorfile <code> <file>自定义错误页
示例
Errorfile 400 /etc/haproxy/errorfiles/400.html
http-request {allow|deny|auth[realm <realm>]} [{if|unless} <condition>] 基于7层做访问控制
示例
Acl nagios src 192.168.129.2
http-request allow if nagios