haproxy

时间:2024-03-20 08:00:01
haproxy可以做http的反向代理,也可以做tcp的转发,可以同时做多种协议的代理(http与tcp同时代理),基于cookie的持久性(确定用户的身份,调度到相应的服务器),过载保护,流量控制, 支持正则表达式。
LB----均衡负载的集群,分为四层和七层结构;
四层:LVS、nginx、haproxy
七层:http、haproxy、nginx
优点:
可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部 (用户发送给服务器的请求,或者服务器响应的报文,比如隐藏server的版本信息
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息(提供web界面可以观察当前软件以及服务器的运行状况,甚至可以进行管理)

haproxy的位置:

haproxy

支持http反向代理
支持动态程序的反向代理
支持基于数据库的反向代理

1.四台主机,一台作为haproxy的服务器(有两个网卡,分为内外网),一台作为外网,两台作为内网服务器。相关拓扑图:
haproxy

2.内网主机安装类似http服务,提供网页,关闭防火墙,selinux
haproxy

3.安装haproxy(yum安装)
rpm -ql haproxy
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
错误页面,没有404(找不到页面),
haproxy

4.配置文件备份,编辑
haproxy

配置段:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
fronted:前端,相当于nginx, server {}
backend:后端,相当于nginx, upstream {}
listen:同时拥有前端和后端,适用于一对一环境
用户访问不同的端口,或者相同端口不同地址,会调度到不同的服务器
haproxy

简单的配置示例:
frontend web (代表前端的服务,名字随便写)
bind *:80 (写对外提供服务的地址与端口)
default_backend websrvs (默认的后端提供服务的服务器以及名字)
backend websrvs
balance roundrobin (调度算法:轮询)
server srv1 172.16.0.6:80 check (后端服务器,要有名字,地址,端口,健康性检查)
server srv2 172.16.0.7:80 check

配置文件中会有一些范例,需要注释掉:从frontend到backend
haproxy

haproxy
5.启动服务。要确保http服务或其他服务不能使用80端口
haproxy

6.访问
在108主机*问两个内网主机,结果轮询
haproxy

一对一的环境可以写为listen:
haproxy

全局配置段的配置参数:
1.nbproc:要启动的haproxy的进程数量,系统默认单进程,要求使用daemon模式。(默认的进程数与内核的数量有关,两个cpu默认有两个进程)
haproxy

haproxy
2.ulimit-n :每个haproxy进程可打开的最大文件数,系统自动会指定,不建议设置
3.daemon 后端方式运行,建议使用
4.用户帐号
haproxy

5.日志
haproxy

打开日志的远程功能(调用相关模块,走的协议等)
haproxy

haproxy

haproxy
重启服务
haproxy

6.重启haproxy服务,再次访问,会记录日志
haproxy

haproxy
日志可以发送到本机,也可以发送到远程:例如101主机
在107上更改配置文件
haproxy

在101上更改/etc/rsyslog.cof文件
日志管理:将cookie信息记录日志,将请求报文中的首部信息记录日志、将响应报文中的首部信息记录日志,还可以定义日志长度
capture cookie <name> len<length>
捕获请求和响应报文中的cookie并记录日志
capture request header <name> len<length>
捕获请求报文中指定的首部并记录日志
示例:
capture request header X-Forwarded-For len15
capture response header <name> len<length>
捕获响应报文中指定的首部并记录日志
性能调整:
haproxy
maxconn <number>:设定每个haproxy进程所能接受的最大并发连接数
maxconnrate <number>:设置每个进程每秒种所能建立的最大连接数量(连接速率)
maxsessrate <number>:设置每个进程每秒种所能建立的最大会话数量(一个连接中可以有多个会话)
maxsslconn <number>: 每进程支持SSL的最大连接数量
spread-checks <0..50, in percent> 健康检测延迟时长比,建议2%-5%之间(众多服务器的健康检测不能同一时间发送,需要时间延迟,延迟的时间比在2%~5%之间即可)

代理配置段:
- defaults <name>
- frontend <name>
- backend <name>
- listen <name>
Frontend段:指定接收客户端连接侦听套接字设置
Backend段:指定将连接请求转发至后端服务器的相关设置
Listen段:指定完整的前后端设置,只对TCP 有效

配置参数:
1.bind:指定前端监听的地址与端口
bind生效的配置段:
haproxy

haproxy

haproxy

可以监听在多个地址上,以逗号隔开
haproxy

自此,访问两个地址都能调度
haproxy

也可以监听两个端口:
haproxy

haproxy

也可以写为:bind :80,:443(没有写地址意味着监听所有地址)
haproxy

2.balance:调度算法
haproxy

roundrobin:基于权重轮询,动态算法,支持权重的运行时调整,支
持慢启动;每个后端backend中最多支持4095个server
haproxy

static-rr:基于权重轮询,静态算法,不支持权重的运行时调整及慢启动;后端主机数量无上限
leastconn:加权最少连接,动态算法,最少连接的后端服务器优先分配接收新连接,相同连接时轮询,推荐在较长会话的场景使用,例如MySQL、LDAP等,不适合http
first:根据服务器在列表中的位置,自上而下进行调度;前面服务器的连接数达到上限,新请求才会分配给下一台服务
source:源地址hash,新连接先按权重分配,后续连接按source分配请求(有会话绑定的作用)
uri:对URI的左半部分或整个uri做hash计算,并除以服务器总权重取模,以后派发至某挑出的服务器,适用于后端缓存服务器
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
左半部分:/<path>;<params>
整个uri:/<path>;<params>?<query>#<frag>
url_param:对用户请求的uri听<params>部分中的参数的值作hash计算,再进行调度,参数中可能会包括用户的ID,实现会话绑定
hdr(<name>):根据请求报文首部进行调度
haproxy

haproxy

在hosts文件中定义三个不同的域名,意味着三个不同的首部
haproxy

haproxy

地址不一样,即首部不一样
haproxy

haproxy

哈希算法;
hash-type:哈希算法
hash-type <method> <function> <modifier>
method:
map-based:除权取余法,哈希数据结构是静态数组
consistent:一致性哈希,哈希数据结构是一棵树
例如,使用uri调度算法
相同的uri调度到同一个主机上
haproxy

在101主机上生成十个页面
haproxy

在102主机上生成十个页面
haproxy

haproxy

haproxy

default_backend<backend>
无use_backend匹配时,使用默认的backend,用于frontend中
default-server [param*]
为backend中的各server设定默认选项,只能定义在backend中,可以加权重
haproxy

server:定义后端服务器,端口可以不同,如果102没有8080,就会健康性检查报错,不会调度过去
haproxy

还可以定义后端服务器的最大并发连接数:
haproxy

backlog <backlog>:当server的连接数达到上限后的后援队列长度
backup:设定当前server为备用服务器(当其他主机宕机后使用)
haproxy

健康性检查
check:对当前server做健康状态检测,只用于四层检测
addr:检测时使用的IP地址(检查的地址可以不是提供服务的地址,可以是主机上另一个地址)
port :针对此端口进行检测
inter <delay>:连续两次检测之间的时间间隔,默认为2000ms
rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2
fall <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3
disabled:标记为不可用
redir<prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL
haproxy

将服务器标记为不可用:
haproxy

当访问101时将请求调度到107上
haproxy

定义haproxy的工作模式 (定义在各种位置都行,frontend、backend)
tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议,https时使用此模式;(后端服务器使用ssl连接,就要使用TCP协议)
http:仅当代理协议为http时使用,centos实际默认模式
health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接,较少使用

对后端服务器做http协议的健康状态检测:
option httpchk默认为:/ OPTIONS HTTP/1.0
option httpchk<uri>
option httpchk<method> <uri>
option httpchk<method> <uri> <version>
定义基于http协议的7层健康状态检测机制http-check expect [!] <match> <pattern>
http协议健康状态检测响应内容或指定响应码
如果启用健康性检查,代理服务器会向后端服务器发起http请求
haproxy

会生成相应的日志:
haproxy

haproxy

进行检查时,也可以不使用options,可以定义使用GET获取相应页面来进行检查,但要手动构建报文首部
haproxy