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---

相关推荐
荣--2 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森2 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜2 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB3 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode5 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220705 天前
如何搭建本地yum源(上)
运维
大树888 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠8 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质8 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工8 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信