haproxy实现代理和负载均衡

HaProxy介绍:

haproxy是法国开发者威利塔罗在2000年使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计,目前最新TLS版本为2.2。

haproxy是可提供可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。haproxy非常适用于并发大(并发达1W以上)web站点,这些站点通常又需要会话保持或七层处理,haproxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。

LVS,nginx,haproxy对比:

LVS是内核中的功能,nginx和haproxy是第三方实现的功能。

LVS只能提供四层负载均衡无法提供七层负载,(无法控制7层协议http头部url等),功能单一。

nginx,haproxy可以实现4层和7层负载,功能较多,但是性能不如LVS,LVS>haproxy>nginx

haproxy对比nginx性能优越,功能单一,haproxy只做反向代理。

LVS没有后端服务器健康性检测,nginx和haproxy有后端服务器健康性检测。

安装haproxy:

三种方式:yum,rpm和编译

yum安装:yum install -y haproxy

[root@Node1 ~]#:yum install -y haproxy #安装

[root@Node1 ~]#:systemctl start haproxy #启动

[root@Node1 ~]#:systtemctl status haproxy #查看是否启动

可以rpm -qc haproxy查看配置文件

rpm安装:

错误:软件包:rh-haproxy18-haproxy-1.8.24-3.el7.x86_64 (/rh-haproxy18-haproxy-1.8.24-3.el7.x86_64)

rpm安装haproxy需要需要:rh-haproxy18-runtime

需要依赖包

[root@Node1 ~]#:mkdir /hprxy; cd /phrxy

#准备一个runtime包,直接拖进来到目录下,然后下载haproxy包

[root@Node1 hprxy]#:wget http://mirror.centos.org/centos/7/sclo/x86_64/rh/Packages/r/rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm

[root@Node1 hprxy]#:ls

rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm

[root@Node1 hprxy]#:yum install -y rh-haproxy18-runtime-3.1-2.el7.x86_64.rpm

[root@Node1 hprxy]#:yum install -y rh-haproxy18-haproxy-1.8.24-3.el7.x86_64.rpm

#启动服务

[root@Node1 hprxy]#:systemctl start rh-haproxy18-haproxy.service

查看状态:systemctl status rh-haproxy18-haproxy.service发现启动了

可以通过rpm -qc 服务名;rpm -ql 服务名,查看配置文件和列出文件相关文件。

编译安装haproxy:

在第二台机器7-2上编译安装,7-1和7-3作为web真实服务器

由于CentOS7 之前版本自带的lua版本比较低并不符合haproxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装haproxy,所以需要先安装lua环境。

[root@Node2 ~]#:mkdir /data ; cd /data

#查看当前lua版本,是5.1版本的。

[root@Node2 data]#:lua -v

Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio

#可以现在安装lua新版本:wget https://www.lua.org/ftp/lua-5.4.6.tar.gz

[root@Node2 data]#:wget https://www.lua.org/ftp/lua-5.4.6.tar.gz

#准备安装包:haproxy-2.4.25.tar,直接拖进来/data/下

[root@Node2 data]#:ls

haproxy-2.4.25.tar.gz lua-5.4.6.tar.gz

#解压

[root@Node2 data]#:tar xf lua-5.4.4.tar.gz

#做个软链接

[root@Node2 data]#:ln -s lua-5.4.6 lua

[root@Node2 data]#:cd lua-5.4.4/src/

[root@Node2 src]#:make all test

#查看版本信息

[root@Node2 src]#:./lua -v

Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio #5.4版本

#安装haproxy

#安装依赖环境:

[root@Node2 data]#:yum -y install gcc openssl-devel pcre-devel systemd-devel

#解压

[root@Node2 data]#:tar xf haproxy-2.4.25.tar.gz

[root@Node2 data]#:cd haproxy-2.4.25/

#创建lua目录用于自动补全功能

[root@Node2 haproxy-2.4.25]#:mkdir /usr/local/lua

[root@Node2 haproxy-2.4.25]#:cp -r src/ /usr/local/lua/

[root@Node2 haproxy-2.4.25]#:make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/data/lua/src/ LUA_LIB=/data/lua/src/

#安装,指定路径

[root@Node2 haproxy-2.4.25]#:make install PREFIX=/apps/haproxy

#软链接,自动补全

[root@Node2 haproxy-2.4.25]#:ln -s /apps/haproxy/sbin/haproxy /usr/sbin/

#haproxy -v可以查看版本信息。haproxy -h查看帮助

#写一个自启动文件:

[root@Node2 haproxy-2.4.25]#:vim /usr/lib/systemd/system/haproxy.service

[Unit]

Description=HAProxy Load Balancer

After=syslog.target network.target

[Service]

ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q #-c检查语法。-f指定配置文件,也可以跟文件夹

ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid #-p指定pid文件

ExecReload=/bin/kill -USR2 $MAINPID #重新加载

LimitNOFILE=100000 #打开文件数

[Install]

WantedBy=multi-user.target

[root@Node2 haproxy-2.4.25]#:systemctl daemon-reload

#创建主配置文件目录。需要手动创建

[root@Node2 haproxy-2.4.25]#:mkdir /etc/haproxy

#创建主配置文件/etc/haproxy/haproxy.cfg

global:全局配置段

进程及安全配置相关的参数

性能调整相关参数

Debut参数

proxies:代理配置段

defaults:为frontend,backend,listen提供默认配置

frontend:前端,相当于nginx中的server{},定义虚拟机,监听分配请求

