haproxy可以做http的反向代理,也可以做tcp的转发,可以同时做多种协议的代理(http与tcp同时代理),基于cookie的持久性(确定用户的身份,调度到相应的服务器),过载保护,流量控制, 支持正则表达式。
LB----均衡负载的集群,分为四层和七层结构;
四层:LVS、nginx、haproxy
七层:http、haproxy、nginx
优点:
可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部 (用户发送给服务器的请求,或者服务器响应的报文,比如隐藏server的版本信息)
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息(提供web界面可以观察当前软件以及服务器的运行状况,甚至可以进行管理)
haproxy的位置:
支持http反向代理
支持动态程序的反向代理
支持基于数据库的反向代理
1.四台主机,一台作为haproxy的服务器(有两个网卡,分为内外网),一台作为外网,两台作为内网服务器。相关拓扑图:
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg2L2UyYzU0MjhmYjY2YmY2MWQxMTA4YzU3Mjg0M2YzZDc2LnBuZw%3D%3D.png?w=700&webp=1)
2.内网主机安装类似http服务,提供网页,关闭防火墙,selinux
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMyNy9mZTlkMzYyMjc2MzBhYzcxOGQ3ZjYwOGNhMjQ5MmFiZi5wbmc%3D.png?w=700&webp=1)
3.安装haproxy(yum安装)
rpm -ql haproxy
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
错误页面,没有404(找不到页面),
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQzMy82OWEyN2Y2YTBhYzQ5YzI1NDhhY2Q0N2Q0MTA3MWE5MS5wbmc%3D.png?w=700&webp=1)
4.配置文件备份,编辑
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzEyMi8wNDI1MWFjNmRiODJlOTlkZTM5OGFlYjRjMmQ0OWQ1Mi5wbmc%3D.png?w=700&webp=1)
配置段:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
fronted:前端,相当于nginx, server {}
backend:后端,相当于nginx, upstream {}
listen:同时拥有前端和后端,适用于一对一环境
用户访问不同的端口,或者相同端口不同地址,会调度到不同的服务器
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzExMS84ZTAzZDZhN2EyMTQ1NjkyOWFiNGEyN2Q4YzRmMTVkNy5wbmc%3D.png?w=700&webp=1)
简单的配置示例:
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](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY3OC8zODQyMjIzZDBmODI2YTk4MTBhZGZmOGQ4ZWY0Mjg4ZS5wbmc%3D.png?w=700&webp=1)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ1OC9lODQ2ZDEwNThlNTYzY2FhNjY4NjAyNWQyMmQyNTY4YS5wbmc%3D.png?w=700&webp=1)
5.启动服务。要确保http服务或其他服务不能使用80端口
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzIwMi8wN2I3ZTA2NzU0MTlkNzg0OTk2NmQ4OTdlMTg3Yjc3Mi5wbmc%3D.png?w=700&webp=1)
6.访问
在108主机*问两个内网主机,结果轮询
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzkyMy8yY2FiOGEzOWMwNGZhYWQxZjRmMTAxODRmMjNlOTU2Yi5wbmc%3D.png?w=700&webp=1)
一对一的环境可以写为listen:
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5OC83M2E2Yzg3ZWNmYjQzMDczY2Q0ZTQ1OWZiMjgzNTFkMi5wbmc%3D.png?w=700&webp=1)
全局配置段的配置参数:
1.nbproc:要启动的haproxy的进程数量,系统默认单进程,要求使用daemon模式。(默认的进程数与内核的数量有关,两个cpu默认有两个进程)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk3OC8wNjEzMzkzM2E0ZjQxYTAyMjlmYjVlZGQ5MzQzY2Y5Mi5wbmc%3D.png?w=700&webp=1)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzcwOS8xNTI5MjBjZTc2ZjZmNzUyNTBlMGFjYTg0NGExNTQ2ZC5wbmc%3D.png?w=700&webp=1)
2.ulimit-n :每个haproxy进程可打开的最大文件数,系统自动会指定,不建议设置
3.daemon 后端方式运行,建议使用
4.用户帐号
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE2Ni9iOWI4OWJhOTAwMmYyY2FlOTE4NTlhYzk5ODFiYzQ5Ni5wbmc%3D.png?w=700&webp=1)
5.日志
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY1OC9iMDM1ZTAwNjI3OGUzY2I2ODRmZmZjODk2YWY2ZTlkMi5wbmc%3D.png?w=700&webp=1)
打开日志的远程功能(调用相关模块,走的协议等)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ2NS83YmIzMTBlYjkyNTdiZTJlZmQyYjY2OTNhMzBlOTc2OS5wbmc%3D.png?w=700&webp=1)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1MC8xY2U5ZWEwMjI1ZTFkMjJkOTI5NTc5YzhhNWFlZGJkZS5wbmc%3D.png?w=700&webp=1)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzkxMS80NTFkZjkzMGIxOWY3NTIwYzc0MmZiNGE4ZjkxZjc5Ny5wbmc%3D.png?w=700&webp=1)
重启服务
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY0MC9iYjcxNDRmZDI5NzFmYTkwZmZhNmYwOTc2ZGZlNzBlMC5wbmc%3D.png?w=700&webp=1)
6.重启haproxy服务,再次访问,会记录日志
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgwMS85ZmM2NWM5ZmQyMzAwYmJkYzMwZjdmODMwOTA5OWU3OS5wbmc%3D.png?w=700&webp=1)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzIwMi9lYzQwZDViZjFjOGJlNmE3YmQwZjk0YmUyNWFlZWMzMi5wbmc%3D.png?w=700&webp=1)
日志可以发送到本机,也可以发送到远程:例如101主机
在107上更改配置文件
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzEyMS9lODc3NzdmZDUxNmVjN2Q2ZGYzMWI4ZGY3ODAyZmIxMS5wbmc%3D.png?w=700&webp=1)
在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 haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzc1Ny84MGMwMzc3MGU0ZGU2YmNiODZmZjkxMDI0MmI4OWM1ZC5wbmc%3D.png?w=700&webp=1)
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](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg2MC84YTM0ZTNmZTViNjdiY2Q4NzEzM2IzMzNmYTk4NDRhYy5wbmc%3D.png?w=700&webp=1)
可以监听在多个地址上,以逗号隔开
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQzMS80MzIwMzAyYjZjMTEzY2QxMGM0YmIzNjViZjhjOWUxZi5wbmc%3D.png?w=700&webp=1)
自此,访问两个地址都能调度
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzc3LzY2ZjUzMGRhZmE5ZWUwNjc5ZTY4M2M0OGFhZTJkZGQ1LnBuZw%3D%3D.png?w=700&webp=1)
也可以监听两个端口:
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzYzMS81ZTI4NGFjY2U2YmMzNDlkNzc1MGU3OTVhMjBlODIyZi5wbmc%3D.png?w=700&webp=1)
也可以写为:bind :80,:443(没有写地址意味着监听所有地址)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzc1OC9iZDFhMTYzN2QxN2UwZDEzYTU5N2IxZGY3ZTIxMzc1ZS5wbmc%3D.png?w=700&webp=1)
2.balance:调度算法
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk4OC85ZjViNmFmZjhjNGQ5MDYzM2JkYjE2NzI4YzEzNDQ5Yy5wbmc%3D.png?w=700&webp=1)
roundrobin:基于权重轮询,动态算法,支持权重的运行时调整,支
持慢启动;每个后端backend中最多支持4095个server
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM4MC81NmFhMzQyMzQ1MzRhMjE4ZjZlMjk5MTQyYzQwN2U5Yy5wbmc%3D.png?w=700&webp=1)
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](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzYzNi8zNjFiNzk2ZTM4ZGQyNWM1MTJlZDQ1NTZkZDU3NTJlNC5wbmc%3D.png?w=700&webp=1)
在hosts文件中定义三个不同的域名,意味着三个不同的首部
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU2NS9jMTFjMzJkZDUzMTA0OGQxMDA0NDRiMjBhNzRkMmRiZC5wbmc%3D.png?w=700&webp=1)
地址不一样,即首部不一样
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgwNi8zZGM0Njg1YjY2MmU3OWRhYjFmZmIxNTMwMzA4NGMyNi5wbmc%3D.png?w=700&webp=1)
哈希算法;
hash-type:哈希算法
hash-type <method> <function> <modifier>
method:
map-based:除权取余法,哈希数据结构是静态数组
consistent:一致性哈希,哈希数据结构是一棵树
例如,使用uri调度算法
相同的uri调度到同一个主机上
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI3OC9kZmZhY2E4MDQwYTI2NGU1Y2ZiMzE0MTE2N2Q0NGIxNi5wbmc%3D.png?w=700&webp=1)
在101主机上生成十个页面
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzYzL2QwN2Q0YWIzMTIxYzY5YTM1MjQ4Zjg5ZjRkNDliODhmLnBuZw%3D%3D.png?w=700&webp=1)
在102主机上生成十个页面
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQxNy80MzE0ODFkZjllNTRiNDg2ZjM5NGQyYTIyY2FjZDQyOS5wbmc%3D.png?w=700&webp=1)
default_backend<backend>
无use_backend匹配时,使用默认的backend,用于frontend中
default-server [param*]
为backend中的各server设定默认选项,只能定义在backend中,可以加权重
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI3My9kNzU3N2ZlMDI1ODE2ZGE0YjBkOGQ0ZWRkNWUyYjcyMS5wbmc%3D.png?w=700&webp=1)
server:定义后端服务器,端口可以不同,如果102没有8080,就会健康性检查报错,不会调度过去
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg0Ni83YjgxYzhkY2JhOWNiNGM2NGYxNDY0NzU3OWY5NjM4Ni5wbmc%3D.png?w=700&webp=1)
还可以定义后端服务器的最大并发连接数:
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM5OS83NjA5MWExMWI1YWQwYjZjZDk3NjZlNzI1MzY3MmE5Zi5wbmc%3D.png?w=700&webp=1)
backlog <backlog>:当server的连接数达到上限后的后援队列长度
backup:设定当前server为备用服务器(当其他主机宕机后使用)
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY5MS9lMjQ5MzhjZmVjMmYzMWJlNzA3OTViZmFjMmY0NDllMy5wbmc%3D.png?w=700&webp=1)
健康性检查
check:对当前server做健康状态检测,只用于四层检测
addr:检测时使用的IP地址(检查的地址可以不是提供服务的地址,可以是主机上另一个地址)
port :针对此端口进行检测
inter <delay>:连续两次检测之间的时间间隔,默认为2000ms
rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2
fall <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3
disabled:标记为不可用
redir<prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY5MS80NDVmMTQ1NDE4M2QxMmM2OGVlMDIxZTk3NWU0OTFmYi5wbmc%3D.png?w=700&webp=1)
将服务器标记为不可用:
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY4NS9kODNjN2U3YzY3OWZiNjUwZjc2YjI4YzBjMzQyNWYzNS5wbmc%3D.png?w=700&webp=1)
当访问101时将请求调度到107上
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg1My83N2Y4MzQ5NDUzNGExZTUzN2UyOGMzZTY5ZDQ2YjRhZC5wbmc%3D.png?w=700&webp=1)
定义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](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg2Ni80NDM1ZTQyNDQyODhlZWI0NTI5MDE1ZjkyMTkzNWMxMi5wbmc%3D.png?w=700&webp=1)
会生成相应的日志:
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzU1NS9iOThiMjkzN2M0YjZmNTRjODJmMDZmMGQwZjdlMGNkYi5wbmc%3D.png?w=700&webp=1)
进行检查时,也可以不使用options,可以定义使用GET获取相应页面来进行检查,但要手动构建报文首部
![haproxy haproxy](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzEwMy82MGI1NTEyMzhkMzZmYjZjNzdmNzQxODQzOTk4ZjI1Ny5wbmc%3D.png?w=700&webp=1)