快速安装入门
1、安装
1. 安装
[root@lb01 ~]# yum install haproxy -y
2. 配置文件
要与Nginx进行比较
Nginx:
server {} 前端
upstream {} 后端
proxy_pass 关联前端和后端
haproxy:
frontend 定义前端(接收用户请求)
backend 后端(定义集群节点)
use_backend 关联前端和后端
default_backend 默认调取到后端(在use中可以做if判断,如果不匹配,走默认)
listen 实现前端加后端的操作(其实就是反向代理,只能代理后端一台)
3. 配置场景
1. 监听所有接口的80端口上http proxy服务
1.1 将请求本机的80服务,转发到webserver后端节点
1.2 后端webserver 资源池定义172.16.1.7 172.16.1.8 两台节点
1.3 调度方式采用轮询调度
'写法:
frontend www(就是一个名称)
bind *:80 监听在80端口
mode http 使用的是http协议
default_backend web_servers 将所有的请求都调度到webservers这个集群节点,因为它是默认的
backend web_servers 定义后端节点
balance roundrobin 采用的调度算法是轮询的方式
server web01 10.0.0.7:80 check 定义的后端节点,名称+端口 健康检查
server web02 10.0.0.8:80 check 定义的后端节点,名称+端口 健康检查
2. 监听所有接口的80端口上http proxy服务
2.1 将请求本机的80端口服务,url为/的默认发到webservers后端集群
2.2 将请求本机的80端口服务,url为/1.png|/2.gif的默认发到static后端集群
2.3 后端webservers 资源池定义了172.16.1.7:80 172.16.1.8:80
2.4 后端static 资源池定义了172.16.1.9:80 172.16.1.10:80
2.5 调度算法采用轮询
'写法'
frontend www
bind *:80
mode http
acl url_static path_end -i .gif .png
`acl 定义匹配规则,(固定格式,相当于Nginx的localtion)
`url_static 是取的名字
`path_end 以什么结尾的
`-i 忽略大小写
`.gif .png 以这些后缀结尾
use_backend static if url_static
`定义之后,做判断,如果符合上边的定义,就走哪一个后端的集群节点
default_backend webservers
`表示,如果上边的判断不成立的,都直接走默认,成立了就直接走成立的
backend webservers
balance roundrobin
server web01 10.0.0.7:80 check
server web02 10.0.0.8:80 check(放在这里是4层的检查,只检查端口)
backend static
balance roundrobin
server web03 10.0.0.9:80 check
server web04 10.0.0.10:80 check
3. 监听在所有接口的80端口上,http proxy服务
3.1 将请求本机的80端口服务,直接代理到后端的172.16.1.7:80
3.2 无需采用负载均衡,与Nginx的代理一致
'写法':就是一个反向代理
listend www 前端+后端
bind *:80 使用80端口
server web01 172.16.1.7:80 直接找后端的web01这台节点
2、全局配置文件
global settings 是全局配置,用于设定全局配置参数
global
local2.* /var/log/haproxy.log
log 127.0.0.1 local2 '日志通过rsyslog进行记录
chroot /var/lib/haproxy '工作目录
pidfile /var/run/haproxy.pid 'pid文件路径
maxconn 4000 '设定每个haproxy进程所接受最大并发连接
user haproxy '运行用户
group haproxy '运行组
daemon '通过后台模式运行
stats socket /var/lib/haproxy/stats
# 是后期动态管理haproxy的一个socket文件
nbpro <number> '指定启动haproxy进程个数,默认只启动一个进程
node: '定义当前节点的名称,用于ha场景中多haproxy进程共享同一个ip地址
description: '当前实例的描述信息
maxpipes<number>:'haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每次进程所允许使用的最大pipe个数
spread-checks<0..50,in percent> '在haproxy后端有很多的服务器,如果在同一时间发起健康检查的话,是会出现意外的问题,这个选项就可以让他们不再同一时间进行健康检查,有一个先后顺序。
时间格式:'一般以毫秒为单位,也可以做转换us,ms,s,m,h,d
1s=1000ms (毫秒)
1ms=1000us(微妙)
3、默认配置文件
defaults 段用于为所有其他配置端提供默认参数
1. mode 设置haproxy实例运行协议
`tcp:对四层,用于ssl ssh MySQL`
`http:对七层,客户端请求服务端,服务端重新封装请求报文,请求后端真实节点`
`在listen中是tcp`
`在frontend中是http`
2. bind 设置haproxy实例运行端口
`bind *:80/8899-9090`
`*/0.0.0.0:将监听当前系统的所有ipv4地址`
`80:可以是一个特定的tcp端口,也可以一个端口范围`
'事例:
frontend www
bind *:80
mode http
default_backend web_servers
backend web_servers
balance roundrobin
server web01 172.16.1.7:80 check
server web02 172.16.1.8:80 check
3. log global '日志记录格式
为每一个实例启用事例和流量日志,因此可用在所有区段,每个实例最多可以指定两个log
'日志一般都是在全局中定义,在默认中调用。
'并且要开启rsyslog配置后重启,才能调用'
[root@lb01 /etc/haproxy]# vim /etc/rsyslog.conf
$ModLoad imudp 开启
$UDPServerRun 514 开启
local2.* /var/log/haproxy.log 配置
[root@lb01 /etc/haproxy]# systemctl restart haproxy.service rsyslog.service
测试:[root@lb01 /etc/haproxy]# cat /var/log/haproxy.log
Jan 17 16:56:21 localhost haproxy[2982]: 10.0.0.5:34922 [17/Jan/2021:16:56:21.306] www web_servers/web01 0/0/0/0/0 200 237 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
4. maxconn 3000 前端最大并发连接数
它只能在frontend defaults 区段,对于大型站点,可以提高此值,从而避免无法应答的用户请求,但也是不能超过global段中定的值
5. server 为后端声明一个节点信息的,所以只能用在backend层
实例:server name ip:port param
`关于paam:
5.1 backup 设定为备用服务器,在负载均衡场景,所有正常的server均不可用的时候,就会被顶替服务
'server web02 172.16.1.8:80 backup
5.2 check 对此server进行tcp健康检查,可以借助于option httpchk(七层的健康检查)的参数完成更精细化设定
'server web02 172.16.1.8:80 check port 80 (检查的是tcp的80端口,并且也可以检查其他端口,比如22.)
5.3 inter 设定健康状态检查的时间间隔,单位毫秒。默认2000毫秒
' server web02 172.16.1.8:80 check inter 3000 (可以调整)
5.4 rise 设置死去的节点转为正常节点需要进行几次的成功检查
' server web02 172.16.1.8:80 check inter 3000 rise 2
5.5 fall 设置正常节点转为死亡节点需要进行几次的检查
' server web02 172.16.1.8:80 check inter 3000 rise 2 fall 3
5.6 maxconn 指定此服务器接受的最大并发连接数,如果发往此服务器连接数高于指定的值,就会进入队列等待。(只对应节点,如果放在backend,就是针对整个集群里所有主机)
' server web02 172.16.1.8:80 check inter 3000 rise 2 maxconn 3000
5.7 maxqueue 设置请求队列的最大长度,当请求超过了maxconn,就会进入排队,排队也不能无限排,也是由长度限制的。
'节点总共能处理的并发连接数之和不能超过global设定的maxconn'
' server web02 172.16.1.8:80 check inter 3000 rise 2 maxconn 3000 maxqueue 200
5.8 weight 服务器节点权重 默认为1 最大值是256 0表示不参与负载均衡
' server web02 172.16.1.8:80 check inter 3000 rise 2 maxconn 3000
maxqueue 200 weight 2
5.9 cookie 在backend服务器启动cookie功能,haproxy会将请求的后端服务器定义的serverid插入到客户端的cookie中,来保持会话的持久性,需要同时设置server指令中cookie选项
需要配合defaults中的redispatch开启配合使用。这样就会进行自动切换节点
defaults—option参数
1. option httplog '启用记录http请求,会话状态和计时器功能
clf;使用clf格式来代替haproxy默认的http格式,通常在使用clf格式的特定日志分析器时才需要使用此格式
httplog: 该参数会记录非常详细的日志,通常会包含但不限制与HTTP请求,连接计时器,会话保持,连接数,捕获的首部及cookie,frontend,backend等
2. option dontlognull '不记录健康检查的日志信息
3. option http-server-close '服务端主动关闭连接
4. option forwardfor except(除了什么剩下都追) 127.0.0.0/8 '传递真实的ip
在经过haproxy往后端节点发送请求时,记录的是haproxy这台ip,所以需要开启,来达到传达真实ip,这样haproxy可以往每一个服务器发送请求时添加在头部,value值就是客户端的ip
option forwardfor 【except<network>】【header <name>】【if-none】
<network>:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能
<name>:可选,当可使用一个自定义首部,做代替。有的web服务器就需要一个特殊的首部
if-none:仅在此首部不存在时才会将其添加至请求报文中
5. option redispatch '当找不到cookie对应服务器,就会重新分配节点给客户端,可以如果不开启这个参数,那么当一个节点挂了,也不会进行重新分配,就会造成打不开站点。
6. option httpchk 基于http层来做健康检查,只会返回2xx 3xx才会认识是健康的,其余状态都认为是不健康的,如果不设置,默认是tcp做健康检查。只要建立tcp就是健康
6.1.通过监听端口进行健康检查,haproxy会去检查后端节点,但是不能保证高可用
mode http
balance roundrobin
option httpchk
server web01 172.16.1.7:80 check port 80
6.2.通过URL获取健康检查,通过获取GET后端的web界面,基本上可以代表后端服务的可用性
mode http
balance roundrobin
option httpchk GET /index.html
server web01 172.16.1.7:80 check port 80
6.3.通过request获取头部信息进行匹配,然后健康检查,将结果请求发送至后端节点,然后host进行匹配,以此来确定节点是否正常,注意:客户端请求会转发至后端的443端口
listen http_proxy 0.0.0.0:443
mode tcp
balance roundrobin
option httpchk HEAD / HTTP/1.1\r\nHost:\ 1vs.oldzhang.ciom
server web1 172.16.1.7:443 check port 80
server web2 172.16.1.8:443 check port 80
测试结果,日志中一定走的是7层协议
7.http-server-close
option http-server-close启用或禁用haproxy 到后端服务端长连接的功能。但客户端的长连接还保持,后续的每次请求后端服务都需要重新建立连接,每次响应后都关闭和后端的连接。启用该选项时, haproxy将会在转发给后端 server的request 数据包中添加一个"Connection:Close" 标记,后端server 看到此标记就会响应后关闭tcp连接
8. capture参数
capture {request/response} header 捕获并记录指定请求或响应首部最近一次出现时的第一个值,捕获的首部值使用花括号{}括起来后添加进日志中。如果需要捕获多个首部值,它们将以指定的次序出现在日志文件中,并以竖线"|"作为分隔符。不存在的首部记录为空字符串。最常需要捕获的首部有如下几个:
8.1.虚拟主机环境中使用的 Host字段
8.2.上传请求首部中的Content-length字段
8.3.快速区别真实用户和网络机器人的User-agent字段4.代理环境中记录真实请求来源的×-Forward-For字段
'语法:'
capture request header <name> len <length>
<name>: 要捕获的名称,不区分大小写,注意:记录在日志中是首部对应的值,而非首部名称
<length>:指定记录首部值时所记录的精确长度,超出部分将会被忽略
9.errorfile参数
Haprony 自定义错误页面有两种方式
第一种是由haproxy本机提供错误页面,通过errorfile参数来设定
第二种是将错误转到一个指定的url地址,通过errorcode参数来设定
defaults
errorfile 503 /opt/503.html
errorloc 503 https://www.kirin997.com/error/
10.reqadd 自定义报文
客户端client请求haproxy时,haproxy可以添加一些Header发往后端服务器
10.1.在 frontend 中使用reqadd,将发往后端集群的请求中添加一个 Header
[root@1b01 ~]# cat /etc/haproxy/haproxy.cfg
frontend main
bind *:88mode http
reqadd X-via:\ Haproxy-node1 '告诉后端,是哪个haproxy请求调度给你的'
use_backend webservers
[root@lb01 ~]# systemctl reLoad haproxy
10.2 修改nginx.conf 中logformat 添加"$http_x_via"
[root@web ~]#vim /etc/nginx/nginx.confhttp {
hhtp {
log_format main '$remote_addr - $remote_user [$time_local] "$request"
'$status $body_bytes_sent "$http_referer""
' "$http_user_agent" "$http_x_forwarded_for" "$http_x_via"";
}
[root@web ~]# systemctl reLoad nginx
10.3 再次访问,检查后端 Nginx日志,此时就能会看到是通过哪个调度器,调度到本机
172.16.1.5 --[27/Dec/2020:11:33:44] “GET / HTTP/1.1" 200 6 "-"“cur1/7.29.0" "Haproxy-Node1"
11.rspadd 在响应报文中添加指定首部(就是发往客户端)
11.1 在frontend中使用rspadd ,通过在响应header中添加字段,告诉客户端经过哪些代理服务
reqadd X-via:\ Haproxy-node1
rspadd via:\ Haproxy-2.0 '其实就是告诉客户端,谁代理的
rspdel Server:\ '这个可以删除后端节点的使用的服务
11.2 客户端访问测试,然后检查响应header
在浏览器中,会出现 via: Haproxy-2.0这个
defaults—timeout参数
retries 3 请求重试次数
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 心跳检测超时时间
4、高级配置参数
状态监测status
haproxy 有状态报告功能,可以让使用者通过web页面概览后端服务器的状况,甚至更改他们的状态
listen haproxy-stats
mode http
bind *:8888
stats enable 启动status功能
stats refresh 5s 设定自动刷新时间间隔
stats hide-version 隐藏haproxy版本
stats uri /haproxy?stats stats页面的访问路径(建议修改)
stats realm "HAProxy stats" 认证提示信息
stats auth oldzhang:123456 认证账号和密码
stats admin if TRUE 启动管理功能
http://10.0.0.5:8888/haproxy?status
用命令行上下节点
1.[root@lb01 ~]# yum install socat -y
2.[root@lb01 ~]# vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats level admin
3.[root@lb01 ~]# systemctl restart haproxy.service
4.[root@lb01 ~]#echo "show info" | socat stdio /var/lib/haproxy/stats
echo "disable server web_servers/web01" | socat stdio /var/lib/haproxy/stats
echo "disable server web_servers/web02" | socat stdio /var/lib/haproxy/stats
echo "enable server web_servers/web02" | socat stdio /var/lib/haproxy/stats
echo "enable server web_servers/web01" | socat stdio /var/lib/haproxy/stats
本文来自博客园,作者:kirin(麒麟),转载请注明原文链接:https://www.cnblogs.com/kirin365/articles/16137615.html

浙公网安备 33010602011771号