第一节
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 类似于nginx功能
官方网站:http://cbonte.github.io/haproxy-dconv/
HAproxy服务器ip:192.168.1.102(这里若隐藏后端服务器的ip,这需要设定两个ip,一个公网,一个私网)
后端服务器:192.168.1.104 192.168.1.105
再 后端服务器安装http服务
yum install http -y
设定一个网站:
# vim /var/www/html/index.html
<h1>server 1 </h1>
systemctl start httpd.service 启动服务
2 在haproxy 端设置
安装haproxy
yum install haproxy –y
rpm -ql haproxy 查看安装后产生的一些目录文件
配置文件:/etc/haproxy/haproxy.cfg
1 全局配置段 global (设置自己的特性)
进程及安全配置
性能参数配置
2 代理配置段 proxy 几段配置段有
default: 提供默认配置
frented: 对前端服务器的配置
backend: 对后端服务器的配置
listen:设定两者是一一对应的,这段同时拥有前端和后端的配置
日志:它本身没有日志功能,日志需要rsyslog日志服务来配合
日志设定: log 127.0.0.1 local2 指定本地日志服务器local2
这需要在rsyslog配置文件中做配置
vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514 基于udp
local2.* /var/log/boot.log
重启日志服务器:systemctl restart rsyslog.service
haproxy配置文件:
(:.,$s@^[^#]@#&@g )
启动服务:systemctl start haproxy.service
curl http://192.168.1.102 访问测试
负载均衡:
backend websrvs
balance roundrobin 轮询
server srv1 192.168.1.104:80 check
server srv2 192.168.1.105:80 check
重启服务: # systemctl restart haproxy.service
访问: curl http://192.168.1.102
在global 设置参数
1 chroot: 与安全相关
2 ca-base 若基于ssh回话的ca认证相关
3 cpu-wap cpu绑定类似于nginx的worker进程与cpu的绑定
4 log 指定日志
5 maxconn 最大单进程并发连接数
6 maxconnrate 速率
7 noepoll 不使用epoll机制
第二节参数配置
1 bind :用于来指定监听的地址和端口 配置在frontend 和listen段之中
监听在80端口
bind :443 ssl crt /etc/haproxy/site.pem
2 balance 用于后端服务器的调度算法
几种调度算法有:
1) roundrobin 轮询是动态的,指这种算法支持权重的运行时调度,
同时支持man启动(man启动是指,当在后端轮询的服务器中,再添加一个服务器,他会慢 慢的将前两台服务器上的请求慢慢移到这台上,不会一下子一堆的请求,否则容易将服务器瞬 间压死)
2) static-rr 是静态轮询调度,不支持权重运行时调度, 不支持man启动
3)leastconn最小连接 加权最小连接,计算后端服务器连接数时,要先除以它的权重得到的最小数将处理下一次请求
4)first :请求会先请求第一台,把第一台服务器请求满了,才会请求第二台
5)source 原地址哈希
3 hash-type 哈希类型有两种
1 取模法 : 是指将后端服务器按照权重虚拟为多个节点,当请求的哈希值对应第几个节点,就对应做映射
缺点:一但服务器的位置发生变动,它会影响全局的取模结果
2 一致性哈希:服务器变动只会影响局部
4 uri :是指不管前端的那个客户端请求,只要访问相同的uri就分发给同一台服务器上
5 uri_param 基于paraneter 绑定,将同一个key的值发往到同一个服务器上
6 hdr (<name>)将http首部的名称做哈希计算,将相同的发往相同的服务器上
如 hdr(cookie) 是基于cookie做绑定
举例:
1 基于first
backend websrvs
balance first
server srv1 192.168.1.104:80 check maxconn 3
server srv2 192.168.1.105:80 check
压测:ab -c 10 -n 10000 http://192.168.1.102
for I in {1..10} ; do curl http://192.168.1.102; done
用 uri
backend websrvs
balance uri
server srv1 192.168.1.104:80 check
server srv2 192.168.1.105:80 check
hash-type consistent
7 compression 压缩
compression algo gzip 压缩算法
compression algo deflate
compression type <text/html> 只对那些类型做压缩
8 server 用于backend 后端中指定后端主机,后面可以跟相应的参数
1) backup 指备用
2)check 健康检测 默认是向服务器对应端口做健康检查
检查的方法有:
addr:检测使用ip地址
port:针对端口检测
inter <delay> 连续两次的检测之间的时间间隔默认为2000ms
rise <count> 连续检测多少次,结果成功则服务器标记ok 默认2次
fall <count> 连续检测多次,结果为失败,则标记不可用默认3次
option httpchk 对http主页进行检测
option httpchk OPTIONS * HTTP/1.1 \r\nHost:\ www
查看日志:
tail -f /var/log/httpd/access.log
9 maxconn 最大并发连接数
10 maxqueue 队列,:若一个服务器最大请求是3000 ,当有3500是将多的500暂存于队列中
11 minconn 最小连接,当设定了最小连接,他的最大连接是动态计算得出的
12 no-error : 在后端服务器故障时的策略
fastinter :快速探测
fail-check: 故障检测
sudden-death: 告知故障
mark-down:标记为不可用
13 no-mark-down: 标记为不可用的操作
shutdown-sessions: 将之前的该服务器上的所有请求切断
14 no-mark-up: 当服务器标记为可用是操作
15 redir :重定向 访问时转接到百度
16 weight 权重
第三节统计接口启用相关参数
stats enable 启用统计页
访问http://192.168.1.102/haproxy?stats
stats值设定:
stats uri : /haproxy?stats
stats realm : haproxy 认证提示信息
stats auth : no authentication
stats scope: no restriction
stats admin 条件设定
mode 定义haproxy的工作模式
tcp:基于layer4实现代理代理mysql,ssh,ssl等协议
http:仅当http协议代理用
health: 工作健康状态的响应模式,当连接请求到达时回应ok后即断开连接
如:定义一个ssh协议的调度
ssh root@192.168.1.102 -P 22322
会话绑定机制:会话绑定几种方法
session sticky:
1) hash :
source ip 原地址hash
cookie 基于cookie的绑定
uri 基于uri,相同的uri 访问相同的服务器
2) 会话集群
3)会话服务器 memcached redis
haproxy 基于cookie的会话绑定,定义在backend listen 段中
键值对:在请求报文的cookie中插入建 在后对找到cookis对应的值进行绑定
rewrite:重写cookie
insert: 插入值
errorfile :自定义错误页面只能针对响应码为(200 ,400,403,408 ,500,502 ,503 ,504)
如:errorfile 400 /etc/haproxy/errorfiles/400@badreq.http 本地一个路径
errorloc :基于uri 定义 可以定义在frontend backend listen
如: errorloc 403 http://www.magedu.com/error_pagrs/403.html
reqadd 向请求报文中添加首部
reqadd x-proxy-By:\ haproxy
rspadd 向响应报文中添加首部
rspadd x-proxy-By:\ haproxy
reqdel 向请求报文中删除
rspdel 响应报文中删除
rspdel ^server: .* 删除以server开头的所有的
第四节参数配置
连接超时时长设定:
timeout client <timeout>: 客户端的超时时间,这指tcp的连接
timeout server <timeout>:服务端的超时时长
timeout http-keep-alive <timeout> :持久连接的持久时长
timeout http-request <timeout> 请求报文的连接时长,
timeout connect <> 创建链接的超时时长,连接后端
timeout client-fin <> : 面向客户端半关闭连接的超时时长
timeout server-fin <> : 面向服务端半关闭连接的超时时长
访问控制匹配后操作:
use_backend <backend> [if | unless] <condtion>当符合条件使用指定的backen
block : 拒绝某些连接请求
1 基于7层的http访问控制
http-request {allow | deny} [ {if | unless } <condition>]
2 基于4层的访问控制
tcp-request connection {accept | reject } [ {if |unless } <condition>]
如:
acl invalid_src src 172.168.1.104 定义一个acl
blocl if invalid_src 将acl的定义拒绝
errorfile 403 /etc/fstab 给它一个错误页
如:ssh的访问控制:
listen ssh
bind :22022
balance leastconn
acl incalid_src src 192.168.1.104
tcp-request connection reject if incalid_src
mode tcp
server sshsrvs1 192.168.1.104:22 check
server sshsrvs2 192.168.1.105:22 check
acl 控制定义
acl <name> <criterion> [flags] [operation] [<value>]
criterion: 检查内容条件:
dst: ip 目标ip
dst-conn 目标 主机上套接字连接数
dst_port 目标端口
src:ip 源ip地址
src_port 源端口
flags:
-i:忽略大小写
-n 禁止ip地址反解
-u : acl名不能重复
operation:
eq ge gt le lt
value :
boolean:布尔值
ip address / network : ip地址
string : 字符串
integer or interger range 整数 或整数范围
如:
acl allowstats src 192.168.1.104
http-request allow if allowstats
acl all src 0.0.0.0/0.0.0.0
http-request deny if all
path 基于path的匹配
path /imgs/logos/logo.jpg 精确匹配这个路径
path_beg /imgs 以imgs 开头的都匹配
path_end .jpg 以jpg结尾的都匹配
path_sub logos 子串匹配
path_dir logos/logo.jpg 子路径匹配
path_req ^/imgs/.* 以正则匹配模式匹配
path_len 字符串长度匹配
如 acl statis path_end .jpg .png
http-request allow if statis
url 的配置与path类似但它包含的信息更多
hdr 匹配报文的某个首部
如: acl bad.browsers hdr_reg (user-agent) .*curl.* 当首部包含curl 以curl名访问拒绝
block if bad.browers
haproxy example config 配置文档实例