简介
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动**, **单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。
Yum安装
[root@haproxy ~]# yum install haproxy -y
haproxy的配置文件说明
haproxy的配置文件为/etc/haproxy/haproxy.cfg,主要有全局配置段global、代理配置段proxies组成。
配址各个负载的内核
[root@LB ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
[root@LB ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@LB ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
提供配置文件
mkdir /etc/haproxy
cat > /etc/haproxy/haproxy.cfg <<EOF
#--------------全局配置----------------
global
log 127.0.0.1 local0 info
#log loghost local0 info
maxconn 20480
#chroot /usr/local/haproxy
pidfile /var/run/haproxy.pid
#maxconn 4000
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
#common defaults that all the 'listen' and 'backend' sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option dontlognull
option httpclose
option httplog
#option forwardfor
option redispatch
balance roundrobin
timeout connect 10s
timeout client 10s
timeout server 10s
timeout check 10s
maxconn 60000
retries 3
#--------------统计页面配置------------------
listen admin_stats
bind 0.0.0.0:8189
stats enable
mode http
log global
stats uri /haproxy_stats
stats realm Haproxy\ Statistics
stats auth admin:admin
#stats hide-version
stats admin if TRUE
stats refresh 30s
#---------------web设置-----------------------
listen webcluster
bind 0.0.0.0:80
mode http
#option httpchk GET /index.html
log global
maxconn 3000
balance roundrobin
cookie SESSION_COOKIE insert indirect nocache
server web01 192.168.110.10:80 check inter 2000 fall 5
#server web01 192.168.110.10:80 cookie web01 check inter 2000 fall 5
EOF
haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global
,defaults
,frontend
,backend
,listen
- global: 全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关。
- default: 配置默认参数,这些参数可以被用到frontend,backend,Listen组件。
- frontend:接收请求的前端虚拟节点,frontend可以指定具体使用后端的backend。
- backend : 后端服务集群的配置,真实服务器,一个backend对应一个或者多个实体服务器。
- listen: fronted和backend的组合体,比如haproxy实例状态监控部分配置。Haproxy1.3之前的唯一配置方式。
时间格式
一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀
us
: 微秒(microseconds),即1/1000000秒;ms
: 毫秒(milliseconds),即1/1000秒;s
: 秒(seconds);m
: 分钟(minutes);h
:小时(hours);d
: 天(days);
global配置
通常主要定义全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关。
global
log 127.0.0.1 local3 #定义haproxy日志输出设置
log 127.0.0.1 local1 notice
#log loghost local0 info #定义haproxy 日志级别
ulimit-n 82000 #设置每个进程的可用的最大文件描述符
maxconn 20480 #默认最大连接数
chroot /usr/local/haproxy #chroot运行路径
uid 99 #运行haproxy 用户 UID
gid 99 #运行haproxy 用户组gid
daemon #以后台形式运行harpoxy
nbproc 1 #设置进程数量
pidfile /usr/local/haproxy/run/haproxy.pid #haproxy 进程PID文件
#debug #haproxy调试级别,建议只在开启单进程的时候调试
#quiet
- log:全局的日志配置,local0是日志输出设置,info表示日志级别(err,waning,info,debug);
- maxconn:设定每个HAProxy进程可接受的最大并发连接数,此选项等同于linux命令选项”ulimit -n”;
- chroot:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
- daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
- nbproc:指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
- pidfile:将haproxy的进程写入pid文件;
- ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;
defaults配置
用于设置配置默认参数,这些参数可以被用到frontend,backend,listen组件。
在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中。如果某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,defaults部分参数对应的值自动被覆盖。
defaults
log global #引入global定义的日志格式
mode http #所处理的类别(7层代理http,4层代理tcp)
maxconn 50000 #最大连接数
option httplog #日志类别为http日志格式
option httpclose #每次请求完毕后主动关闭http通道
option dontlognull #不记录健康检查日志信息
option forwardfor #如果后端服务器需要获得客户端的真实ip,需要配置的参数,可以从http header 中获取客户端的IP
retries 3 #3次连接失败就认为服务器不可用,也可以通过后面设置
stats refresh 30 #设置统计页面刷新时间间隔
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
balance roundrobin #设置默认负载均衡方式,轮询方式
#balance source #设置默认负载均衡方式,类似于nginx的ip_hash
#contimeout 5000 #设置连接超时时间
#clitimeout 50000 #设置客户端超时时间
#srvtimeout 50000 #设置服务器超时时间
timeout http-request 10s #默认http请求超时时间
timeout queue 1m #默认队列超时时间
timeout connect 10s #默认连接超时时间
timeout client 1m #默认客户端超时时间
timeout server 1m #默认服务器超时时间
timeout http-keep-alive 10s #默认持久连接超时时间
timeout check 10s #设置超时检查超时时间
-
mode http:设置haproxy的运行模式,有三种{http|tcp|health}。注意:如果haproxy中还要使用4层的应用(mode tcp)的话,不建议在此定义haproxy的运行模式。
- tcp模式:在此模式下,客户端和服务器端之前将建立一个全双工的连接,不会对七层报文做任何检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。
- http模式:在此模式下,客户端请求在转发至后端服务器之前将会被深度分板,所有不与RFC格式兼容的请求都会被拒绝。
- health:已基本不用了。
-
log global:设置日志继承全局配置段的设置。
-
option httplog:表示开始打开记录http请求的日志功能。
-
option dontlognull:如果产生了一个空连接,那这个空连接的日志将不会记录。
-
option http-server-close:打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录。
-
retries 3:向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用。
-
option abortonclose:当haproxy负载很高时,自动结束掉当前队列处理比较久的链接。
-
timout http-request 10s:客户端发送http请求的超时时间。
-
timeout queue 1m:当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中。timeout queue定义放入这个队列的超时时间。
-
timeout connect 5s:haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。
-
timeout client 1m:定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间。
-
timeout server 1m:定义haproxy与上游服务器非活动连接的超时时间。
-
timeout http-keep-alive 10s:设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源。
-
timeout check 10s:健康检测的时间的最大超时时间。
-
maxconn 3000:最大并发连接数。
-
contimeout 5000:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容。
-
clitimeout 3000:设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容。
-
srvtimeout 3000:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容。
frontend配置
frontend
是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend
组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend
可以根据ACL规则直接指定要使用的后端backend
。
frontend http_80_in
bind 0.0.0.0:80 #设置监听端口,即haproxy提供的web服务端口,和lvs的vip 类似
mode http #http 的7层模式
log global #应用全局的日志设置
option httplog #启用http的log
option httpclose #每次请求完毕后主动关闭http通道,HAproxy不支持keep-alive模式
option forwardfor #如果后端服务器需要获得客户端的真实IP需要配置此参数,将可以从HttpHeader中获得客户端IP
default_backend wwwpool #设置请求默认转发的后端服务池
- frontend http_80_in:定义一个名为http_80_in的frontend。
- bind 0.0.0.0:80:定义haproxy前端部分监听的端口。
- mode http:定义为http模式。
- log global:继承global中log的定义。
- option forwardfor:使后端server获取到客户端的真实IP。
backend配置
用来定义后端服务集群的配置,真实服务器,一个Backend对应一个或者多个实体服务器。
backend wwwpool #定义wwwpool服务器组。
mode http #http的7层模式
option redispatch
option abortonclose
balance source #负载均衡的方式,源哈希算法
cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义
option httpchk GET /test.html #心跳检测
server web1 10.1.1.2:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maxconn 8
listen配置
常常用于状态页面监控,以及后端server检查,是Fronted和backend的组合体。
listen admin_status #Frontend和Backend的组合体,监控组的名称,按需自定义名称
bind 0.0.0.0:8888 #监听端口
mode http #http的7层模式
log 127.0.0.1 local3 err #错误日志记录
stats refresh 5s #每隔5秒自动刷新监控页面
stats uri /admin?stats #监控页面的url访问路径
stats realm itnihao\ welcome #监控页面的提示信息
stats auth admin:admin #监控页面的用户和密码admin,可以设置多个用户名
stats auth admin1:admin1 #监控页面的用户和密码admin1
stats hide-version #隐藏统计页面上的HAproxy版本信息
stats admin if TRUE #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
启动 haproxy
//yum方式
systemctl start haproxy
//源码方式
#通过配置文件启动
haproxy -f /etc/haproxy/haproxy.cfg
启动日志
- HAproxy在默认情况不会记录日志
- 不仅要在haproxy.conf中配置日志输出
- 还需要修改系统日志的配置文件
修改 haproxy.conf
在haproxy.conf文件中增加如下日志配置,
defaults下面增加日志相关的配置:
defaults
log global
option httplog
log 127.0.0.1 local7
日志的级别为local0~local7,
另外16~23保留为本地使用:
修改系统日志配置
vim /etc/rsyslog.conf
指定日志文件haproxy.log保存的位置,
haproxy.log会自动生成:
$ModLoad imudp
$UDPServerRun 514
local7.* /root/haproxy/log/haproxy.log
由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听。
配置rsyslog的主配置文件,开启远程日志
vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r -m 0 -c 2"
参数说明:
#-r 开启远程日志
#-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能
#-c 2 使用兼容模式,默认是 -c 5
重启rsyslog服务
systemctl restart rsyslog
重启haproxy服务
ps -ef | grep haproxy
kill -9 PID
haproxy -f /usr/local/haproxy/conf/haproxy.cfg
haproxy的多线程设定
设置backup --- sorryserver的端口
disabled指定下线的后端服务器
haproxy热更新方法
socat命令
简介
socat是一个用于数据转发的命令行工具,它可以在两个端口之间建立虚拟通道,将数据从一个端口转发到另一个端口,同时支持很多网络协议。
socat支持的常用网络协议
TCP、UDP:传输层协议,用于网络通信。
SSL、TLS:安全传输协议,用于加密数据传输。
HTTP、HTTPS:应用层协议,用于 Web 服务。
SSH:安全 Shell 协议,用于远程登录和文件传输。
FTP、FTPS:文件传输协议,用于文件传输。
SCTP:传输层协议,用于流控制和数据传输。
ICMP:网络层协议,用于网络诊断和错误报告。
IPv4、IPv6:网络层协议,用于 IP 数据包的传输。
Unix 域套接字:本地通信协议,用于进程间通信。
Serial:串口通信协议,用于串口设备的数据传输。
socat命令的一些常用示例
#编辑配置文件
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
stats socket /var/lib/haproxy/stats mode 600 level admin
#查看haproxy的状态
[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats
Name: HAProxy
Version: 2.4.22-f8e3218
Release_date: 2023/02/14
Nbthread: 2
Nbproc: 1
Process_num: 1
Pid: 2104
Uptime: 0d 0h00m26s
Uptime_sec: 26
……
#查看集群状态
[root@haproxy ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_port srv_check_addr srv_agent_addr srv_agent_port
2 webcluster 1 web1 192.168.0.10 2 0 1 1 80 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
2 webcluster 2 web2 192.168.0.20 2 0 1 1 80 6 3 7 6 0 0 0 - 80 - 0 0 - - 0
2 webcluster 3 web_sorry 192.168.0.100 2 0 1 1 80 1 0 2 0 0 0 0 - 8080 - 0 0 - - 0
5 static 1 static 127.0.0.1 0 0 1 1 79 8 2 0 6 0 0 0 - 4331 - 0 0 - - 0
6 app 1 app1 127.0.0.1 0 0 1 1 79 8 2 0 6 0 0 0 - 5001 - 0 0 - - 0
6 app 2 app2 127.0.0.1 0 0 1 1 79 8 2 0 6 0 0 0 - 5002 - 0 0 - - 0
6 app 3 app3 127.0.0.1 0 0 1 1 79 8 2 0 6 0 0 0 - 5003 - 0 0 - - 0
6 app 4 app4 127.0.0.1 0 0 1 1 78 8 2 0 6 0 0 0 - 5004 - 0 0 - - 0
#查看集群的权重
[root@haproxy ~]# echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
@临时修改权重
[root@haproxy ~]# echo "set weight webcluster/web1 2" | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
2 (initial 1)
#下线后端服务器
[root@haproxy ~]# echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
#上线后端服务器
[root@haproxy ~]# echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
如果开启多进程的话,我们在对进程的sock文件进行操作时其对进程的操作是随机的。
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1
stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2
这样每个进程都会有单独的socket文件夹进行单独的管理
[root@haproxy ~]# ll /var/lib/haproxy/
total 0
srw-------. 1 root root 0 Aug 11 09:58 stats
srw-------. 1 root root 0 Aug 11 10:10 stats1
srw-------. 1 root root 0 Aug 11 10:10 stats2
HAProxy的调度算法
静态调度算法
static-rr
在listen或backend区域配置
balance static-rr
基于权重的轮询调度,不⽀持权重的运⾏时调整及后端服务器慢启动,其后端主机数量没有限制。weight默认为1。
listen web_host
bind 192.168.7.101:80,:8801-8810,192.168.7.101:9001-9010
mode http/tcp
log global
balance static-rr
server web1 192.168.7.103:80 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.7.104:80 weight 2 check inter 3000 fall 2 rise 5
first
在listen或backend区域配置
balance first
根据服务器在列表中的位置,⾃上⽽下进⾏调度,但是其只会当第⼀台服务器的连接数达到上限,新请求才会分配给下⼀台服务,因此会忽略服务器的权重设置。
如果有maxconn,则匹配maxconn的最大值。
listen web_host
bind 192.168.7.101:80,:8801-8810,192.168.7.101:9001-9010
mode http/tcp
log global
balance first
server web1 192.168.7.103:80 maxconn 2 weight 1 check inter 3000 fall 2 rise 5
server web2 192.168.7.104:80 weight 1 check inter 3000 fall 2 rise 5
动态调度算法
roundrobin
在listen或backend区域配置,该算法为默认算法
balance roundrobin
基于权重的轮询动态调度算法,可以使用socat动态调整权重。
HAProxy的roundrobin轮询模式不完全等于LVS的RR轮训模式,区别在于
①HAProxy中的roundrobin⽀持慢启动,新加的服务器会逐渐增加转发数;
②HAProxy每个后端backend中最多⽀持4095个real server;
③HAProxy⽀持对real server权重动态调整;
leastconn
在listen或backend区域配置,该算法为默认算法
balance leastconn
当前后端服务器连接最少的优先调度。
①支持加权的最少连接
②支持动态调整权重
③支持慢启动
其他调度算法
source
源地址hash,基于⽤户源地址hash并将请求转发到后端服务器。
第一种,默认为静态即取模⽅式;
第二种,可以通过hash-type⽀持的选项更改,动态即hash一致方式。
source之map-base取模法
mode http/tcp
balance source
取模法,基于服务器总权重的hash数组取模。
不⽀持在线调整权重;
不⽀持慢启动;
缺点:当服务器的总权重发⽣变化时,即有服务器上线或下线,都会因权重发⽣变化⽽导致调度结果整体改变。
例如,后端有三台服务器,每台服务器权重都为1,则总权重为3,haproxy给源地址做hash计算,hash_value%3。其中获取的值如果为0,发给第一台服务器;如果为1,发给第二台服务器;如果为2,发给第三台服务器。如果一台服务器坏掉了,其要在通过hash_value%3计算,因权重发⽣变化⽽导致调度结果整体改变。
source之一致hash法
mode http/tcp
balance source
hash-type consistent
⼀致性哈希,该hash是动态的。
⽀持在线调整权重;
⽀持慢启动;
优点:当服务器的总权重发⽣变化时,对调度结果影响是局部的,不会引起⼤的变动。
使用场景:在没有做session共享的情况下,想做会话保持。
uri
基于对⽤户请求的uri做hash并将请求转发到后端指定服务器。
uri之map-base取模法
在listen或backend区域配置
mode http
balance uri
uri之一致hash法
# curl http://192.168.7.101/app/index.html?name=NAME #单个参数访问
mode http
balance url_param name
hash-type consistent
# curl http://192.168.7.101/app/index.html?age=AGE
mode http
balance url_param age
hash-type consistent
# curl http://192.168.7.101/app/index.html?age=AGE&&name=NAME #多个参数访问
mode http
balance url_param name,age
hash-type consistent
url_param
url_param对⽤户请求的url中的params部分中的参数name(key)作hash计算,并由服务器总权重相除以后派发⾄某挑出的服务器。
通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个 real server
url = http://www.magedu.com/foo/bar/index.php?k1=v1&k2=v2
所以:
host = "www.magedu.com"
url_param = "k1=v1&k2=v2"
hdr
针对⽤户每个http头部(header)请求中的指定信息做hash,此处由name指定的http⾸部将会被取出并做hash计算,然后由服务器总权重相除以后派发⾄某挑出的服务器,假如⽆有效的值,则会使⽤默认的轮询调度。
举例:对header里的User-Agent字段(浏览器类型)做hash计算,同一个浏览器访问后端同一个服务器。
mode http
balance hdr(User-Agent)
hash-type consistent
random
在1.9版本开始增加⼀个叫做random的负载平衡算法,其基于⼀个随机数作为⼀致性hash的key,随机负载平衡对于⼤型服务器场或经常添加或删除服务器⾮常有⽤。
十种算法总结以及使用场景
静态:
static-rr--------->tcp/http #做session共享的web集群
first------------->tcp/http #使⽤较少
动态:
roundrobin-------->tcp/http
leastconn--------->tcp/http #数据库
random------------>tcp/http
取决于是否有hash_type consistent,有为动态,默认静态:
source------------>tcp/http #基于客户端公⽹IP的会话保持
uri--------------->http #缓存服务器,CDN服务商,蓝汛、百度、阿⾥云、腾讯
url_param--------->http
hdr--------------->http #基于客户端请求报⽂头部做下⼀步处理
rdp-cookie-------->tcp #很少使⽤
uri、url_param、hdr只有在mode为http的情况下才能取到值,如果mode为tcp,balance自动更改为roundrobin。
动态与静态最主要区别:可以用socat动态调整权重、支持慢启动功能。
haproxy的高级功能配置
基于 cookie 的会话保持
使用cookie
关键字来配置后端服务器基于 cookie 的会话持久连接
配置选项
cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [ preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ] name:cookie 的key名称,用于实现持久连接 insert:如果没有就插入新的cookie indirect:不会向客户端发送服务器已经处理过请求的cookie信息,间接 nocache:当client和hapoxy之间有缓存时,不缓存cookie
配置实例
listen web_host bind 192.168.32.204:80 mode http log global balance roundrobin cookie SERVER-COOKIE insert indirect nocache server web1 10.0.0.201:80 cookie web1 check inter 3000 fall 3 rise 5 server web2 10.0.0.202:80 cookie web2 check inter 3000 fall 3 rise 5
测试
[root@node3 ~]# curl --cookie "SERVER-COOKIE=web1" http://192.168.32.204/index.html web01 10.0.0.201 [root@node3 ~]# curl --cookie "SERVER-COOKIE=web2" http://192.168.32.204/index.html web02 10.0.0.202 #根据cookie的值来分配后端服务器
HAProxy状态页
启用状态页
状态页配置选项
stats enable #基于默认的参数启用stats page stats hide-version #隐藏版本 stats refresh <delay> #设定自动刷新时间间隔 stats uri <prefix> #自定义stats page uri,默认值:/haproxy?stats stats realm <realm> #账户认证时的提示信息,示例:stats realm : HAProxy\ Statistics stats auth <user>:<passwd> #认证时的账号和密码,可使用多次,默认:no authentication stats admin { if | unless } <cond> #启用stats page中的管理功能
状态页配置
listen stats bind :192.168.32.204:9999 stats enable #stats hide-version stats uri /haproxy-status stats realm HAPorxy\ Stats\ Page stats auth haadmin:123456 stats auth admin:123456 #stats refresh 30s #stats admin if TRUE
输入地址192.168.32.204:9999/haproxy-status
输入账号密码,进入了haproxy的状态页.
页面信息介绍
pid = 3698 (process #2, nbproc = 2, nbthread = 2) #pid为当前pid号,process为当前进程号, nbproc和nbthread为一共多少进程和每个进程多少个线程 uptime = 0d 0h00m08s #启动了多长时间 system limits: memmax = unlimited; ulimit-n = 131124 #系统资源限制:内存/最大打开文件数/ maxsock = 131124; maxconn = 65536; maxpipes = 0 #最大socket连接数/单进程最大连接数/最大管道数 maxpipes current conns = 1; current pipes = 0/0; conn rate = 1/sec #当前连接数/当前管道数/当前连接速率 Running tasks: 1/9; idle = 100 % #运行的任务/当前空闲率 active UP:#在线服务器 backup UP:#标记为backup的服务器 active UP, going down:#监测未通过正在进入down过程 backup UP, going down:#备份服务器正在进入down过程 active DOWN, going up:#down的服务器正在进入up过程 backup DOWN, going up:#备份服务器正在进入up过程 active or backup DOWN:#在线的服务器或者是backup的服务器已经转换成了down状态 not checked:#标记为不监测的服务器 active or backup DOWN for maintenance (MAINT) #active或者backup服务器人为下线的 active or backup SOFT STOPPED for maintenance #active或者backup被人为软下线(人为将weight改成0)
backend server信息
session rate(每秒的连接会话信息): Errors(错误统计信息): cur:每秒的当前会话数量 Req:错误请求量 max:每秒新的最大会话数量 conn:错误链接量 limit:每秒新的会话限制量 Resp:错误响应量 sessions(会话信息): Warnings(警告统计信息): cur:当前会话量 Retr:重新尝试次数 max:最大会话量R Redis:再次发送次数 limit: 限制会话量 Total:总共会话量 Server(real server信息): LBTot:选中一台服务器所用的总时间 Status:后端机的状态,包括UP和DOWN Last:和服务器的持续连接时间 LastChk:持续检查后端服务器的时间 Wght:权重 Bytes(流量统计): Act:活动链接数量 In:网络的字节输入总量 Bck:备份的服务器数量 Out:网络的字节输出总量 Chk:心跳检测时间 Dwn:后端服务器连接后都是DOWN的数量 Denied(拒绝统计信息): Dwntme:总的downtime时间 Req:拒绝请求量 Thrtle:server 状态 Resp:拒绝回复量
四层负载与七层负载
IP透传是web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。
四层IP透传配置
haproxy 配置: listen web_prot bind 192.168.32.204:80 mode tcp balance roundrobin server web1 10.0.0.201 send-proxy check inter 3000 fall 3 rise 5 nginx配置: server { listen 80 proxy_protocol; #listen 80; server_name 10.0.0.201; ......
七层IP透传配置
haproxy 配置: defaults option forwardfor 或者: option forwardfor header X-Forwarded-xxx #自定义传递IP参数,后端web服务器写X-Forwarded-xxx,如 果写option forwardfor则后端服务器web格式为X-Forwarded-For listen配置: listen web_host bind 192.168.32.204:80 mode http log global balance random server web1 10.0.0.201:80 weight 1 check inter 3000 fall 2 rise 5 server web2 10.0.0.202:80 weight 1 check inter 3000 fall 2 rise 5
web服务器日志格式配置
配置web服务器,记录负载均衡透传的客户端IP地址
#apache 配置: LogFormat "%{X-Forwarded-For}i %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User- Agent}i\"" combined #tomcat 配置: pattern='%{X-Forwarded-For}i %l %T %t "%r" %s %b "%{User-Agent}i"'/> #nginx 日志格式: log_format main '"$http_x_forwarded_For" - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ';
ACL
访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服 务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端 口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或 丢弃。
ACL配置选项
acl <aclname> <criterion> [flags] [operator] [<value>] acl 名称 匹配规范 匹配模式 具体操作符 操作对象类型
ACL-Name
acl image_service hdr_dom(host) -i img.magedu.com ACL名称,可以使用大字母A-Z、小写字母a-z、数字0-9、冒号:、点.、中横线和下划线,并且严格区分大小写,必 须Image_site和image_site完全是两个acl。
ACL-criterion
定义ACL匹配规范 hdr([<name> [,<occ>]]):完全匹配字符串,header的指定信息 hdr_beg([<name> [,<occ>]]):前缀匹配,header中指定匹配内容的begin hdr_end([<name> [,<occ>]]):后缀匹配,header中指定匹配内容end hdr_dom([<name> [,<occ>]]):域匹配,header中的domain name hdr_dir([<name> [,<occ>]]):路径匹配,header的uri路径 hdr_len([<name> [,<occ>]]):长度匹配,header的长度匹配 hdr_reg([<name> [,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配 hdr_sub([<name> [,<occ>]]):子串匹配,header中的uri模糊匹配 dst 目标IP dst_port 目标PORT src 源IP src_port 源PORT 示例: hdr(<string>) 用于测试请求头部首部指定内容 hdr_dom(host) 请求的host名称,如 www.magedu.com hdr_beg(host) 请求的host开头,如 www. img. video. download. ftp. hdr_end(host) 请求的host结尾,如 .com .net .cn path_beg 请求的URL开头,如/static、/images、/img、/css path_end 请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg 有些功能是类似的,比如以下几个都是匹配用户请求报文中host的开头是不是www: acl short_form hdr_beg(host) www. acl alternate1 hdr_beg(host) -m beg www. acl alternate2 hdr_dom(host) -m beg www. acl alternate3 hdr(host) -m beg www.
ACL-flags
ACL匹配模式 -i 不区分大小写 -m 使用指定的pattern匹配方法 -n 不做DNS解析 -u 禁止acl重名,否则多个同名ACL匹配或关系
ACL-operator
ACL 操作符 整数比较:eq、ge、gt、le、lt 字符比较: - exact match (-m str) :字符串必须完全匹配模式 - substring match (-m sub) :在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配 - prefix match (-m beg) :在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配 - suffix match (-m end) :将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行匹配 - subdir match (-m dir) :查看提取出来的用斜线分隔(“/”)的字符串,如果其中任何一个匹配,则ACL进 行匹配 - domain match (-m dom) :查找提取的用点(“.”)分隔字符串,如果其中任何一个匹配,则ACL进行匹配
ACL-value
value的类型 The ACL engine can match these types against patterns of the following types : - Boolean #布尔值 - integer or integer range #整数或整数范围,比如用于匹配端口范围 - IP address / network #IP地址或IP范围, 192.168.0.1 ,192.168.0.1/24 - string--> www.magedu.com exact –精确比较 substring—子串 suffix-后缀比较 prefix-前缀比较 subdir-路径, /wp-includes/js/jquery/jquery.js domain-域名,www.magedu.com - regular expression #正则表达式 - hex block #16进制
ACL调用方式
ACL调用方式: - 与:隐式(默认)使用 - 或:使用“or” 或 “||”表示 - 否定:使用“!“ 表示 示例: if valid_src valid_port #与关系,A和B都要满足为true if invalid_src || invalid_port #或,A或者B满足一个为true if ! invalid_src #非,取反,A和B哪个也不满足为true
ACL的实例
ACL示例-基于源IP或子网调度访问
将指定的源地址调度至指定的web服务器组。
ACL示例-基于源地址的访问控制
拒绝指定IP或者IP范围访问
ACL示例-匹配浏览器类型
匹配客户端浏览器,将不同类型的浏览器调动至不同的服务器组
ACL示例-基于文件后缀名实现动静分离
ACL-匹配访问路径实现动静分离
ACL示例-基于ACL的HTTP访问控制
haproxy中https实现
haproxy 可以实现 https 的证书安全 , 从用户到 haproxy 为 https, 从 haproxy 到后端服务器用 http 通信。但基于性能考虑 , 生产中证书都是在后端服务器比如 nginx 上实现。
#配置HAProxy支持https协议,支持ssl会话;
bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE
#指令 crt 后证书文件为PEM格式,需要同时包含证书和所有私钥
cat demo.key demo.crt > demo.pem
#把80端口的请求重向定443
bind *:80
redirect scheme https if !{ ssl_fc }
证书制作
haproxy ~]# mkdir /etc/haproxy/certs/
haproxy ~]# openssl req -newkey rsa:2048 \
-nodes -sha256 –keyout /etc/haproxy/certs/timinglee.org.key \
-x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt