HAProxy 负载均衡原理深度解析

目录

一、引言

二、HAProxy 简介

三、工作模式

3.1、四层负载均衡(Layer 4)

3.2、七层负载均衡(Layer 7)

3.3、区别和选择

四、 负载均衡算法

4.1、静态负载均衡算法

4.2、动态负载均衡算法

4.3、其他算法

4.4、选择算法

五、 会话持久性

5.1、基于 Cookie 的会话持久性

5.2、验证cookie信息

六、HAProxy状态页

七、IP透传

7.1、四层IP透传(mode=tcp)nginx

7.2、七层透传(mode=http)nginx

7.3、七层透传(mode=http)apache

八、ACL

8.1、haproxy的acl基本访问控制

8.2、基于域名的访问控制

8.3、基于IP的访问控制

8.4、基于IP的访问控制之黑名单

8.5、基于浏览器的访问控制

8.6、基于文件后缀名来实现动静分离

九、haproxy自定义错误页面

十、haproxy之https网站加密

十一、总结

11.1、优势与局限

11.1.1、HAProxy 的优势

11.1.2、HAProxy 的局限性

11.1.3、如何克服局限

11.2、结论


一、引言


在当今数字化时代,互联网应用的规模和复杂性不断增长,用户对服务的响应速度和可用性有着极高的期待。然而,随着用户数量的增加,单一服务器或服务实例很难承载巨大的访问量,这就需要一种解决方案来分发网络流量和请求,以避免任何单点的过载。这就是负载均衡技术发挥作用的地方。

负载均衡不仅可以提高应用程序的响应速度,通过分散请求到多个服务器,还能显著提高系统的可用性和容错能力。当一个服务器因维护或故障而下线时,负载均衡器可以自动将流量转移到其他健康的服务器上,从而保证服务的持续性。

HAProxy 作为负载均衡领域中的佼佼者,以其高性能、高可用性以及灵活的配置选项,赢得了广泛的认可和应用。它能够处理数以万计的并发连接,非常适合需要处理大量并发请求的大型网站和

应用。


二、HAProxy 简介


HAProxy 的故事始于 2000 年,由 Willy Tarreau 开发,最初是作为一个自由软件项目。随着时间的推移,HAProxy 不断发展和完善,成为了一个功能丰富的负载均衡和代理解决方案。它不仅支持基本的负载均衡功能,还提供了诸如 SSL 终端、连接持久性、动态权重调整、健康检查等高级特性。

HAProxy 的主要功能包括:

  • TCP/HTTP 负载均衡:支持对 TCP 和 HTTP 应用的流量进行均衡分配。
  • SSL 加密:能够在代理层处理 SSL 握手,减轻后端服务器的负担。
  • 会话持久性:通过 Cookie 或 IP 哈希等机制,确保用户的会话连续性。
  • 健康检查:定期检查后端服务的健康状态,自动排除不健康的节点。
  • 高可用性:支持多进程和多实例运行,提高整体服务的稳定性。

特别值得一提的是,HAProxy 在高并发环境下的性能表现。它使用高效的事件驱动架构,能够在保持高性能的同时,降低系统资源的消耗。这使得 HAProxy 成为处理大规模用户访问的理想选择,无论是在 Web 服务、API 网关,还是在微服务架构中,HAProxy 都能够提供稳定和可靠的流量管理。


三、工作模式

在负载均衡领域,"层"的概念来自于 OSI 网络模型,其中四层负载均衡对应于传输层(TCP/UDP),而七层负载均衡对应于应用层。HAProxy 支持这两种工作模式,各有其特点和适用场景。

3.1、四层负载均衡(Layer 4)

四层负载均衡工作在 OSI 模型的传输层,主要基于 IP 地址和端口号来转发流量。这种模式不关心传输的数据内容,只关注数据包的源地址、目的地址和端口号。

  • 通过ip+port决定负载均衡的去向.
  • 对流量请求进行NAT处理,转发至后台服务器.
  • 记录tcpudp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。

特点:

  • 性能高:由于不涉及应用层的处理,四层负载均衡的开销较小,性能较高。
  • 配置简单:不需要深入到应用层的细节,配置相对简单。
  • 通用性强:适用于所有基于 TCP 或 UDP 的应用,不仅限于 HTTP。

应用场景:

  • 通用的服务器负载均衡,如 Web 服务器、邮件服务器等。
  • 需要高性能和高吞吐量的场景,如大型在线游戏或金融交易平台。
3.2、七层负载均衡(Layer 7)

