快速安装入门

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 
posted @ 2022-04-12 21:36  kirin(麒麟)  阅读(290)  评论(0)    收藏  举报
Δ