haproxy七层代理

一:haproxy简介

        haproxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性负载均衡,以及基于TCPHTTP的应用程序代理

        haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

二:负载均衡

        负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。

二层负载均衡(mac)

        用于虚拟mac地址方式,外部对虚拟mac地址请求,负载均衡接收后分配给后端实际的mac地址响应。

三层负载均衡(ip)

        一般用于虚拟ip地址的方式,外部对虚拟ip地址请求,负载均衡接收后分配给后端实际的ip地址响应。

四层负载均衡(tcp)

        主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等。

  • 工作原理:四层负载均衡器在网络层(IP 层)和传输层(TCP/UDP 层)进行操作,它根据源 IP 地址、目标 IP 地址、端口号等信息进行流量分发,不涉及应用层数据。
  • 优点:处理速度快,因为它只需查看数据包头部的信息而不需解析数据包的内容。
  • 缺点:功能相对简单,不能根据应用层的信息(如 URL、Cookie)做出复杂的调度决策。

七层负载均衡器(http)

        位于 OSI 模型的最高层,即应用层,此负载均衡器支持多种协议,如 HTTP、FTP、SMTP 等。七层负载均衡器可根据报文内容(例如 URL、Cookie、主机名)进行流量分发,如常见的 HAProxy、Nginx。

  • 工作原理:七层负载均衡器在应用层进行操作,可以解析应用层的内容,根据具体的请求信息(如 HTTP 头、URL 路径、Cookie 等)进行更加精细的负载均衡。
  • 优点:功能强大,能够进行复杂的调度决策,适用于需要根据应用层数据进行调度的场景。
  • 缺点:处理开销较大,因为需要解析和分析应用层的数据。

三.haproxy的安装和环境搭建

主机安装haproxy

[root@localhost ~]# yum install haproxy

进入配置文件编辑,设置前端http,指定web1主机和web2主机

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

启动haproxy服务,检测是否成功

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

客户端web1

安装nginx

[root@localhost ~]# yum install nginx

将内容输入目录底下的文件

[root@localhost ~]# echo webserve1 - 172.25.254.10 > /usr/share/nginx/html/index.html

启动nginx服务

[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# systemctl status  nginx.service 

客户端web2

安装nginx

[root@localhost ~]# yum install nginx

将内容输入目录底下的文件

[root@localhost ~]# echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html 

启动nginx服务

[root@localhost ~]# systemctl restart nginx.service 
[root@localhost ~]# systemctl status  nginx.service 

使用主机进行测试,haproxy环境搭建成功

[root@localhost ~]# curl 172.25.254.10
[root@localhost ~]# curl 172.25.254.20

四:global 配置参数说明

参数类型作用
chroot全局锁定运行目录
deamon全局以守护进程运行
user, group, uid, gid全局

运行haproxy的用户身份

stats socket

全局

套接字文件

nbproc N

全局

开启的haproxy worker 进程数,默认进程数是一个

nbthread 1 (和nbproc互斥)

全局

指定每个haproxy进程开启的线程数,默认为每个进程一个线程

cpu-map 1 0

全局

绑定haproxy worker 进程至指定CPU,将第1work进程绑定至0CPU

cpu-map 2 1

全局

绑定haproxy worker 进程至指定CPU,将第2work进程绑定至1CPU

maxconn N

全局

每个haproxy进程的最大并发连接数

maxsslconn N

全局

每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下

maxconnrate N

全局

每个进程每秒创建的最大连接数量

spread-checks N

全局

后端server状态check随机提前或延迟百分比时间,建议2- 5(20%-50%)之间,默认值0

pidfile

全局

指定pid文件路径

log 127.0.0.1 local2 info

全局

定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个

4.1:设置多进程(nbproc N)

进入配置文件global模块中配置全局,haproxy默认情况下是一个进程

[root@localhost ~]# pstree -p | grep haproxy

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

[root@localhost ~]# systemctl restart haproxy.service#重新启动

[root@localhost ~]# pstree -p |grep haproxy

 

4.2:进程至指定CPU(cpu-map 

[root@localhost ~]# systemctl restart haproxy.service#重新启动

[root@localhost ~]# pstree -p |grep haproxy

4.3:查看进程中有几个子进程(cat)

[root@localhost ~]# cat /proc/17422/status | grep -i thread

4.5:设置多线程(nbthread N)

注意:多线程和多进程不可以同时设置,两者相互排斥

进入配置文件,重启服务查看进程

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

五:haproxy的状态界面

启动状态页

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

重新启动haproxy

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

注意:防火墙关闭,关闭selinux,将VIP、LVS等内容清理干净!!!!!
删除所有设备的VIP,清空所有LVS设置,关闭keepalived!!!

[root@localhost ~]#systemctl stop firewalld

[root@localhost ~]#setenforce 0

成功进入状态页

haproxy的状态监控页面编辑可以加下面参数

    listen admin_stats
    stats   enable      
    bind    *:9999    //监听的ip端口       
    mode    http    //开关
    option  httplog
    log     global
    maxconn 10       
    stats   refresh 30s   //统计页面自动刷新时间       
    stats   uri /status    //访问的status   ip:9999/status       
    stats   realm haproxy       
    stats   auth lee:lee  //认证用户名和密码
    stats   hide-version   //隐藏HAProxy的版本号
    stats   admin if TRUE   //管理界面,如果认证成功了,可通过webui管理节

六:基于cookie的会话保持

        cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替。

注意:不支持tcp mode,使用http mode

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

 重新启动程序

[root@localhost ~]#  service haproxy restart

使用浏览器访问地址

也可以使用虚拟机进行检测,基于cookie的会话保持完成。

[root@nginx ~]# curl -b WEBCOOKIE=lee1 172.25.254.100

七:自定义错误文件

获取错误文件的默认路径

[root@localhost ~]# rpm -ql haproxy |grep http

新建目录存放文件

[root@localhost errorpage]# mkdir /etc/haproxy/errorpage/503.http -p

编辑访问路径错误文件的内容

[root@localhost errorpage]# vim /etc/haproxy/errorpage/503.http

HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html;charset=UTF-8

<html><body><h1>什么动物生气最安静</h1>
大猩猩!!
</body></html>

进入配置文件,插入新建错误文件路径,必须和存放文件一模一样

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

重新启动服务

[root@localhost ~]# systemctl restart haproxy.service
使用浏览器访问主机地址

八:hapoxy的四层负载示例

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

客户端1号MySQL

[root@localhost ~]# yum install mariadb-server 

进入默认配置文件编辑信息,id号为1

[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf 

重新启动服务

进入数据库查看id

[root@localhost ~]# mysql

MariaDB [(none)]> SELECT @@server_id;

同理客户端2号MySQL

进入默认配置文件编辑信息,id号为2

[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf 

然后将两个客户端改为远程连接

rs1 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';

rs2 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';

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

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

测试

[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like 'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs2 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like 'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs1 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值