欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 全网最详细HAProxy入门小知识

全网最详细HAProxy入门小知识

2024/10/25 7:18:32 来源:https://blog.csdn.net/m0_72520945/article/details/141116042  浏览:    关键词:全网最详细HAProxy入门小知识

目录

一. 负载均衡

负载均衡的意义:

负载均衡的类型:

二. HAProxy 简介

HAProxy 的特点:

社区版和企业版:

三. HAProxy 的安装和服务信息

1、实验环境

1)安装并配置 Nginx

2)在客户端测试

2、安装:

3、haproxy的基本配置信息

global 配置: 解释 global 配置段中常用的参数

全局配置

 proxies 配置: 解释 defaults、frontend、backend 和 listen 配置段中常用的参数

配置 HAProxy

 

测试

 若在webserver1中停止 Nginx 服务

四. HAProxy 的算法

静态算法: 按照事先定义好的规则进行调度,例如:

  static-rr: 基于权重的轮询调度,不支持动态调整权重。

 first: 根据服务器在列表中的位置,自上而下进行调度,忽略权重设置。 

测试:

动态算法: 基于后端服务器状态进行调度,例如:

        roundrobin: 基于权重的轮询动态调度算法,支持动态调整权重和慢启动。

动态调整权重 

        leastconn: 加权的最少连接的动态调度算法,根据当前连接最少的后端服务器进行优先调度,适合长连接场景。

其他算法:

        source: 基于源地址 hash,可以将请求转发到同一台后端服务器,支持取模法和一致性 hash。

测试:

        uri: 基于 URI hash,可以将请求转发到缓存服务器或 CDN 服务提供商。

uri 取模法配置示例

uri 一致性hash配置示例

 访问测试

        url_param: 基于 URL 参数 hash,可以追踪用户行为,确保来自同一个用户的请求始终发往同一个后端服务器。

一致性hash配置示例

测试访问:

        hdr: 基于 HTTP 头部 hash,可以基于客户端浏览器类型进行调度。

一致性hash配置示例:

测试访问:

五. 高级功能及配置

1、基于 cookie 的会话保持:

配置示例:

验证cookie信息:

2、HAProxy 状态页:

启用状态页

3、IP 透传:

四层IP透传

4、ACL:

ACL示例-域名匹配

测试结果:

5、自定义 HAProxy 错误界面:

基于自定义的错误页面文件

6、HAProxy 四层负载:

对 MySQL 服务实现四层负载

   在后端服务器安装和配置mariadb服务

启动mariadb服务,并在MySQL数据库中创建一个新用户,并授予该用户对所有数据库和表的完全访问权限,用户名是cfy,密码是1

测试

7、HAProxy https 实现:

https配置示例

六、建议


一. 负载均衡


负载均衡的意义:


高可用性: 当一台服务器出现故障时,负载均衡器可以将流量自动切换到其他健康的服务器,保证业务的持续运行。
并发处理能力: 将流量分散到多台服务器,提高整体并发处理能力,避免单点性能瓶颈。
水平扩展: 可以方便地添加或删除服务器,实现业务的水平扩展。
成本节约: 多台服务器可以共用一个公网 IP 地址,降低 IT 成本。
安全性: 隐藏内部服务器 IP 地址,提高安全性。


负载均衡的类型:


硬件负载均衡器: 例如 F5、Netscaler、Array 等,性能强大,功能丰富,但价格昂贵。
软件负载均衡器
        四层负载均衡器: 例如 LVS、Nginx(upstream 模块)、HAProxy(模拟四层转发),基于         IP+Port 进行调度,性能较高。
        七层负载均衡器: 例如 Nginx(proxy_pass)、HAProxy,基于应用层信息进行调度,功能能        更丰富,但性能略低于四层。


二. HAProxy 简介


HAProxy 的特点:


高并发: 可以处理数万甚至数十万的并发连接。
高性能: 基于 C 语言开发,性能优越。
功能丰富: 支持七层代理、会话保持、标记、路径转移等功能。
易于配置: 使用固定格式的配置文件,配置简单。


