一、使用说明:
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
二、安装配置:
安装:
#下载
wget
#解压
tar -zxvf haproxy-1.6.9.tar.gz
cd haproxy-1.6.9
#安装
make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
#参数说明
TARGET=linux26 #内核版本,使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26;kernel 大于2.6.28的用:TARGET=linux2628
ARCH=x86_64 #系统位数
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy为haprpxy安装路径
配置:
vim /usr/local/haproxy/haproxy.cfg
内容为:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
daemon
nbproc 2
maxconn 51200
pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option abortonclose
timeout connect 5000ms
timeout client 30000ms
timeout server 60000ms
balance roundrobin
listen stats
bind 0.0.0.0:9080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /stats
stats realm Haproxy Manager
stats auth admin:mysqladmin
stats hide-version
stats admin if TRUE
listen mysqlha
bind 127.0.0.1:3306
mode tcp
balance static-rr
option tcplog
server s1 192.168.1.227:3306 weight 1
server s3 192.168.1.228:3306 weight 1
server s2 192.168.1.229:3306 weight 1
此配置做为一个mysql的负载均衡实例,大家可以做为参考。
启动haproxy:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
至此haproxy便安装启动完成了
也可以通过访问http://localhost:9080/ 来查看haproxy自带统计页面数据信息。
三、配置说明:
负载均衡算法:
一、roundrobin,表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
二、static-rr,表示根据权重,建议关注;每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权限是无效的。另外,它对服务器的数量没有限制。
三、leastconn,表示最少连接者先处理,建议关注;leastconn建议用于长会话服务,例如LDAP、SQL、TSE等,而不适合短会话协议。如HTTP.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
四、source,表示根据请求源IP,建议关注;对请求源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
只要服务器正常,同一个客户端IP地址总是访问同一个服务器。如果哈希的结果随可用服务器数量而变化,那么客户端会定向到不同的服务器;
该算法一般用于不能插入cookie的Tcp模式。它还可以用于广域网上为拒绝使用会话cookie的客户端提供最有效的粘连;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
五、uri,表示根据请求的URI;表示根据请求的URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
只要服务器正常,同一个URI地址总是访问同一个服务器。
一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端;
该算法一般用于后端是缓存服务器;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
六、url_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name
在HTTP GET请求的查询串中查找中指定的URL参数,基本上可以锁定使用特制的URL到特定的负载均衡器节点的要求;
该算法一般用于将同一个用户的信息发送到同一个后端服务器;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
七、hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
在每个HTTP请求中查找HTTP头
如果缺少头或者头没有任何值,则用roundrobin代替;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
八、rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
为每个进来的TCP请求查询并哈希RDP cookie
该机制用于退化的持久模式,可以使同一个用户或者同一个会话ID总是发送给同一台服务器。
如果没有cookie,则使用roundrobin算法代替;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
#其实这些算法各有各的用法,我们平时应用得比较多的应该是roundrobin、source和lestconn。
haproxy负载均衡算法
ACL规则定义:
########ACL策略定义#########################
1、#如果请求的域名满足正则表达式返回true -i是忽略大小写
acl denali_policy hdr_reg(host) -i ^(www.inbank.com|image.inbank.com)$
2、#如果请求域名满足www.inbank.com 返回 true -i是忽略大小写
acl tm_policy hdr_dom(host) -i www.inbank.com
3、#在请求url中包含sip_apiname=,则此控制策略返回true,否则为false
acl invalid_req url_sub -i sip_apiname=#定义一个名为invalid_req的策略
4、#在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false
acl timetask_req url_dir -i timetask
5、#当请求的header中Content-length等于0时返回 true
acl missing_cl hdr_cnt(Content-length) eq 0
#########acl策略匹配相应###################
1、#当请求中header中Content-length等于0 阻止请求返回403
block if missing_cl
2、#block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。
block if !invalid_req || timetask_req
3、#当满足denali_policy的策略时使用denali_server的backend
use_backend denali_server if denali_policy
4、#当满足tm_policy的策略时使用tm_server的backend
use_backend tm_server if tm_policy
5、#reqisetbe关键字定义,根据定义的关键字选择backend
reqisetbe ^Host:\ img dynamic
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic
reqisetbe ^[^\ ]*\ /admin/stats stats
6、#以上都不满足的时候使用默认mms_server的backend
default_backend mms
配置说明:
###########全局配置#########
global
log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]
log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug]
daemon #以后台形式运行harpoxy
nbproc 1 #设置进程数量
maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
#user haproxy #运行haproxy的用户
#group haproxy #运行haproxy的用户所在的组
#pidfile /var/run/haproxy.pid #haproxy 进程PID文件
#ulimit-n 819200 #ulimit 的数量限制
#chroot /usr/share/haproxy #chroot运行路径
#debug #haproxy 调试级别,建议只在开启单进程的时候调试
#quiet
########默认配置############
defaults
log global
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog #日志类别,采用httplog
option dontlognull #不记录健康检查日志信息
retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
#option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
#option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 4096 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000 #心跳检测超时
#timeout http-keep-alive10s #默认持久连接超时时间
#timeout http-request 10s #默认http请求超时时间
#timeout queue 1m #默认队列超时时间
balance roundrobin #设置默认负载均衡方式,轮询方式
#balance source #设置默认负载均衡方式,类似于nginx的ip_hash
#balnace leastconn #设置默认负载均衡方式,最小连接数
########统计页面配置########
listen stats
bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
mode http #http的7层模式
option httplog #采用http日志格式
#log 127.0.0.1 local0 err #错误日志记录
maxconn 10 #默认的最大连接数
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
stats auth Frank:Frank #设置监控页面的用户和密码:Frank
stats hide-version #隐藏统计页面上HAProxy的版本信息
stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)
########设置haproxy 错误页面#####
#errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
#errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
#errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
#errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
#errorfile 504 /home/haproxy/haproxy/errorfiles/504.http
########frontend前端配置##############
frontend main
bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
acl web hdr(host) -i www.abc.com #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则,。
acl img hdr(host) -i img.abc.com #如果访问img.abc.com这个域名,就触发img规则。
use_backend webserver if web #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。
use_backend imgserver if img #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。
default_backend dynamic #不满足则响应backend的默认页面
########backend后端配置##############
backend webserver #webserver作用域
mode http
balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3
server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3
#cookie 1表示serverid为1,check inter 1500 是检测心跳频率
#rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
backend imgserver
mode http
option httpchk /index.php
balance roundrobin
server img01 192.168.137.101:80 check inter 2000 fall 3
server img02 192.168.137.102:80 check inter 2000 fall 3
backend dynamic
balance roundrobin
server test1 192.168.1.23:80 check maxconn 2000
server test2 192.168.1.24:80 check maxconn 2000
listen tcptest
bind 0.0.0.0:5222
mode tcp
option tcplog #采用tcp日志格式
balance source
#log 127.0.0.1 local0 debug
server s1 192.168.100.204:7222 weight 1
server s2 192.168.100.208:7222 weight 1
haproxy监测页面参数解释:
Queue
Cur: current queued requests //当前的队列请求数量
Max:max queued requests //最大的队列请求数量
Limit: //队列限制数量
Session rate(每秒的连接回话)列表:
scur: current sessions //每秒的当前回话的限制数量
smax: max sessions //每秒的新的最大的回话量
slim: sessions limit //每秒的新回话的限制数量
Sessions
Total: //总共回话量
Cur: //当前的回话
Max: //最大回话
Limit: //回话限制
Lbtot: total number of times a server was selected //选中一台服务器所用的总时间
Bytes
In: //网络的字节数输入总量
Out: //网络的字节数输出总量
Denied
Req: denied requests//拒绝请求量
Resp:denied responses //拒绝回应
Errors
Req:request errors //错误请求
Conn:connection errors //错误的连接
Resp: response errors (among which srv_abrt) ///错误的回应
Warnings
Retr: retries (warning) //重新尝试
Redis:redispatches (warning) //再次发送
Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk: 持续检查后端服务器的时间
Wght: (weight) : 权重
Act: server is active (server), number of active servers (backend) //活动链接数量
Bck: server is backup (server), number of backup servers (backend) //backup:备份的服务器数量
Down: //后端服务器连接后都是down的数量
Downtime: downtime: total downtime (in seconds) //总的downtime 时间
Throttle: warm up status //设备变热状态
Haproxy的安装和配置
Desktop1:172.25.68.1
Desktop2:172.25.68.2
Desktop3:172.25.68.3
真机:172.25.68.250
在desktop1和desktop2上
yum install haproxy -y
cd /etc/haproxy
/etc/init.d/nginx stop
/etc/init.d/haproxy start
编辑vim haproxy.cfg
listen westos *:80
balance roundrobin
server web1 172.25.68.1:80 check
server web2 172.25.68.2:80 check
/etc/init.d/haproxy reload
desktop3:
yum install httpd
编辑 vim /var/www/html/index.html
Desktop3.example.com
/etc/init.d/httpd start
测试:输入172.25.68.250:80
在desktop1上修改
编辑 vim haproxy.cfg
listen admin 172.25.68.250:8080
stats enable
stats uri /status
stats auth admin:westos
stats refresh 5s
listen westos 172.25.68.250:80
balance roundrobin
server web1 172.25.68.1:80 check
server web2 172.25.68.2:80 check
/etc/init.d/haproxy reload
测试: 172.25.68.250:8080/status 任意关闭开启desktop1和desktop2的http服务 注意观察颜色变化
动静分离:
desktop1:
编辑vim /etc/haproxy/haproxy.cfg
listen admin 172.25.68.250:8080
stats enable
stats uri /status
stats auth admin:westos
stats refresh 5s
frontend westos 172.25.68.250:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png
use_backend static if url_static
default_backend app
backend static ##静态
balance roundrobin
server web1 172.25.68.2:80 check
backend app ##动态
balance roundrobin
server web2 172.25.68.1:80 check
/etc/init.d/haproxy reload
Desktop2
cd /var/www/html
mkdir images
cd images
拷贝OSI.gif,redhat.jpg到该目录
测试:172.25.68.250/images/redhat.jpg 或者 172.25.68.250/images/OSI.gif
访问权限的设置
desktop1:
编辑vim /etc/haproxy/haproxy.cfg
listen admin 172.25.68.250:8080
stats enable
stats uri /status
stats auth admin:westos
stats refresh 5s
frontend westos 172.25.68.250:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png
acl badhost src 172.25.68.2
block if badhost
use_backend static if url_static
default_backend app
/etc/init.d/haproxy reload
测试: 172.25.68.250 报错403
修改默认端口:编辑vim /etc/httpd/conf/httpd.conf
135 #Listen 12.34.56.78:80
136 Listen 8000
编辑vim /var/www/html
维护中,表闹........
/etc/init.d/httpd start
Desktop1:
编辑vim /etc/haproxy/haproxy.cfg
listen admin 172.25.68.250:8080
stats enable
stats uri /status
stats auth admin:westos
stats refresh 5s
frontend westos 172.25.68.250:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png
acl badhost src 172.25.68.2
# block if badhost
errorloc 403 http://172.25.68.2:8000
use_backend static if url_static
default_backend app
backend static
balance roundrobin
server web1 172.25.68.2:80 check
backend app
balance roundrobin
server web2 172.25.68.1:80 check
server local 172.25.68.250:8000 backup
/etc/init.d/haproxy reload
测试:172.25.68.250
安装haproxy
1、安装
[root@localhost ~]# yum -y install pcre-devel zlib-devel
[root@localhost ~]# tar -zxvf haproxy-1.4.24.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/haproxy-1.4.24/
[root@localhost ~]# make TARGET=linux26 PREFIX=/usr/local/haproxy
注意:linux26 是指linux 的内核版本号。
[root@localhost ~]# make install PREFIX=/usr/local/haproxy
2、配置haproxy
[root@localhost ~]# mkdir /etc/haproxy
[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy/
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
修改:
global
log 127.0.0.1 local0 //配置日志记录,local0 为日志设备,默认存放到系统日志
log 127.0.0.1 local1 notice //notice 为日志级别,通常有7 个级别
#log loghost local0 info
maxconn 4096 //默认最大连接数,需考虑ulimit-n 限制 :可增加ulimitn
819200 #ulimit 的数量限制
chroot /usr/share/haproxy //运行路径
uid 99
gid 99
#debug
#quiet
defaults
log global //定义日志为global 中的日志
mode tcp //模式为四层
option tcplog //采用http 的日志格式
option dontlognull //不记录健康检查日志信息
retries 3 //三次连接失败就认为是服务器不可用,也可以通过后面设置
#redispatch
maxconn 2000 //最大连接数
contimeout 5000 //连接超时时间
clitimeout 50000 //客户端超时时间
srvtimeout 50000 //服务端超时时间
listen stats
mode http
bind :6677
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
listen mysqlcluster 0.0.0.0:3306
balance roundrobin
server m1 192.168.56.202:3306 check port 3306 maxconn 300
server m2 192.168.56.203:3306 check port 3306 maxconn 300
注意:
如果启动时出现报错:/haproxy.main()] Cannot chroot(/usr/share/haproxy)
则手动创建:
[root@localhost ~]# mkdir /usr/share/haproxy
如果启动时出现报错:Starting proxy cacti: cannot bind socket
则执行:
[root@localhost ~]# sysctl -e net.ipv4.ip_nonlocal_bind=1
3、启动haproxy
[root@localhost ~]# ln -s /usr/local/haproxy/sbin/* /usr/sbin/ //注意软链接的目录
[root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init
/etc/init.d/haproxy
[root@localhost ~]# chmod +x /etc/init.d/haproxy
[root@localhost ~]# /etc/init.d/haproxy start
[root@localhost ~]# /etc/init.d/haproxy status
[root@localhost ~]# netstat -anp | grep haproxy //占用的也是TCP 的80 端口
[root@localhost ~]# chkconfig --add haproxy
[root@localhost ~]# chkconfig haproxy on
http://192.168.56.200:6677/haproxyadmin?stats 查看集群的状态
四、MySql 授权用户登录(集群内的mysql 都要授权)
mysql> GRANT ALL ON *.* TO 'root'@'192.168.56.%' IDENTIFIED BY 'redhat';
mysql> flush privileges;
五、测试:
[root@localhost ~]# mysql -u root -h 192.168.56.200 -p
登录两次分别查看
可增加keepalived
HAproxy简单概述
HAProxy是免费极速且可靠的用于为TCP和基于HTTP应用程序提供代理服务的解决方案。是工作在应用空间的程序,跟Nginx一样受限于套接字。且只类同于Nginx四层和七层代理服务器仅此而已。但更多用在web反向代理上!!!
HAProxy还可以将后端的服务器与网络隔离,起到保护后端服务器的作用。HAProxy的负载均衡能力虽不如LVS,但也是相当不错。而且由于其工作在7层,可以对http请求报文做深入分析,按照自己的需要将报文转发至后端不同的服务器(例如动静分离),这一点工作在4层的LVS无法完成。
其中一点点不同Nginx的是一个Master Worker模型负责接收用户请求,装载配置文件,平滑升级…但是更多的用户请求是通过worker来实现。而HAProxy是单一进程模型,支持多进程,但更多建议使用单一进程模型。使用单个进程直接响应用户多个请求,不启用子进程。也能够支持单进程巨大并发连接数,且必须支持事件驱动,如果不支持事件驱动,并发效率是可想而知。
HAproxy工作模式
HAProxy的工作模式一般有两种:
tcp模式:实例运行于TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查,只能以简单模式工作。此为默认模式,通常用于SSL、SSH、SMTP等应用。
http模式:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝。
注意:当实现内容交换时,前端和后端必须工作于同一种模式(一般都是HTTP模式),否则将无法启动实例。
工作模式可通过mode参数在default,frontend,listen,backend中实现定义。
两种模块分别是:通过mod_tcp来限定反代模式和mod_http来实现负载均衡
HAproxy程序环境:
配置文件:/etc/haproxy/haproxy.cfg
Unit File: haproxy.service
主程序:/usr/sbin/haproxy
配置文件分两部分组成:
global:全局配置段
进程及安全配置相关的参数
性能调整相关的参数
Debug相关的参数
proxies:代理配置段
defaults:为frontend, backend以及listen提供默认配置;
frontend:前端,相当于Nginx中的server{ ... };
backend:后端,相当于nginx中的upstream { ... };
listen:前后端的直接组合;
简单实现用haproxy实现后端主机代理,简单均衡
1、> vim /etc/haproxy.cfg 在haprxoy 10.1.15.40主机上修改以下内容
frontend main
bind *:80,*:8080
default_backend web
# static backend for serving up images, stylesheets and such
backend web
balance roundrobin
server web1 10.1.15.41:80 check
server web2 10.1.15.42:80 check
2、在后端两台主机安装httpd启动服务,给指定网页分别叫backend1和backend2
10.1.15.41
vim /var/www/html
10.1.15.42
vim /var/www/html
HAproxy相关配置参数全局段:
global配置参数:
进程及安全配置相关的参数:user/uid, group/gid, nbproc, ulimit-n, ca-base, …
log < address > [len < length >] < facility > [ max level [min level]]
定义日志相关配置属性address是日志服务器的地址, [len < length >]是每行日志记录的最大长度
举例:如何记录haproxy的日志呢?
1、 让haproxy服务器启用接收远程主机所传来的日志信息
2、 如果启用local2.,指明local2.日志记录于何处
3、如果启用日志,使用udp和tcp都可以,我们这里使用的udp,把注释去掉
vim /etc/rsyslog.conf 第一步
#Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
指明日志记录到哪里去 第二步
# Save boot messages also to boot.log
local2.* /var/log/haproxy.log
systemctl restart rsyslog.service,确保UDP 514端口被监听
[root@localhost log]# cat haproxy.log
Nov 12 13:26:24 localhost haproxy[23610]: 10.1.15.85:6703 [12/Nov/2016:13:26:24.829] main web/web1 0/0/0/3/3 200 280 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
性能调优相关参数
maxconn < number>:设定单haproxy进程的最大并发连接数;
maxconnrate < number>:设定单haproxy进程每秒所能接受的连接数;
maxsslconn < number>:设定单haproxy进程的ssl连接最大并发连接数;
maxsslrate < number>:单haproxy进程的ssl连接的创建速率上限;
spread-checks <0..50, in percent>
向后端主机做健康状态检测时,该如何散开检测机制
tune.bufsize < number> 缓冲池大小
tune.rcvbuf.client < number> 接收客户端请求时缓冲池大小
tune.rcvbuf.server < number> 接收后端服务器的响应时缓冲池大小
tune.sndbuf.client < number> 向客户端发送响应
tune.sndbuf.server < number> 向服务端发送请求
tune.ssl.cachesize < number> ssl的缓存大小
tune.ssl.lifetime < timeout> ssl的缓存会话的有效时长
Debugging:
debug 尽量输出详细信息
quiet 不输出详细信息
Userlists:定义用户、组及用户列表;
userlist < listname >
group < groupname > [users < user >,< user >,(…)]
user < username > [password|insecure-password < password >]
strong text[groups < group >,< group >,(…)]
Peers:把多个haproxy定义构建为同步集群
peer
peers
其它未尽详细的参数请参考官方帮助文档
**演示示例**
更改调度算法为source,把同一IP地址的请求将始终被调度至某特定的服务器
vim /etc/haproxy/haproxy.cfg
backend web
balance roundrobin //修改为source
server web1 10.1.15.41:80 check
server web2 10.1.15.42:80 check
systemctl reload haproxy.service
测试:http://19.1.15.40
更改调度算法为uri,把同一页面请求通过调度算法发往到后端指定服务器
vim /etc/haproxy/haproxy.cfg
backend web
balance roundrobin //修改为uri
server web1 10.1.15.41:80 check
server web2 10.1.15.42:80 check
for i in {1..10}; do echo "test page $i at BACKEND 1 " > /var/www/html/test$i.html; done
systemctl reload haproxy.service
测试:
for i in {1..10}; do curl http://10.1.15.40/test$i.html;done
结果:把同一个被请求到的页面始终发往到指定的后端服务器上
更改调度算法为hdr,把同一浏览器的请求,始终发往到后端指定服务器上
vim /etc/haproxy/haproxy.cfg
backend web
balance roundrobin //修改为hdr(User-Agent)
server web1 10.1.15.41:80 check
server web2 10.1.15.42:80 check
systemctl reload haproxy.service
测试:
for i in {1..10}; do curl http://10.1.15.40/test$i.html;done
结果:只要浏览器一样,请求始终被调度到指定后端服务器上
调整服务器的最大并发连接数,并启用stats页面做认证
定义并发数有两种方法:
一种,全局定义,一种默认定义
vim /etc/haproxy/haproxy.cfg
frontend main //在此下面定义maxconn 10000
bind * :80, * :8080
maxconn 10000
定义stats页面,在代理配置段四项中都可以定义
vim /etc/haproxy/haproxy.cfg
frontend main
bind :80,:8080
maxconn 10000 //最大并发连接数
stats enable // 开启stats页面
stats uri /admin?stats //自定义stats页面
default_backend web //默认的后端主机标识web
stats realm stats\ page\ area //开启认证界面
stats auth admin:admin //认证用户名密码
stats hide-version //隐藏版本信息
stats refresh 5s //指定stats页面5秒刷新一次
stats admin if TRUE //内建访问控制列表
测试:http://10.1.15.40/haproxy?stats
对后端服务器做健康状况检测
check为server的参数,可启动对此server执行健康状态的检测。check借助其额外的参数可实现更精细的监测机制。
inter < delay>:
健康状态检测的时间间隔,单位为毫秒,默认为2000,可以使用fastinter和downinter来根据服务器端状态优化此时间延迟
rise < count>:
健康状态检测中某离线的server从离线状态转换至正常状态需要成功检查的次数
fall < count>:
确认server从正常状态转换为不可用状态需要检查的次数
默认为传输层检测,即探测端口是否能响应。
需要执行应用层检测,则需要
httpchk, smtpchk, mysql-check, pgsql-check, ssl-hello-chk;
vim /etc/haproxy/haproxy.cfg
backend web //下面修改内容
balance roundrobin
server web1 10.1.15.41:80 weight 2 maxconn 5000 check inter 1 rise 1 fall 2
server web2 10.1.15.42:80 weight 1 maxconn 3000 check inter 1 rise 1 fall 2
测试:10.1.15.40/haproxy?stats
对后端服务器做加权轮询
vim /etc/haproxy/haproxy.cfg
backend web //在后端主机下列加入
balance roundrobin
server web1 10.1.15.41:80 check weight 2 maxconn 5000 cookie web1
server web2 10.1.15.42:80 check weight 1 maxconn 3000 cookie web2
systemctl reload haproxy.service
测试:
for i in {1..10}; do curl http://10.1.15.40/index.html;done
结果:权重weight,并发maxconn,指定的值cookie
注意:修改后端服务器的调度算法:一定要重启haproxy的服务,reload是不成功
基于cookie的session绑定
在响应报文中添加cookie信息,下一次的客户请求会带上这个cookie信息,服务器端根据cookie将请求始终定向至后端的某一台服务器,可用于保持session会话。
而cookie信息该怎么插入进来
rewrite: 重新改写原有的所有cookie
insert: 在原有cookie信息当中插入
prefix: 在原有cookie附加为前缀
举例:把基于浏览器的用户会话访问,对当前服务器讲第一次调度到某个主机,那么就调度某主机
vim /etc/haproxy/haproxy.cfg
backend web //在后端主机下列加入
balance roundrobin
cookie webserver insert nocache indirect
server web1 10.1.15.41:80 check weight 2 maxconn 5000 cookie web1
server web2 10.1.15.42:80 check weight 1 maxconn 3000 cookie web2
服务器第一次为某客户度挑选中的主机,会把webserver中的参数值赋值到web1上或者web2上
systemctl reload haproxy.service
测试:
for i in {1..10}; do curl http://10.1.15.40;done
[root@localhost haproxy]# curl -I 10.1.15.40
自定义haproxy错误页面
> vim /etc/haproxy/haproxy.cfg
> frontend main
bind *:80,*:8080
maxconn 10000
stats enable
default_backend web
stats realm stats\ page\ area
stats auth admin:admin
stats hide-version
stats refresh 5s
stats admin if TRUE
#errorfile 503 /etc/haproxy/errorfiles/503sorry.http //直接以文件形式显示错误页面
errorloc 503 http://10.1.15.40:9527/errorpagetest.html // 直接以url形式显示错误页面,重定向302
errorloc 503 http://www.baidu.com
mkdir /etc/haproxy/errorfiles
vim /etc/haproxy/errorfiles/503sorry/http
< h1 >sorry page home < h1 >
systemctl reload haproxy.service
测试:stop后端所有主机,然后请求haproxy前端主机地址 :10.1.15.40
option forwardfor
客户端的请求经前端的代理服务器转发至后端的web服务器,代理服务器在转发时将目标地址改为后端的某台web服务器地址,将源地址由client ip(客户端地址)改为自己面向后端服务器的地址。后端的web服务器若使用默认格式记录日志,则记录的客户端IP地址都为前端的代理服务器地址。这时需要在发往后端的请求报文中添加内容为客户端IP地址的首部,以便后端的web服务器能够正确获取客户端地址。
x-forwardfor
在配置文件默认段里已经定义了转发,所以我们直接用就可以了。
vim /etc/haproxy/haproxy.cfg
defaults
option forwardfor except 127.0.0.0/8
然后修改两台后端主机的httpd.conf文件,vim /etc/httpd/conf/httpd.conf
把LogFormat %h修改为{X-forwarded-For}i
重启服务systemctl restart httpd.service
在haproxy前端主机上刷新下页面。然后在后端主机看日志是否记录的是客户端的真实地址就可以。
tail /var/log/httpd/access.log看请求的是真实的客户端地址功能就实现了。
修改请求或响应报文首部相关:
增加响应报文相关信息
frontend main
rspadd X-Via:\ HAProxy/1,5
rspidel Server.*
rspadd X-Via:\ HAProxy/1,5
客户端请求看一看在Response Headers报文里有没有值:X-Via:HAProxy/1,5
删除响应报文Server相关信息
rspidel Server.*
ACL basics
HAPAroxy的ACL能够通过检测请求报文的首部、响应报文的内容或其他的环境状态信息作出转发决策,增强了其配置弹性。
配置分两步骤:首先定义ACL,即定义一个测试条件,再定义动作,即满足测试条件的情况下执行的某特定动作。
语法格式:
acl < aclname> < criterion> [flags] [operator] [< value>] …
取值类型:
– boolean
– integer or integer range
– IP address / network
– string (exact, substring, suffix, prefix, subdir, domain)
– regular expression
– hex block
匹配的操作符:数值匹配,字符串匹配,逻辑条件等…
注意注意:语法太多,让人很蛋疼,简直太头疼,咋么那么多
注意注意:自定义ACL全部都是小写
举例:四层匹配
vim /etc/haproxy/haproxy.cfg
在 frontend main 中定义
acl myhost src 10.1.15.85
acl myport dst_port 8080
block if !myhost myport
任何人试图去访问8080端口时,但不是来自于myhost主机就全部拒绝
举例:七层匹配
acl text_file path_end -i .txt
block if text_file
任何人去试图访问txt文件,结尾不区分大小写的全部拒绝
举例:匹配某个浏览器类型
acl chrome hdr_reg(User-Agent) -i .*chrome.*$
block if chrome
HTTP层访问控制指令
acl valid_method method GET HEAD
http-request deny if ! valid_method
举例:
acl myhost src 10.1.15.40
http-request deny if url_admin !myhost
动静分离
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 //如果上面的条件满足调至backend static主机
default_backend app //否则调至app主机
backend static
balance roundrobin
server static 127.0.0.1:4331 check
round robin balancing between the various backends
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