Haproxy

[复制链接]
发表于 2026-2-10 00:46:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
简介

HAProxy是法国开辟者 威利塔罗(Willy Tarreau) 在2000年利用C语言开辟的一个开源软件
是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器
支持基于cookie的长期性,主动故障切换,支持正则表达式及web状态统计
企业版网站:https://www.haproxy.com
社区版网站:https://www.haproxy.org
github:https://github.com/haproxy
版本对比
功能社区版企业版高级HTTP / TCP负载均衡和长期性支持支持高级康健查抄支持支持应用步伐加快支持支持高级安全特性支持支持高级管理支持支持HAProxy Dev Branch新功能支持24*7 支持服务支持及时仪表盘支持VRRP和Route Health Injection HA工具支持ACL,映射和TLS票证密钥同步支持基于应用步伐的高级DDoS和Bot掩护(主动掩护)支持Bot(呆板人)监测支持Web应用防火墙支持HTTP协议验证支持及时集群追踪支持根本设置信息

官方文档:[HAProxy version 2.2.22 - Configuration Manual]
HAProxy 的设置文件haproxy.cfg由两大部分构成,分别是global和proxies部分
global:
全局设置段
进程及安全设置相干的参数  
性能调解相干参数  
Debug参数
proxies:署理设置段
 defaults:为frontend, backend, listen提供默认设置  
frontend:前端,相当于nginx中的server {}  
backend:后端,相当于nginx中的upstream {}  
listen:同时拥有前端和后端设置
global设置参数


Proxies设置

defaults

defaults 设置参数:
  1.  option redispatch       #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
  2.  option abortonclose     #当服务器负载很高时,自动结束掉当前队列处理比较久的链接,针对业务情况选择开启
  3.  option http-keep-alive  #开启与客户端的会话保持
  4.  option  forwardfor      #透传客户端真实IP至后端web服务器
  5.  mode http|tcp           #设置默认工作类型,使用TCP服务器性能更好,减少压力
  6.  timeout http-keep-alive 120s #session 会话保持超时时间,此时间段内会转发到相同的后端服务器
  7.  timeout connect 120s    #客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms
  8.  timeout server  600s    #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如果超时,会出现502错误,此值建议设置较大些,访止502错误
  9.  timeout client  600s    #设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同
  10.  timeout  check   5s     #对后端服务器的默认检测超时时间
  11.  default-server inter 1000 weight 3   #指定后端服务器的默认设置
复制代码
frontend

frontend 设置参数:
  1.  bind:   #指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
  2.  ​
  3.  #格式:
  4.  bind [<address>]:<port_range> [, ...] [param*]
  5.  ​
  6.  #注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
复制代码
backend

  1. 定义一组后端服务器,backend服务器将被frontend进行调用。
  2. mode http|tcp      #指定负载协议类型,和对应的frontend必须一致  
  3. option              #配置选项  
  4. server              #定义后端real server
复制代码
socat工具