社区版和企业版

  社区版功能丰富,满足大部分需求;

  企业版提供更高级的功能,例如 24x7 支持服务、实时仪表盘、高级安全特性等。


三. HAProxy 的安装和服务信息

1、实验环境

主机名IP角色
cfy.LAPTOP-N69PF4KV]192.168.2.158客户端
haproxyeth0:172.25.254.100haproxy
webserver1eth0:192.168.0.10真实服务器(RS)
webserver2eth0:192.168.0.20真实服务器(RS)

1)安装并配置 Nginx

[root@webserver1 ~]#  dnf install nginx -y
[root@webserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx

 

2)在客户端测试


2、安装

提供软件包下载地址和安装命令。

[root@haproxy ~]# dnf install haproxy -y


 

3、haproxy的基本配置信息


1)global 配置: 解释 global 配置段中常用的参数


        nbproc: 开启的 HAProxy worker 进程数。
        nbthread: 每个进程开启的线程数。
        maxconn: 每个进程的最大并发连接数。
        maxsslconn: 每个进程 SSL 最大连接数。
        spread-checks: 后端服务器状态检查随机提前或延迟百分比时间。
        pidfile: 指定 pid 文件路径。
        log: 定义全局的 syslog 服务器。

全局配置
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
globallog         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     100000user        haproxygroup       haproxydaemon# turn on stats unix socketstats socket /var/lib/haproxy/stats# utilize system-wide crypto-policiesssl-default-bind-ciphers PROFILE=SYSTEMssl-default-server-ciphers PROFILE=SYSTEM#nbproc 2     #启用多进程#cpu-map 1 0  #第一个线程用第一个核心#cpu-map 2 1  #第二个线程用第二个核心nbthread 2    #启用多线程[root@haproxy ~]# systemctl restart haproxy.service


 2)proxies 配置: 解释 defaults、frontend、backend 和 listen 配置段中常用的参数


        mode: 指定 HAProxy 实例使用的连接协议,例如 http、tcp。
        option: 配置选项,例如 httplog、dontlognull、http-server-close、forwardfor 等。
        retries: 连接后端服务器失败次数。
        timeout: 设置各种超时时间,例如 http-request、queue、connect、client、server、http-        keep-alive、check 等。
        maxconn: 当前后端 server 的最大并发连接数。
        server: 定义后端 real server,必须指定 IP 和端口,可以设置权重、检查间隔、连续失效次数、连续有效次数等。

配置 HAProxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
分开写
frontend webclusterbind *:80mode httpuse_backend webcluster-hostbackend webcluster-hostbalance roundrobinserver web1 172.25.254.10:80server web2 172.25.254.20:80合并写
listen webclusterbind *:80mode httpbalance roundrobinserver web1 172.25.254.10:80server web2 172.25.254.20:80[root@haproxy ~]# systemctl enable haproxy

配置 HAProxy 作为负载均衡器,将接收到的 HTTP 请求均匀分配到两台后端服务器(172.25.254.10 和 172.25.254.20)

3)测试

 若在webserver1中停止 Nginx 服务
[root@webserver1 ~]# systemctl stop nginx.service

 


四. HAProxy 的算法


1、静态算法: 按照事先定义好的规则进行调度,例如:


  1)static-rr: 基于权重的轮询调度,不支持动态调整权重。

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80bind 172.25.254.100:80mode httpbalance static-rrserver webserver1 172.25.254.10:80 weight 2 check inter 3s fall 3 rise 5server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

 2)first: 根据服务器在列表中的位置,自上而下进行调度,忽略权重设置。 

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80bind 172.25.254.100:80mode httpbalance firstserver webserver1 172.25.254.10:80 maxconn 3 check inter 3s fall 3 rise 5server webserver2 172.25.254.20:80 check inter 3s fall 3 rise 5

测试:

webserver2能被调度到


