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