全网超详细攻略-从入门到精通haproxy七层代理

目录

一.haproxy概述

1.1 haproxy简介

1.2 haproxy的主要特性

1.3 haproxy的优缺点

二.负载均衡介绍

2.1 什么是负载均衡

2.2 为什么用负载均衡

2.3 负载均衡类型

2.3.1 四层负载均衡

2.3.2 七层负载均衡

2.3.3 四层和七层的区别

三.haproxy的安装及服务

3.1 实验环境

3.2 haproxy的基本配置信息

3.2.1 haproxy的基本部署

3.2.2 global配置

3.2.2.1 参数说明

3.2.2.2 haproxy的全局配置参数

3.2.2.3 定向haproxy日志

3.2.3 proxies配置

3.2.3.1 参数说明

3.3 socat 工具

四. haproxy的算法

4.1.静态算法

4.1.1 static-rr:基于权重的轮询调度

4.1.2 first

4.2 动态算法

4.2.1 roundrobin(常用)

4.2.2 leastconn

4.3 其他算法

4.3.1 source

4.3.1.1 map-base 取模法

4.3.1.2 一致性hash

4.3.2 uri

4.3.3 url_param

4.3.4 hdr

4.3.5 算法总结

五.高级功能及配置

5.1 基于cookie的会话保持

5.1.1 配置选项

5.2 HAProxy状态页

5.2.1 状态页配置项

5.3 IP透传

5.3.2 七层IP透传

5.3.3 四层IP透传

5.4 ACL

利用ACL做动静分离等访问控制


一.haproxy概述

1.1 haproxy简介

haproxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。haproxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

支持的功能:

  • TCP 和 HTTP反向代理
  • SSL/TSL服务器
  • 可以针对HTTP请求添加cookie,进行路由后端服务器
  • 可平衡负载至后端服务器,并支持持久连接
  • 支持所有主服务器故障切换至备用服务器 keepalive
  • 支持专用端口实现监控服务
  • 支持停止接受新连接请求,而不影响现有连接
  • 可以在双向添加,修改或删除HTTP报文首部字段
  • 响应报文压缩
  • 支持基于pattern实现连接请求的访问控制
  • 通过特定的URI(url)为授权用户提供详细的状态信息

1.2 haproxy的主要特性

  • 高性能负载均衡: HAProxy通过优化的事件驱动引擎,能够以最小的系统资源开销处理大量并发请求。它支持多种负载均衡算法,如轮询、最少连接、源IP哈希等,可根据实际业务需求灵活配置
  • 健康检查与故障恢复: HAProxy具备完善的后端服务器健康检查机制,可以根据响应时间、错误率等因素自动剔除不健康的后端节点,并在节点恢复时重新将其加入到服务池中,确保服务连续性
  • 会话保持与亲和性: 为了保证用户的会话一致性,HAProxy支持基于cookie或源IP地址的会话保持功能,确保同一客户端的请求被转发到同一台后端服务器进行处理
  • 安全性与SSL卸载: HAProxy支持SSL/TLS加密传输,可对HTTPS流量进行解密并透明地分发至后端服务器,同时也能终止SSL连接以减轻服务器的加密计算压力
  • 高级路由与策略: 根据HTTP请求头、URL路径、内容类型等条件,HAProxy可以执行复杂的路由规则和ACL策略,使得负载均衡更加智能化和精准化
  • 日志记录与监控: HAProxy提供丰富的日志记录选项,可通过syslog、CSV格式输出等方式收集统计数据,便于运维人员实时监控系统状态和性能指标

1.3 haproxy的优缺点

  • 优点

高性能:HAProxy是一个高性能的负载均衡器,可以处理大量的并发连接

灵活性:HAProxy支持多种负载均衡算法,如轮询、加权轮询、最少连接等,可以根据实际需求选择合适的算法

高可用性:HAProxy可以检测服务器的健康状态,如果某个服务器出现故障,它可以自动将