backend:后端,相当于nginx中的upstream{},真实服务器

listen:同时拥有前端和后端配置,配置简单,生产推荐使用,前端和后端,更简单。

主配置文件配置块:

[root@Node2 haproxy-2.4.25]#:vim /etc/haproxy/haproxy.cfg

#全局模块,

global

maxconn 100000 #最大连接数

chroot /apps/haproxy #禁锢,haproxy进程,只可以访问,/apps/haroxy文件夹

stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #指明sock文件的位置

#指明uid和gid

uid 99

gid 99

#后台方式,守护进程

daemon

#进程数, 开启几个进程

#nbproc 4 #nbthread线程与nbproc进程不能同时指定

#cpu-map 1 0

#cpu-map 2 1

#cpu-map 3 2

#cpu-map 4 3

pidfile /var/lib/haproxy/haproxy.pid #指定PID路径

log 127.0.0.1 local3 info #日志

defaults

option http-keep-alive

option forwardfor

maxconn 100000

mode http

timeout connect 300000ms

timeout client 300000ms

timeout server 300000ms

#状态页

listen stats

mode http 支持7层http

bind 0.0.0.0:9999

stats enable

log global

stats uri /haproxy-status

stats auth haadmin:123456 #用户名和密码

listen web

bind 0.0.0.0:8899

mode http

log global

server web1 192.168.114.10:80

server web2 192.168.114.30:80

#指定一个pid路径

[root@Node2 haproxy-2.4.25]#:mkdir /var/lib/haproxy

#创建用户haproxy

[root@Node2 haproxy-2.4.25]#:useradd -r -s /sbin/nologin haproxy

#启动haproxy

[root@Node2 haproxy-2.4.25]#:systemctl enable --now haproxy

起来之后查看状态:

listen中说明了代理服务器,和后端真实服务器。

而frontend和backup就把两者分离出来。listen相当于两者的结合。

7-1和7-3作为web服务器。下载httpd:

yum install -y httpd

systemctl start httpd

7-1:echo 7-1 > /var/www/html/index.html

7-3:echo 7-3 > /var/www/html/index.html

systemctl status httpd查看状态是否都起来了。并且能curl通

测试是否实现了代理和负载均衡:在浏览器也可以在本台服务器上curl 192.168.114.20:8899要跟上端口号:8899。因为我们在listen中设置的就是8899端口号。

状态页:

在配置文件中有以下三个配置,端口号,uri,访问控制。在浏览器地址栏中输入:192.168.114.20:9999/haproxy-status

bind 0.0.0.0:9999

stats uri /haproxy-status

stats auth haadmin:123456

**进程:**发现进程是一个进程下三个线程

修改进程配置,nbproc 4就是有四个进程:

重启systemctl restart haproxy。

通过进程树查看一下:

日志:

vim /etc/rsyslog.conf打开文件开启15和16行。

在/etc/rsyslog.conf文件的73行下添加一行,指定local3,并制定日志文件路径在/var/log/haproxy.log

重启systemctl restart haproxy rsyslog

使用浏览器访问192.168.114.20:8899

在日志文件中tail -f /var/log/haproxy.log实时查看

不使用listen,而使用frontend和backup两个模块:相当于把listen分开写,frontend是代理端,backup是服务端,负载均衡的web服务器。把listen注释掉或者删除。

测试:由于我们指定的80端口,直接是curl 192.168.114.20不需要加端口,默认就是80。

其中listen或者说frontend和backup可以放在子配置文件中:

创建一个子配置文件:mkdir /etc/haproxy/conf.d

直接写在子配置文件中,但haproxy不像nginx可以在主配置文件中写入include包含模块。haproxy主配置文件不支持include。需要将子配置文件写在/usr/lib/systemd/system/haproxy.service文件中指明。

把主配置文件中的注释掉。修改文件:vim /usr/lib/systemd/system/haproxy.service

重新加载配置文件,重启服务:

[root@Node2 haproxy]#:systemctl daemon-reload

[root@Node2 haproxy]#:systemctl restart haproxy

访问测试:

haproxy也有跳转的功能,在server后加入check redir http://www.baidu.com

自动跳转到百度主页,如果浏览器跳转不到(但也会显示标题头部是百度的),可以使用内置火狐浏览器:192.168.114.20。将自动跳转到百度首页。

---end---

相关推荐
龙龙博客27 分钟前
LVS+Keepalived 实现高可用负载均衡
运维·负载均衡·lvs
职略28 分钟前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
Iᴛ's ᴅᴇsᴛɪɴʏ²⁸.2 小时前
Nginx反向代理和负载均衡
运维·nginx·负载均衡
cui_win3 小时前
nginx-限制客户端并发数
运维·nginx·限流·limit_conn·限制并发
King's King4 小时前
自动化立体仓库出入库能力及堆垛机节拍
运维·自动化
一颗星的征途5 小时前
宝塔-Linux模板常用命令-centos7
linux·运维·服务器
yumuing blog5 小时前
【论文解读】AGENTLESS:揭开基于LLM的软件工程代理的神秘面纱,重塑软件工程自动化新基线
运维·自动化·软件工程·llama
Elastic 中国社区官方博客6 小时前
Elasticsearch:Painless scripting 语言(一)
大数据·运维·elasticsearch·搜索引擎·全文检索
hay_lee6 小时前
一台docker机器如何实现构建多平台镜像
运维·docker·云原生·容器
AllenLeungX6 小时前
Linux 安装 sftp
linux·运维·服务器