七层负载均衡工作在 OSI 模型的应用层,能够理解并处理 HTTP、HTTPS 等应用层协议的细节。这种模式可以根据 URL、HTTP 头部、Cookie 等信息来智能地分发流量。

  • 通过虚拟url或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
  • 代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接

特点:

  • 智能分发:能够根据应用层的内容做出更精细的流量管理决策。
  • 安全性高:可以实施更细粒度的访问控制和安全策略。
  • 支持 SSL 卸载:可以在七层负载均衡器上终止 SSL 连接,减轻后端服务器的加密解密负担。

应用场景:

  • Web 应用和 API 服务,需要根据 URL 路由或内容分发请求。
  • 需要实现高级路由策略,如基于用户 IP、地理位置或 Cookie 进行路由。
  • 安全性要求较高的场景,如 Web 应用防火墙(WAF)的部署。
3.3、区别和选择

四层和七层负载均衡的主要区别在于它们处理网络流量的深度和细粒度。四层负载均衡适用于对性能要求高、不需要应用层解析的场景;而七层负载均衡则适用于需要基于应用层内容进行智能路由和安全控制的场景。

在选择负载均衡模式时,需要根据实际业务需求、性能要求和安全策略来综合考虑。在某些情况下,甚至可以结合使用四层和七层负载均衡,以实现更优的流量管理和服务架构。例如,可以使用四层负载均衡来处理大部分流量,同时在七层上实现特定的路由策略和安全控制。


四、 负载均衡算法


HAProxy 支持多种负载均衡算法,每种算法都适用于不同的场景和需求。以下是一些 HAProxy 中常见的负载均衡算法:

4.1、静态负载均衡算法

静态算法通常在配置时指定,并且在运行时不会根据后端服务器的状态变化而调整。

1、Static Round Robin (static-rr)

  • 不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
  • 不支持端服务器慢启动
  • 其后端主机数量没有限制,相当于LVS中的 wrr

慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没 问题后在给一部分

 vim /etc/haproxy/haproxy.cfg


 listen webserver_80
     bind 172.25.254.100:80
     mode http
     balance static-rr
     server webserver1 192.168.0.101:80 weight 2 check inter 3s fall 3 rise 5
     server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

2、First

  • 根据服务器在列表中的位置,自上而下进行调度
  • 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
  • 其会忽略服务器的权重设置
  • 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
 vim /etc/haproxy/haproxy.cfg


listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance first                 
    server webserver1 192.168.0.101:80 maxconn 3 check inter 3s fall 3 rise 5 
    server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 5
4.2、动态负载均衡算法

动态算法可以根据后端服务器的实时状态进行调整,以优化请求的分发。

1、Round Robin

  • 基于权重的轮询动态调度算法
  • 支持权重的运行时调整,不同于lvs中的rr轮训模式
  • HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数)
  • 其每个后端backend中最多支持4095个real server
  • 支持对real server权重动态调整
  • roundrobin为默认调度算法,此算法使用广泛
 vim /etc/haproxy/haproxy.cfg


listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance roundrobin                 
    server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5 
    server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 

2、Least Connection

  • leastconn加权的最少连接的动态
  • 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户 端连接)
  • 比较适合长连接的场景使用,比如:MySQL等场景。
 vim /etc/haproxy/haproxy.cfg


listen webserver_80
    bind 172.25.254.100:80
    mode http
    balance leastconn
    server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5 
    server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
4.3、其他算法

其它算法即可作为静态算法,又可以通过选项成为动态算法

1、Source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一 个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服 务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP 模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持 cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法 和一致性has

 vim /etc/haproxy/haproxy.cfg


 listen webserver_80
     bind 172.25.254.100:80
     mode http
     balance source
     server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5 
     server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5

2、URI

  • 基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后
  • 根据最终结果将请求转发到后端指定服务器
  • 适用于后端是缓存服务器场景
  • 默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性 hash

3、URL Param

url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器 总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商 通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server 如果无没key,将按roundrobin算法

4、Header (hdr)

  • 针对用户每个http头部(header)请求中的指定信息做hash
  • 此处由 name 指定的http首部将会被取出并做hash计算
  • 然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度
4.4、选择算法

选择负载均衡算法时,需要考虑应用的特点、服务器的配置、预期的流量模式等因素。例如,如果后端服务器性能差异较大,可以选择加权算法来平衡负载;如果需要保持用户会话,可以选择源地址哈希或一致性哈希算法。


五、 会话持久性

5.1、基于 Cookie 的会话持久性

HAProxy 可以利用 Cookie 来实现会话持久性,即 JSESSIONID 或其他用于追踪用户会话的 Cookie。当用户首次请求负载均衡器时,HAProxy 会插入一个特定的 Cookie,并在后续的请求中使用这个 Cookie 值来识别用户并将其定向到处理其初始请求的服务器。