流量转移到其他健康的服务器,从而保证服务的高可用性

安全性:HAProxy可以作为反向代理,隐藏后端服务器的真实IP地址,提高系统的安全性。

  • 缺点

单点故障:如果HAProxy本身出现故障,可能会导致整个系统的服务不可用

配置复杂:HAProxy的配置相对复杂,需要一定的学习成本

性能瓶颈:虽然HAProxy的性能很高,但在处理大量并发连接时,可能会成为系统的性能瓶颈

功能单一:只支持做负载均衡的调度服务器,不支持正则处理,不能实现动静分离,也不能

做web服务器

总的来说,HAProxy是一个强大的负载均衡器,可以提高系统的可用性、性能和安全性,但也需要注意其可能存在的缺点

二.负载均衡介绍

2.1 什么是负载均衡

负载均衡: Load Balance ,简称 LB ,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态

2.2 为什么用负载均衡

  • Web服务器的动态水平扩展-->对用户无感知
  • 增加业务并发访问及处理能力-->解决单服务器瓶颈问题
  • 节约公网IP地址-->降低IT支出成本
  • 隐藏内部服务器IP-->提高内部服务器安全性
  • 配置简单-->固定格式的配置文件
  • 功能丰富-->支持四层和七层,支持动态下线主机
  • 性能较强-->并发数万甚至数十万

2.3 负载均衡类型

2.3.1 四层负载均衡

1. 通过 ip+port 决定负载均衡的去向。
2. 对流量请求进行 NAT 处理,转发至后台服务器。
3. 记录 tcp udp 流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。
4. 支持四层的软件
  • lvs:重量级四层负载均衡器。
  • Nginx:轻量级四层负载均衡器,可缓存。(nginx四层是通过upstream模块)
  • Haproxy:模拟四层转发。

2.3.2 七层负载均衡

1. 通过虚拟 ur| 或主机 ip 进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2. 代理后台服务器与客户端建立连接,如 nginx 可代理前后端,与前端客户端 tcp 连接,与后端服务器建立
tcp 连接 ,
3. 支持 7 层代理的软件:
  • Nginx:基于http协议(nginx七层是通过proxy_pass)
  • Haproxy:七层代理,会话保持、标记、路径转移等。

2.3.3 四层和七层的区别

所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决定怎么样转发流量
四层的负载均衡,就是通过发布三层的 IP 地址( VIP ),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT 处理,转发至后台服务器,并记录下这个 TCP 或者 UDP 的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。
七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web 服务器的负载均衡,除了根据 VIP 80 端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。

1.分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下

2.性能 :四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应用层报文消息内容,识别URLCookieHTTP header等信息。、

3.原理 :四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等。

4.功能类比:四层负载均衡类似于路由器;七层类似于代理服务器。

5.安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击

三.haproxy的安装及服务

3.1 实验环境

                 

功能 ip
client nat-eth0:172.25.254.10
haproxy nat-eth0:172.25.254.100,仅主机-eth1:192.168.0.100
webserver1 仅主机-eth0:192.168.0.10
webserver2 仅主机-eth0:192.168.0.20

所有主机关闭防火墙和selinux

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

两台webserver安装nginx

#webserver1
[root@webserver1 ~]# yum install nginx -y
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

#webserver2
[root@webserver2 ~]# yum install nginx -y
[root@webserver2 ~]# echo webserver2 - 192.168.0.20 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

#client访问
[root@client ~]# curl 192.168.0.10
webserver1 - 192.168.0.10
[root@client ~]# curl 192.168.0.20
webserver2 - 192.168.0.20

3.2 haproxy的基本配置信息

官方文档: http://cbonte.github.io/haproxy-dconv/
HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是:
global:全局配置段
  • 进程及安全配置相关的参数
  • 性能调整相关参数
  • Debug参数