2、动态算法: 基于后端服务器状态进行调度,例如:


        1)roundrobin: 基于权重的轮询动态调度算法,支持动态调整权重和慢启动。

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80bind 172.25.254.100:80mode httpbalance roundrobinserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
动态调整权重 
[root@haproxy ~]# echo "set weight webserver_80/webserver1 2" | socat stdio
/var/lib/haproxy/haproxy.sock


        2)leastconn: 加权的最少连接的动态调度算法,根据当前连接最少的后端服务器进行优先调度,适合长连接场景。

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80bind 172.25.254.100:80mode httpbalance leastconnserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5server webserver2 172.25.25420:80 weight 1 check inter 3s fall 3 rise 5


3、其他算法


        1)source: 基于源地址 hash,可以将请求转发到同一台后端服务器,支持取模法和一致性 hash。

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80
bind 172.25.254.100:80mode httpbalance sourceserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

测试:


        2)uri: 基于 URI hash,可以将请求转发到缓存服务器或 CDN 服务提供商。

uri 取模法配置示例
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg.
listen webserver_80bind 172.25.254.100:80mode httpbalance uriserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
    uri 一致性hash配置示例
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80bind 172.25.254.100:80mode httpbalance urihash-type consistentserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
 访问测试

访问不同的uri,确认可以将用户同样的请求转发至相同的服务器

[root@webserver1 ~]# echo 172.25.254.10 - index1.html > /usr/share/nginx/html/index1.html
[root@webserver1 ~]# echo 172.25.254.10 - index2.html > /usr/share/nginx/html/index2.html
[root@webserver1 ~]# echo 172.25.254.10 - index3.html > /usr/share/nginx/html/index3.html[root@webserver2 ~]# echo 172.25.254.20 - index1.html > /usr/share/nginx/html/index1.html
[root@webserver2 ~]# echo 172.25.254.20 - index2.html > /usr/share/nginx/html/index2.html
[root@webserver2 ~]# echo 172.25.254.20 - index3.html > /usr/share/nginx/html/index3.html


       3)url_param: 基于 URL 参数 hash,可以追踪用户行为,确保来自同一个用户的请求始终发往同一个后端服务器。

一致性hash配置示例
[root@haproxy ~]#  vim /etc/haproxy/haproxy.cfg
listen webserver_80bind 172.25.254.100:80mode httpbalance url_param name,userid  #支持对多个url_param hashhash-type consistentserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

测试访问:


        4)hdr: 基于 HTTP 头部 hash,可以基于客户端浏览器类型进行调度。

一致性hash配置示例:
[root@haproxy ~]#  vim /etc/haproxy/haproxy.cfg
listen webserver_80bind 172.25.254.100:80mode httpbalance hdr(User-Agent)hash-type consistentserver webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
测试访问:
[cfy.LAPTOP-N69PF4KV] ⮞  curl -v 172.25.254.100
[cfy.LAPTOP-N69PF4KV] ⮞  curl -vA "firefox" 172.25.254.100
[cfy.LAPTOP-N69PF4KV] ⮞  curl -vA "sougou" 172.25.254.100


五. 高级功能及配置

介绍HAProxy高级配置及实用案例


1、基于 cookie 的会话保持

通过 cookie 保持用户会话,提高用户体验。

配置示例:

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webserver_80bind 172.25.254.100:80option forwardformode httpbalance roundrobincookie WEBCOOKIE insert nocache indirectserver webserver1 192.168.0.10:80 cookie web1 weight 1 check inter 3s fall 3 rise 5server webserver2 192.168.0.20:80 cookie web2 weight 1 check inter 3s fall 3 rise 5

验证cookie信息:

[cfy.LAPTOP-N69PF4KV] ⮞ curl -b WEBCOOKIE=web1 172.25.254.100
webserver1 - 172.25.254.10
[cfy.LAPTOP-N69PF4KV] ⮞ curl -b WEBCOOKIE=web2 172.25.254.100
webserver2 - 172.25.254.20


2、HAProxy 状态页

通过 web 界面查看 HAProxy 的运行状态,例如服务器状态、连接数、流量统计等。

启用状态页

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen stats:mode httpbind 0.0.0.0:8888stats enablelog globalstats uri /status     #自定义stats page uristats auth cfy:cfy    #认证,此行可以出现多次


