目录
一,HAProxy介绍
1,HAProxy简介
2,HAProxy的主要特性
3,HAProxy常见负载均衡策略
4,LVS、Nginx、HAproxy的区别
二,配置HAProxy+Nginx负载均衡
三,HAProxy日志管理
一,HAProxy介绍
1,HAProxy简介
HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言编写的自由及开放源代码软件,其提供高可用性,负载均衡,以及基于TCP和HTTP的应用程序代理。HProxy非常适用于并发大(并发达1w以上) web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
支持功能
2,HAProxy的主要特性
-
靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美; -
最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s; -
支持多达8种负载均衡算法,同时也支持会话保持; -
支持虚拟机主机功能,从而实现web负载均衡更加灵活; -
支持连接拒绝、全透明代理等独特的功能; -
拥有强大的ACL支持,用于访问控制; -
其独特的弹性二义树数据结构,使数据结构的复杂性上升到了0(1),即数据的查寻速度不会随着数据条日的增加而速度有所下降;·支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成; -
支持TCP加速,零复制功能,类似于mmap机制; -
支持响应池(response buffering) ; -
支持RDP协议; -
基于源的粘性,类似nginx的ip hash功能,把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器;·更好统计数据接口,其web接口显示后端集群中各个服务器的接收、发送、拒绝、错误等数据的统计信息; -
详细的健康状态检测,web接口中有关于对上游服务器的健康检测状态,并提供了一定的管理功能; -
基于流量的健康评估机制; -
基于http认证; -
基于命令行的管理接口; -
日志分析器,可对日志进行分析。
3,HAProxy常见负载均衡策略
(1) roundrobin,表示简单的轮询
(2) static-rr,表示根据权重
(3) leastconn,表示最少连接者先处理
( 4) source,表示根据请求源IP
(5) uri,表示根据请求的URI,做cdn需使用;
(6) url param,表示根据请求的URl参数' balance url param’requires an URL parameter name
(7) hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
(8) rdp-cookie (name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
4,LVS、Nginx、HAproxy的区别
-
VS基于Linux操作系统实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡; -
LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案; -
LVs因为工作在TCP模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URI等多种状态检测方式; -
HAProxy功能强大,但整体性能低于4层模式的IVS负载均衡。 -
Ngrinx主要用于web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是对群集节点健康检查功能不强,性能没有Haproxy好。
二,配置HAProxy+Nginx负载均衡
环境准备
haproxy服务器:192.168.18.100 nginx1:192.168.18.90 nginx2:192.168.18.91
配置nginx1服务:192.168.18.90
关闭防火墙和setenforce
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
安装nginx环境依赖包
[root@localhost ~]# yum -y install pcre-devel zlib-devel gcc gcc-c++ make
解压软件包
[root@localhost opt]# ls
nginx-1.12.0.tar.gz
[root@localhost opt]# tar xzf nginx-1.12.0.tar.gz
[root@localhost opt]# ls
nginx-1.12.0 nginx-1.12.0.tar.gz
[root@localhost opt]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
编译安装
[root@localhost nginx-1.12.0]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_stub_status_module
[root@localhost nginx-1.12.0]# make && make install
创建管理用户
[root@localhost nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
添加systemctl服务
[root@localhost html]# vim /lib/systemd/system/nginx.service
t]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
开启服务
[root@localhost nginx-1.12.0]# systemctl daemon-reload
[root@localhost nginx-1.12.0]# systemctl start nginx
测试服务
[root@localhost html]# ss -natp |grep nginx
LISTEN 0 128 *:80 *:* users:(("nginx",pid=5665,fd=6),("nginx",pid=5664,fd=6))
网页测试
添加站点文件
[root@localhost sbin]# cd /usr/local/nginx/html/
[root@localhost html]# vim test.html
this is 90 web
网页测试
配置nginx2服务:192.168.18.91
?关闭防火墙和setenforce
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
安装nginx环境依赖包
[root@localhost ~]# yum -y install pcre-devel zlib-devel gcc gcc-c++ make
解压软件包
[root@localhost opt]# ls
nginx-1.12.0.tar.gz
[root@localhost opt]# tar xzf nginx-1.12.0.tar.gz
[root@localhost opt]# ls
nginx-1.12.0 nginx-1.12.0.tar.gz
[root@localhost opt]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
编译安装
[root@localhost nginx-1.12.0]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_stub_status_module
[root@localhost nginx-1.12.0]# make && make install
创建管理用户
[root@localhost nginx-1.12.0]# useradd -M -s /sbin/nologin nginx
添加systemctl服务
[root@localhost html]# vim /lib/systemd/system/nginx.service
t]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
开启服务
[root@localhost nginx-1.12.0]# systemctl daemon-reload
[root@localhost nginx-1.12.0]# systemctl start nginx
测试服务
[root@localhost html]# ss -natp|grep nginx
LISTEN 0 128 *:80 *:* users:(("nginx",pid=7738,fd=6),("nginx",pid=7737,fd=6))
网页测试
?添加站点文件
[root@localhost sbin]# cd /usr/local/nginx/html/
[root@localhost html]# vim test.html
this is 91 web
网页测试?
haproxy服务器:192.168.18.100
关闭防火墙和setenforce
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
安装haproxy环境依赖包
[root@localhost opt]# yum -y install pcre-devel bzip2-devel gcc gcc-c++ make
将安装包解压并切换目录
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# ls
haproxy-1.4.24.tar.gz
[root@localhost opt]# tar xzf haproxy-1.4.24.tar.gz
[root@localhost opt]# ls
haproxy-1.4.24 haproxy-1.4.24.tar.gz
[root@localhost opt]# cd haproxy-1.4.24/
?编译安装
[root@localhost haproxy-1.4.24]# make TARGET=linux2628 ARCH=X86_64
[root@localhost haproxy-1.4.24]# make install
install -d /usr/local/sbin
install haproxy /usr/local/sbin
install -d /usr/local/share/man/man1
install -m 644 doc/haproxy.1 /usr/local/share/man/man1
install -d /usr/local/doc/haproxy
for x in configuration architecture haproxy-en haproxy-fr; do \
install -m 644 doc/$x.txt /usr/local/doc/haproxy ; \
done
将配置文件拷贝到/etc/haproxy/目录下(不破坏源文件,方便操作习惯)
[root@localhost haproxy-1.4.24]# mkdir /etc/haproxy
[root@localhost haproxy-1.4.24]# ls
CHANGELOG examples Makefile ROADMAP TODO
contrib haproxy Makefile.bsd src VERDATE
doc include Makefile.osx SUBVERS VERSION
ebtree LICENSE README tests
[root@localhost haproxy-1.4.24]# cd examples/
[root@localhost examples]# ls
acl-content-sw.cfg haproxy.cfg
auth.cfg haproxy.init
build.cfg haproxy.spec
check haproxy.vim
check.conf init.haproxy
config.rc.haproxy init.haproxy.flx0
content-sw-sample.cfg linux-2.4.21-40.EL-custom.diff
cttproxy-src.cfg option-http_proxy.cfg
debug2ansi rc.highsock
debug2html stats_haproxy.sh
debugfind tarpit.cfg
errorfiles test-section-kw.cfg
examples.cfg url-switching.cfg
haproxy-1.1.21-flx.1.pkg
[root@localhost examples]# cp haproxy.cfg /etc/haproxy/
修改配置文件
[root@localhost haproxy]# vim haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log /dev/log local0 info ##修改日志文件都是local0
log /dev/log local0 notice
#log loghost local0 info
maxconn 4096
#chroot /usr/share/haproxy ##注释掉根目录
uid 99
gid 99
daemon
nbproc 1 ##设置服务器1核
#debug
#quiet
defaults ##此处配置默认即可
log global
mode http
option httplog
option dontlognull
retries 3
redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webcluster 0.0.0.0:80 ##监控端口选择nginx服务端口80端口
option httpchk GET /test.html ##定义站点文件
balance roundrobin
server inst1 192.168.18.90:80 check inter 2000 fall 3 ##定义真实服务器
server inst1 192.168.18.91:80 check inter 2000 fall 3
设置service启动
[root@localhost examples]# cp haproxy.init /etc/init.d/haproxy #让service可以启动服务
[root@localhost examples]# cd /etc/init.d/
[root@localhost init.d]# ls
functions haproxy netconsole network README
[root@localhost init.d]# chmod +x haproxy
[root@localhost init.d]# chkconfig --add haproxy
[root@localhost init.d]# ln -s /usr/local/sbin/haproxy /usr/sbin/ #添加进全局变量
开启服务
[root@localhost haproxy]# service haproxy start
Starting haproxy (via systemctl): [ 确定 ]
[root@localhost haproxy]#
测试负载均衡
[root@localhost haproxy]# curl 192.168.18.100/test.html
this is 91 web
[root@localhost haproxy]#
[root@localhost haproxy]# curl 192.168.18.100/test.html
this is 90 web
[root@localhost haproxy]# curl 192.168.18.100/test.html
this is 91 web
[root@localhost haproxy]# curl 192.168.18.100/test.html
网页测试负载均衡
三,HAProxy日志管理
在haproxy服务器上修改配置文件
[root@localhost haproxy]# vim /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log 127.0.0.1 local0 info
log 192.168.18.91 local6 info ##定义日志位置
重启服务
[root@localhost haproxy]# service haproxy restart
Restarting haproxy (via systemctl): [ 确定 ]
在192.168.18.91上修改日志配置文件
[root@localhost haproxy]# vim /etc/rsyslog.conf
11 #$ModLoad imklog # reads kernel messages (the same are read from journald)
12 #$ModLoad immark # provides --MARK-- message capability
13
14 # Provides UDP syslog reception
15 $ModLoad imudp ##将15,16行注释打开
16 $UDPServerRun 514
73 local7.* /var/log/boot.log #复制73行
74 local6.* /var/log/haproxy.log ##定义日志路径
重启服务
[root@localhost haproxy]# service haproxy restart
在haproxy上访问服务
[root@localhost haproxy]# curl 192.168.18.100/test.html
this is 90 web
[root@localhost haproxy]# curl 192.168.18.100/test.html
this is 91 web
[root@localhost haproxy]# curl 192.168.18.100/test.html
this is 90 web
[root@localhost haproxy]# curl 192.168.18.100/test.html
this is 91 web
在192.168.18.91上查看是否有日志
[root@localhost /]# cd /var/log
[root@localhost log]# cat haproxy.log
[root@localhost log]# cat haproxy.log
Nov 22 16:23:59 192.168.18.100 haproxy[17683]: 192.168.18.100:54542 [22/Nov/2021:16:23:59.937] webcluster webcluster/inst1 0/0/0/0/0 200 250 - - ---- 0/0/0/0/0 0/0 "GET /test.html HTTP/1.1"
Nov 22 16:24:01 192.168.18.100 haproxy[17683]: 192.168.18.100:54550 [22/Nov/2021:16:24:01.495] webcluster webcluster/inst1 0/0/0/0/1 200 250 - - ---- 0/0/0/0/0 0/0 "GET /test.html HTTP/1.1"
Nov 22 16:29:34 192.168.18.100 haproxy[17683]: 192.168.18.100:55220 [22/Nov/2021:16:29:34.590] webcluster webcluster/inst1 0/0/0/0/0 200 250 - - ---- 0/0/0/0/0 0/0 "GET /test.html HTTP/1.1"
Nov 22 16:29:35 192.168.18.100 haproxy[17683]: 192.168.18.100:55226 [22/Nov/2021:16:29:35.715] webcluster webcluster/inst1 0/0/0/0/0 200 250 - - ---- 0/0/0/0/0 0/0 "GET /test.html HTTP/1.1"
|