proxies:代理配置段
  • defaults:为frontend, backend, listen提供默认配置
  • frontend:前端,相当于nginx中的server {}
  • backend:后端,相当于nginx中的upstream {}
  • listen:同时拥有前端和后端配置,配置简单,生产推荐使用

3.2.1 haproxy的基本部署

#在haproxy主机上安装haproxy
[root@haproxy ~]# yum install haproxy -y

#编辑配置文件
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
#上面内容忽略
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend webcluster    #设定前端
    bind *:80
    mode http
    use_backend webcluster-host

backend webcluster-host     #设定后端
    balance roundrobin
    server  web1 192.168.0.10:80
    server  web2 192.168.0.20:80

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

#client访问测试
[root@client ~]# curl 172.25.254.100
webserver1 - 192.168.0.10
[root@client ~]# curl 172.25.254.100
webserver2 - 192.168.0.20
[root@client ~]# curl 172.25.254.100
webserver1 - 192.168.0.10

#另一种方法,将前后端合并,将之前写的注释掉,写入新内容

listen webcluster
   bind *:80
   mode http
   balance roundrobin
    server  web1 192.168.0.10:80
    server  web2 192.168.0.20:80

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

#client访问,效果一样
[root@client ~]# curl 172.25.254.100
webserver1 - 192.168.0.10
[root@client ~]# curl 172.25.254.100
webserver2 - 192.168.0.20
[root@client ~]# curl 172.25.254.100

3.2.2 global配置

3.2.2.1 参数说明
参数
作用
chroot
全局
锁定运行目录
deamon
全局
以守护进程运行
user, group, uid, gid
全局
运行 haproxy 的用户身份
stats socket
全局
套接字文件
为了配置 HAProxy 作为七层(应用层)代理,需要在 HAProxy 的配置文件中进行相关设置。以下是详细的配置步骤和示例: ### 配置 HAProxy 作为七层代理 1. **启用 HTTP 模式** HAProxy 需要工作在 HTTP 模式下,以便解析应用层内容(如 URL、HTTP 头等)。在配置文件中,设置 `mode http` 来启用 HTTP 模式。 2. **设置前端(frontend)** 前端部分定义了 HAProxy 接收客户端请求的地址和端口。可以使用 `bind` 指令指定监听的 IP 地址和端口,并设置 `mode http`。 3. **设置后端(backend)** 后端部分定义了 HAProxy 如何将请求转发到后端服务器。可以使用 `server` 指令指定后端服务器的 IP 地址和端口,并设置 `mode http`。 4. **透传客户端真实 IP** 为了将客户端的真实 IP 地址传递给后端服务器,可以在 HAProxy 的配置中添加 `http-request set-header X-Forwarded-For %[src]`,这样 HAProxy 会在请求头中添加 `X-Forwarded-For` 字段,其值为客户端的 IP 地址。 5. **负载均衡策略(可选)** 如果有多个后端服务器,可以使用负载均衡策略来分配请求。例如,使用 `balance roundrobin` 实现轮询负载均衡。 ### 示例配置 以下是一个完整的 HAProxy 配置示例,展示了如何配置 HAProxy 作为七层代理: ```haproxy global log 127.0.0.1 local0 maxconn 4096 user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull retries 3 timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http_front bind *:80 mode http default_backend http_back backend http_back mode http balance roundrobin server server1 172.25.254.40:80 check server server2 172.25.254.50:80 check http-request set-header X-Forwarded-For %[src] ``` ### 解释 - **global** 部分设置了全局配置,包括日志记录、最大连接数、用户和组等。 - **defaults** 部分定义了默认的连接超时时间和日志记录选项。 - **frontend http_front** 定义了前端部分,绑定到所有 IP 地址的 80 端口,并设置 `mode http`。 - **backend http_back** 定义了后端部分,使用 `balance roundrobin` 实现轮询负载均衡,并指定了两个后端服务器的 IP 地址和端口。 - `http-request set-header X-Forwarded-For %[src]` 用于将客户端的真实 IP 地址添加到请求头中。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值