特点:

  • 用户的每次请求都会携带 Cookie,由负载均衡器根据 Cookie 值进行路由。
  • 支持在 HTTP 模式下使用。
 vim /etc/haproxy/haproxy.cfg

 
listen webcluster
    bind *:80
    mode http
    balance roundrobin
    #balance uri
    #balance url_param name,userid
    #balance hdr(User-Agent)
    #hash-type consistent
    #redirect prefix http://www.baidu.com/
    cookie WEBCOOKIE insert nocache indirect
    server web1 172.25.254.10:80 cookie lee1 inter 2 fall 3 rise 5 weight 1
    server web2 172.25.254.20:80 cookie lee2 inter 2 fall 3 rise 5 weight 1
    #server web_sorry 172.25.254.100:8080 backup


[root@haproxy ~]# systemctl restart haproxy.service


#测试
[root@haproxy ~]# curl -b WEBCOOKIE=lee1 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl -b WEBCOOKIE=lee1 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl -b WEBCOOKIE=lee2 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl -b WEBCOOKIE=lee2 172.25.254.100
webserver2 - 172.25.254.20

5.2、验证cookie信息


六、HAProxy状态页


通过web界面,显示当前HAProxy的运行状态

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 


listen stats
    mode http
    bind *:9999
    stats enable
    stats refresh 3
    stats uri /status
    stats auth lee:lee


[root@haproxy ~]# systemctl restart haproxy.service

测试:


七、IP透传


web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。


7.1、四层IP透传(mode=tcp)nginx

主机配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 


listen webcluster
    bind *:80  # 这里需要更改为tcp
    mode tcp
    balance roundrobin
    #balance uri
    #balance url_param name,userid
    #balance hdr(User-Agent)
    #hash-type consistent
    #redirect prefix http://www.baidu.com/
    #cookie WEBCOOKIE insert nocache indirect
    server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
    server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1



[root@haproxy ~]# systemctl restart haproxy.service

服务器配置

[root@webserver2 ~]# vim /etc/nginx/nginx.conf


http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$proxy_protocol_addr"'  #记录透传过来的客户端IP
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server {
        listen       80 proxy_protocol;  #此处添加proxy_protocol
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;


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

测试

#客户端访问
[C:\~]$ curl 172.25.254.100
webserver2 - 172.25.254.20


[root@webserver2 ~]# tail /var/log/nginx/access.log
172.25.254.100 - - [11/Aug/2024:17:05:47 +0800] "GET / HTTP/1.1" 200 27 "-"  "curl/8.7.1" "-"
172.25.254.100 - - [11/Aug/2024:17:07:20 +0800] "GET / HTTP/1.1" 200 27 "-" "172.25.254.1""curl/8.7.1" "-"

7.2、七层透传(mode=http)nginx

主机配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg


listen webcluster
    bind *:80
    mode http
    balance roundrobin
    #balance uri
    #balance url_param name,userid
    #balance hdr(User-Agent)
    #hash-type consistent
    #redirect prefix http://www.baidu.com/
    #cookie WEBCOOKIE insert nocache indirect
    server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 1
    server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1


[root@haproxy ~]# systemctl restart haproxy.service 

客户端访问

[C:\~]$ curl 172.25.254.100
webserver2 - 172.25.254.20

服务器配置

[root@webserver2 ~]# > /var/log/nginx/access.log
[root@webserver2 ~]# cat /var/log/nginx/access.log
172.25.254.100 - - [10/Aug/2024:10:34:36 +0800] "GET / HTTP/1.1" 200 27 "-" "curl/7.76.1" "-"

7.3、七层透传(mode=http)apache

主机配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg


listen webcluster
    bind *:80
    mode http
    balance roundrobin
    #balance uri
    #balance url_param name,userid
    #balance hdr(User-Agent)
    #hash-type consistent
    #redirect prefix http://www.baidu.com/
    #cookie WEBCOOKIE insert nocache indirect
    server web1 172.25.254.10:80 send-proxy check inter 2 fall 3 rise 5 weight 1
    server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1


[root@haproxy ~]# systemctl restart haproxy.service 

服务器配置

[root@webserver1 ~]# vim /etc/httpd/conf/httpd.conf 


<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


[root@webserver1 ~]# systemctl restart httpd

测试

#客户端访问
[C:\~]$ curl 172.25.254.100
webserver1 - 172.25.254.10


[root@webserver1 ~]# > /etc/httpd/logs/access_log
[root@webserver1 ~]# tail /etc/httpd/logs/access_log 
172.25.254.200 172.25.254.100 - - [10/Aug/2024:10:42:53 +0800] "GET / HTTP/1.1" 403 27 "-" "curl/7.76.1"

八、ACL


访问控制列表ACL,Access Control Lists)

  • 是一种基于包过滤的访问控制技术
  • 它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过 滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内 容进行匹配并执行进一步操作,比如允许其通过或丢弃。