对服务器动态权重和别的状态可以利用socat工具举行调解,Socat 是Linux 下的一个多功能的网络工具,名字由来是Socket CAT,相当于netCAT的增强版.Socat 的紧张特点就是在两个数据流之间创建双向通道,且支持浩繁协媾和链接方式。如IP、TCP、UDP、IPv6、Socket文件等。
利用案例:
  1. [root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
  2. ......
  3. listen webcluster
  4.     bind *:80  
  5.     mode http     
  6.     balance roundrobin
  7.     server web1 172.25.254.10:80
  8.     server web2 172.25.254.20:80
  9. ......
  10. #socat使用
  11. #查看haproxy状态
  12. [root@haproxy ~]#echo "show info" | socat stdio /var/lib/haproxy/stats
  13. #查看serer服务器的状态
  14. [root@haproxy ~]#echo "show servers state" | socat stdio /var/lib/haproxy/stats
  15. #查看server权重
  16. [root@haproxy ~]#echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
  17. #更改server的权重
  18. [root@haproxy ~]#echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats
  19. #让指定的server服务器disable
  20. [root@haproxy ~]#echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
复制代码
Haproxy算法

静态算法

按照事先界说好的规则轮询公平调治,不关心后端服务器的当前负载、链接数和相应速率等,且无法及时修改权重,只能靠重启HAProxy见效。
static-rr

基于权重的轮询调治,不支持权重的运行时利用socat举办法态调解及后端服务器慢启动,厥后端主机数目没有限定,相当于LVS中的 wrr
  1. listen webcluster
  2.     bind *:80
  3.     mode http
  4.     balance static-rr
  5.     server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
  6.     server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
复制代码
first

根据服务器在列表中的位置,自上而下举行调治,但是其只会当第一台服务器的毗连数到达上限,新哀求才会分配给下一台服务,因此会忽略服务器的权重设置,此方式利用较少
  1. listen webcluster
  2.     bind *:80
  3.     mode http
  4.     balance first
  5.     server web1 172.25.254.10:80 maxconn 1 check inter 2 fall 3 rise 5 weight 2
  6.     server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
复制代码
动态算法

基于后端服务器状态举行调治得当调解,优先调治至当前负载较低的服务器,且权重可以在haproxy运行时动态调解无需重启。
roundrobin

基于权重的轮询动态调治算法,支持权重的运行时调解,差别于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会徐徐增长转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调解,roundrobin为默认调治算法
  1. listen webcluster
  2.     bind *:80
  3.     mode http
  4.     balance roundrobin
  5.     server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
  6.     server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
复制代码
leastconn

加权的最少毗连的动态,支持权重的运行时调解和慢启动,即当前后端服务器毗连最少的优先调治(新客户端毗连),比力恰当长毗连的场景利用,好比:MySQL等场景。
  1. listen webcluster
  2.     bind *:80
  3.     mode http
  4.     balance leastconn
  5.     server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 3
  6.     server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
复制代码
高级功能实行

基于cookie的会话保持

不支持 tcp mode,利用 http mode
  1. #cookie
  2. listen webcluster
  3.     bind *:80
  4.     mode http      
  5.     balance roundrobin
  6.     cookie WEBCOOKIE insert nocache indirect
  7.     server web1 172.25.254.10:80 cookie lee1 check inter 2 fall 3 rise 5  weight 1
  8.     server web2 172.25.254.20:80 cookie lee2 check inter 2 fall 3 rise 5  weight 1
  9.     server web3_sorry 172.25.254.100:8080 backup
复制代码
 验证cookie信息

点击革新不绝是同一个网页内容则乐成

IP透传

四层:IP+PORT转发
七层:协议+内容交换
四层负载
在四层负载装备中,把client发送的报文目标地点(原来是负载均衡装备的IP地点),根据均衡装备设置的选择web服务器的规则选择对应的web服务器IP地点,如许client就可以直接跟此服务器创建TCP毗连并发送数据,而四层负载自身不加入创建毗连,而和LVS差别,haproxy是伪四层负载均衡,由于haproxy 须要分别和前端客户端及后端服务器创建毗连
七层署理
七层负载均衡服务器起了一个反向署理服务器的作用,服务器创建一次TCP毗连要三次握手,而client要访问webserver要先与七层负载装备举行三次握手后创建TCP毗连,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver创建TCP毗连,然后webserver把须要的数据发送给七层负载均衡装备,负载均衡装备再把数据发送给client;以是,七层负载均衡装备起到了署理服务器的作用,七层署理须要和Client和后端服务器分别创建毗连
七层ip透传

HAProxy设置
default增长forwardfor选项

webserver1服务器设置文件(apache)

[root@webserver2 ~]# systemctl restart httpd
webserver2服务器设置文件(nginx)
[root@webserver2 ~]# vim /etc/nginx/nginx.conf

[root@webserver2 ~]# systemctl restart nginx.service 
测试

apache

nginx

四层透传

修改mode 为tcp
  1. listen webcluster
  2.     bind *:80
  3.     mode tcp
  4.     balance roundrobin
  5.     server web1 172.25.254.10:80 send-proxy check inter 2 fall 3 rise 5 weight 1
  6.     server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1
复制代码
在NGINX设置内添加变量proxy_protocol_addr 纪录透传过来的客户端IP,并启用proxy_protocol署理功能

测试

HAProxy状态页面

 可以通过 Web界面监测状态
状态页设置项
  1. stats enable                #基于默认的参数启用stats page
  2. stats hide-version          #将状态页中haproxy版本隐藏
  3. stats refresh <delay>         #设定自动刷新时间间隔,默认不自动刷新
  4. stats uri <prefix>        #自定义stats page uri,默认值:/haproxy?stats
  5. stats realm <realm>       #账户认证时的提示信息,示例:stats realm   HAProxy\ Statistics
  6. stats auth <user>:<passwd>  #认证时的账号和密码,可使用多次,默认:no authentication,可有多行用户
  7. stats admin { if | unless } <cond> #启用stats page中的管理功能
复制代码
实例
  1. [root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
  2. listen stats
  3.     mode http
  4.     bind *:9999
  5.     stats enable
  6.     stats hide-version
  7.     stats refresh 3
  8.     stats uri /status
  9.     stats auth ran:ran
  10. [root@haproxy ~]# systemctl restart haproxy.service
复制代码
测试


sorry server

在后端服务器全部无法访问时,提供错误相应
        HAProxy
        下载HTTPD,修改端口,启动httpd

        关闭后端服务器举行测试



自界说错误页面

  1. [root@haproxy ~]#mkdir -p /etc/haproxy/errorpage/
  2. [root@haproxy ~]#vim /etc/haproxy/errorpage/badpage.http
  3. HTTP/1.0 503 Service Unavailable
  4. Cache-Control: no-cache
  5. Connection: close
  6. Content-Type: text/html
  7. <html>
  8. <meta charset="UTF-8">
  9. <body><h1>这是一个错误页面 Service Unavailable</h1>
  10. No server is available to handle this request.
  11. </body></html>
  12. ~               
复制代码
设置到default地区

重启haproxy服务
测试(关闭两台web服务器)

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表