3、IP 透传

四层IP透传

将客户端真实 IP 地址透传给后端服务器,用于访问统计和安全防护。

#nginx 配置:在访问日志中通过变量$proxy_protocol_addr 记录透传过来的客户端IP
[root@rs1 ~]# vim /etc/nginx/nginx.conf
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request"''"$proxy_protocol_addr"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';server {
listen 80 proxy_protocol; #启用此项,将无法直接访问此网站,只能通过四层代理
访问
listen [::]:80;
server_name _;
root /usr/share/nginx/html;}
}#修改haproxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfglisten webserver_80
bind 172.25.254.100:80
mode tcp
balance roundrobin
server webserver1 172.25.254.10:80 send-proxy weight 1 check inter 3s fall 3
rise 5


4、ACL

基于包过滤的访问控制技术,可以根据设定的条件对数据包进行过滤,例如基于源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息。

ACL示例-域名匹配

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend testaclbind :80mode http########### ACL settings #######################acl web_host hdr_dom(host) www.cfy.org########### host ###########################use_backend cfy_host if web_host########### default server ###################default_backend default_webserverbackend cfy_hostmode httpserver web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5server web2 172.25.254.20:80 check weight 1 inter 3s fall 3 rise 5backend default_webservermode httpserver web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

测试结果:


5、自定义 HAProxy 错误界面

对指定的报错进行重定向,进行优雅的显示错误页面。

基于自定义的错误页面文件

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
defaultsmode httptimeout client 1mtimeout server 1mtimeout http-keep-alive 10stimeout check 10smaxconn 1000000errorfile 503 /haproxy/errorpages/503page.http[root@haproxy ~]# vim /haproxy/errorpages/503page.http


6、HAProxy 四层负载

针对除 HTTP 以外的 TCP 协议应用服务访问的应用场景,例如 MySQL、Redis、Memcache、RabbitMQ 等。

对 MySQL 服务实现四层负载

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen mysql_portbind :3306mode tcpbalance leastconnserver mysql1 172.25.254.10:3306 checkserver mysql2 172.25.254.20:3306 check
   在后端服务器安装和配置mariadb服务
[root@webserver1 ~]#  yum install mariadb-server -y
[root@webserver2 ~]#  yum install mariadb-server -y

[root@webserver1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=1[root@webserver2 ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=2

启动mariadb服务,并在MySQL数据库中创建一个新用户,并授予该用户对所有数据库和表的完全访问权限,用户名是cfy,密码是1
[root@webserver1 ~]# systemctl start mariadb
[root@webserver2 ~]# systemctl start mariadb[root@webserver1 ~]#  mysql -e "grant all on *.* to cfy@'%' identified by '1';"
[root@webserver2 ~]#  mysql -e "grant all on *.* to cfy@'%' identified by '1';"

测试
[cfy.LAPTOP-N69PF4KV] ⮞ mysql -ucfy -p1 -h 172.25.254.100 -e "show variables like 'hostname'"
[cfy.LAPTOP-N69PF4KV] ⮞ mysql -ucfy -p1 -h 172.25.254.100 -e  "select @@server_id"


7、HAProxy https 实现

配置 HAProxy 支持 https 协议,实现证书安全。

https配置示例

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend webserverbind *:80redirect scheme https if !{ ssl_fc }mode httpuse_backend webcluster
frontend webserver-httpsbind *:443 ssl crt /etc/haproxy/cfy.org.pemmode httpuse_backend webcluster
backend webclustermode httpbalance roundrobinserver web1 172.25.254.10:80 check inter 3s fall 3 rise 5server web2 172.25.254.20:80 check inter 3s fall 3 rise 5

六、建议

在实际部署 HAProxy 时,需要根据具体的应用场景选择合适的配置和算法。
可以使用 socat 工具动态调整 HAProxy 的配置,例如服务器权重和状态。
可以使用 HAProxy 的状态页监控 HAProxy 的运行状态,及时发现并解决问题。
希望这份更详细的解读能够帮助您更好地理解 HAProxy,并将其应用于您的项目中。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com