8.1、haproxy的acl基本访问控制

环境准备:

主机名 IP   角色  
haproxy172.25.254.100 haproxy负载均衡器
webserver1 172.25.254.10服务器 
webserver2    172.25.254.20服务器 
client172.25.254.50客户端

haproxy配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 


frontend webcluster
    bind *:80
    mode http
    acl test hdr_end(host) -i .org
    use_backend webcluster-host if test
    default_backend default-host

backend webcluster-host
    mode http
    server web1 172.25.254.10:80 check inter 2 fall 2 rise 5

backend default-host
    mode http
    server web2 172.25.254.20:80 check inter 2 fall 2 rise 5


[root@haproxy ~]# systemctl restart haproxy.service 

客户端配置

[root@client ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.50	client.timinglee.org
172.25.254.10   www.haha.org
172.25.254.20   www.hello.com

测试:

[root@client ~]# curl www.haha.org
webserver1 - 172.25.254.10
[root@client ~]# curl www.hello.com
webserver2 - 172.25.254.20

8.2、基于域名的访问控制

haproxy配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg


frontend webcluster
    bind *:80
    mode http
    acl domain hdr_dom(host) -i www.haha.org
    use_backend webcluster-host if domain
    default_backend default-host


[root@haproxy ~]# systemctl restart haproxy.service

测试:

[root@client ~]# curl www.haha.org
webserver1 - 172.25.254.10
[root@client ~]# curl www.haha.com
webserver2 - 172.25.254.20

8.3、基于IP的访问控制

haproxy配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 


frontend webcluster
    bind *:80
    mode http
    acl ctrl_ip src 172.25.254.200 172.25.254.20 192.168.0.0/24
    use_backend webcluster-host if ctrl_ip
    default_backend default-host


[root@haproxy ~]# systemctl restart haproxy.service

测试:

[root@client ~]# curl 172.25.254.100
webserver1 - 172.25.254.10


[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20

8.4、基于IP的访问控制之黑名单

haproxy配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg


frontend webcluster
    bind *:80
    mode http    				
    acl ctrl_ip src 172.25.254.200 172.25.254.20 192.168.0.0/24
    # use_backend webcluster-host if ctrl_ip
    http-request deny if ctrl_ip
    default_backend default-host

    
[root@haproxy ~]# systemctl restart haproxy.service 

测试:

[root@client ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@client ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@client ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@client ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@client ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@client ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@client ~]# curl 172.25.254.100
webserver2 - 172.25.254.20

8.5、基于浏览器的访问控制

haproxy配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 


frontend webcluster
    bind *:80
    mode http
    acl badwebrowers hdr_sub(User-Agent) -i curl wget
    http-request deny if badwebrowers
    default_backend default-host


[root@haproxy ~]# systemctl restart haproxy.service 

测试:


8.6、基于文件后缀名来实现动静分离

haproxy配置

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 


frontend webcluster
    bind *:80
    mode http
    acl static path_end -i .html .jpg .png .css .js
    acl php path_end -i .php
    use_backend webcluster-host if php 
    default_backend default-host

    
[root@haproxy ~]# systemctl restart haproxy.service 

webserver1配置

[root@webserver1 ~]# dnf install php -y
[root@webserver1 ~]# systemctl disable --now nginx.service 
[root@webserver1 ~]# systemctl restart httpd.service 
[root@webserver1 ~]# vim /var/www/html/index.php
[root@webserver1 ~]# cat /var/www/html/index.php 
<?php
        phpinfo();
?>

测试:


九、haproxy自定义错误页面


haproxy配置

[root@haproxy ~]# rpm -ql haproxy | grep http
/usr/share/doc/haproxy/design-thoughts/http2.txt
/usr/share/doc/haproxy/design-thoughts/http_load_time.url
/usr/share/doc/haproxy/internals/http-cookies.txt
/usr/share/doc/haproxy/internals/http-docs.txt
/usr/share/doc/haproxy/internals/http-parsing.txt
/usr/share/doc/haproxy/option-http_proxy.cfg
/usr/share/haproxy/400.http
/usr/share/haproxy/403.http
/usr/share/haproxy/408.http
/usr/share/haproxy/500.http
/usr/share/haproxy/502.http
/usr/share/haproxy/503.http
/usr/share/haproxy/504.http

[root@haproxy ~]# mkdir  /etc/haproxy/errorpage/
[root@haproxy ~]# cp /usr/share/haproxy/503.http /etc/haproxy/errorpage/503.http
[root@haproxy ~]# vim /etc/haproxy/errorpage/503.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html><body><h1>hahahahahahaha</h1>
No server is available to handle this request.
</body></html>

# 配置haproxy主配置文件
[root@haproxy conf.d]# vim /etc/haproxy/haproxy.cfg 

    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
    errorfile   503  /etc/haproxy/errorpage/503.http
    
[root@haproxy conf.d]# systemctl restart haproxy.service 

服务器

[root@webserver1 ~]# systemctl stop httpd.service


[root@webserver2 ~]# systemctl stop nginx

测试


十、haproxy之https网站加密


haproxy配置


[root@haproxy ~]# mkdir -p /etc/haproxy/certs

[root@haproxy ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/shanxin.org.key -x509 -days 365 -out /etc/haproxy/certs/shanxin.org.crt

[root@haproxy ~]# ls  /etc/haproxy/certs/
shanxin.org.crt  shanxin.org.key  shanxin.org.pem

[root@haproxy ~]# cat /etc/haproxy/certs/shanxin.org.key /etc/haproxy/certs/shanxin.org.crt > /etc/haproxy/certs/shanxin.org.pem
[root@haproxy ~]# ll /etc/haproxy/certs/shanxin.org.pem 
-rw-r--r-- 1 root root 3123  8月 10 17:21 /etc/haproxy/certs/shanxin.org.pem

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 

listen web-https
    bind *:443 ssl crt /etc/haproxy/certs/shanxin.org.pem
    mode http
    balance roundrobin
    server web1 172.25.254.10:80 check inter 2 fall 2 rise 5 
    server web2 172.25.254.20:80 check inter 2 fall 2 rise 5

[root@haproxy ~]# systemctl restart haproxy.service 

服务器配置

[root@webserver1 ~]# systemctl restart httpd.service 


[root@webserver2 ~]# systemctl restart nginx

测试


十一、总结


11.1、优势与局限


11.1.1、HAProxy 的优势
  1. 高性能:HAProxy 以其高性能而闻名,能够处理大量的并发连接和高流量负载,非常适合需要高吞吐量的场景。
  2. 灵活性:支持四层和七层负载均衡,以及多种负载均衡算法,可以根据不同的业务需求灵活选择。
  3. 可靠性:具备健康检查和自动故障转移功能,提高了系统的可用性和容错能力。
  4. 安全性:提供 SSL 终端服务,可以在 HAProxy 层终止 SSL 连接,保护后端服务器,同时支持 Web 应用防火墙等安全特性。
  5. 可扩展性:通过简单的配置更改即可扩展新的服务和应用,支持动态调整和水平扩展。
  6. 监控与统计:内置监控页面,提供实时的统计信息和日志记录,方便运维监控和管理。

11.1.2、HAProxy 的局限性
  1. 配置复杂性:功能丰富也意味着配置项较多,对于初学者来说可能有一定的学习曲线。
  2. 资源消耗:虽然性能优异,但在处理极高并发时仍然需要较多的系统资源。
  3. 单一实例:HAProxy 通常以单一实例运行,虽然支持多进程,但在某些高可用性场景下可能需要额外的配置或第三方解决方案。
  4. 特定协议支持:虽然支持广泛的协议,但对于一些特殊或新兴协议可能需要额外的配置或不支持。

11.1.3、如何克服局限
  1. 文档和社区支持:利用 HAProxy 丰富的文档和活跃的社区来学习最佳配置实践。
  2. 硬件优化:通过升级服务器硬件来提供更多的计算和网络资源,以满足 HAProxy 的资源需求。
  3. 高可用性配置:使用 HAProxy 提供的多进程或配合使用诸如 Keepalived、Pacemaker 等高可用性解决方案。
  4. 持续更新:关注 HAProxy 的更新,以获得对新协议和特性的支持。

11.2、结论

HAProxy 在现代网络架构中扮演着至关重要的角色。它不仅提供了强大的负载均衡功能,还通过其高性能、灵活性和可靠性,确保了业务的连续性和用户的访问体验。随着云计算和微服务架构的兴起,HAProxy 也在不断发展,以适应新的技术挑战和业务需求。

尽管存在一些局限性,但通过合理的配置、硬件优化和社区支持,可以有效地克服这些问题。HAProxy 的持续创新和改进,使其成为了构建可扩展、安全、高效网络服务的理想选择。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值