LVS 性能最好,但是搭建相对复杂; Nginx 的 upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有 Haproxy好。
序列 | 名称 | 说明 |
---|---|---|
1 | roundrobin | 轮询 |
2 | static-rr | 加权轮询 |
3 | leastconn | 最小连接数 |
4 | source | 根据源地址哈希 |
5 | uri | 根据URL哈希 |
6 | url-param | 根据URL参数哈希 |
7 | hdr(name) | 根据请求头哈希 |
8 | rdp-cookie(name) | 根据cookie哈希 |
1、可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美;
2、最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;
3、支持多达8种负载均衡算法
4、支持Session会话保持,Cookie的引导;
5、支持通过获取指定的url来检测后端服务器的状态;
6、支持虚机主机功能,从而实现web负载均衡更加灵活;
7、支持连接拒绝、全透明代理等独特的功能;
8、拥有强大的ACL支持,用于访问控制;
9、支持TCP和HTTP协议的负载均衡转发;
10、支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成
#准备环境
Haproxy服务器:192.168.119.10
Nginx 服务器1:192.168.119.20
Nginx 服务器2:192.168.119.30
客户端:192.168.119.50
1.关闭防火墙,安装Haproxy
systemctl stop firewalld
setenforce 0
2.安装haproxy
yum install -y haproxy
3.Haproxy服务器配置
cd /etc/haproxy/
cp haproxy.cfg haproxy.cfg.bak
vim haproxy.cfg
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
#将info(及以上)的日志发送到rsyslog的local0接口,将warning(及以上)的日志发送到rsyslog的local1接口
log 127.0.0.1 local0 info
log 127.0.0.1 local1 warning
maxconn 30000 #最大连接数,HAProxy 要求系统的 ulimit -n 参数大于 maxconn*2+18
#chroot /var/lib/haproxy #修改haproxy工作目录至指定目录,一般需将此行注释掉
pidfile /var/run/haproxy.pid #指定保存HAProxy进程号的文件
user haproxy #以指定的用户名身份运行haproxy进程
group haproxy #以指定的组名运行haproxy,以免因权限问题带来风险
daemon #让haproxy以守护进程的方式工作于后台
#nbproc 1 #指定启动的haproxy进程个数,只能用于守护进程模式的haproxy,默认只启动一个进程。haproxy是单进程、事件驱动模型的软件,单进程下工作效率已经非常好,不建议开启多进程
spread-checks 2 #在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;默认为0,官方建议设置为2到5之间。
defaults #配置默认参数,这些参数可以被用到listen,frontend,backend组件
mode http #模式为http(7层代理http,4层代理tcp)
log global #所有前端都默认使用global中的日志配置
option httplog
option http-keep-alive #使用keepAlive连接,后端为静态建议使用http-keep-alive,后端为动态应用程序建议使用http-server-close
option forwardfor #记录客户端IP在X-Forwarded-For头域中,haproxy将在发往后端的请求中加上"X-Forwarded-For"首部字段
option httplog #开启httplog,在日志中记录http请求、session信息等。http模式时开启httplog,tcp模式时开启tcplog
option dontlognull #不在日志中记录空连接
option redispatch #当某后端down掉使得haproxy无法转发携带cookie的请求到该后端时,将其转发到别的后端上
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 20000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
retries 3 #定义连接后端服务器的失败重连次数,连接失败次数超过此值后会将对应后端服务器标记为不可用
#contimeout 5000 #设置连接超时时间,默认单位是毫秒
#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒
#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒
timeout http-request 2s #默认http请求超时时间,此为等待客户端发送完整请求的最大时长,用于避免类DoS攻击。haproxy总是要求一次请求或响应全部发送完成后才会处理、转发
timeout queue 3s #默认客户端请求在队列中的最大时长
timeout connect 1s #默认haproxy和服务端建立连接的最大时长,新版本中替代contimeout,该参数向后兼容
timeout client 10s #默认和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为10秒以尽快释放连接,新版本中替代clitimeout
timeout server 2s #默认和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是高并发时,新版本中替代srvtimeout
timeout http-keep-alive 10s #默认和客户端保持长连接的最大时长。优先级高于timeout http-request 也高于timeout client
timeout check 2s #和后端服务器成功建立连接后到最终完成检查的最大时长(不包括建立连接的时间,只是读取到检查结果的时长)
4.配置日志文件
vim /etc/rsyslog.conf
local1.* /var/log/haproxy/haproxy_warning.log
local0.* /var/log/haproxy/haproxy_info.log
frontend http-in #定义前端域
bind *:80 #设置监听地址和端口,指定为*或0.0.0.0时,将监听当前系统的所有IPv4地址
maxconn 3000 #定义此端口上的maxconn
acl url_static1 path_beg -i /stat /static /images /javascript /stylesheets
#定义ACL,当uri以定义的路径开头时,ACL[url_static1]为true
acl url_static2 path_end -i .jpg .jpeg .gif .png .html .htm .txt
#定义ACL,当uri以定义的路径结尾时,ACL[url_static2]为true
use_backend ms1 if url_static1 #当[url_static1]为true时,定向到后端域ms1中
use_backend ms2 if url_static2 #当[url_static2]为true时,定向到后端域ms2中
default_backend dynamic_group #其他情况时,定向到后端域dynamic_group中
backend ms1 #定义后端域ms1
balance roundrobin #使用轮询算法
option httpchk GET /test.html #表示基于http协议来做健康状况检查,只有返回状态码为2xx或3xx的才认为是健康的,其余所有状态码都认为不健康。不设置该选项时,默认采用tcp做健康检查,只要能建立tcp就表示健康。
server ms1.inst1 192.168.119.20:80 maxconn 5000 check inter 2000 rise 2 fall 3
server ms1.inst2 192.168.119.30:81 maxconn 5000 check #同上,inter 2000 rise 2 fall 3是默认值,可以省略
backend ms2 #定义后端域ms2
balance roundrobin
option httpchk GET /test.html
server ms2.inst1 192.168.119.20:80 maxconn 5000 check
server ms2.inst2 192.168.119.30:81 maxconn 5000 check
backend dynamic_group #定义后端域dynamic_group
balance roundrobin
option http-server-close
cookie HA_STICKY_dy insert indirect nocache
server appsrv1 192.168.119.20:8080 cookie appsrv1 maxconn 5000 check
server appsrv2 192.168.119.30:8080 cookie appsrv2 maxconn 5000 check
1.安装apache服务
yum install -y httpd
...
cd /var/www/html
mkdir stat
echo '这是静态页面
' > stat/index.html #server2换成'这是另一个静态页面
cat stat/index.html
这是静态页面
systemctl start httpd
2.验证静态页面
浏览器访问:http://192.168.119.20/stat/index.html http://192.168.119.30/stat/index.html
3.验证转发功能
浏览器访问:http://192.168.119.10/stat/index.html
503 Service Unavailable
...
cd /var/www/html
echo '123' > test.html #需要有一个test.html文件用来验证,server2也需要一个
http://192.168.119.10/stat/index.html
4.安装tomcat服务
cd /opt
rz -E
apache-tomcat-9.0.16.tar.gz
tar xf apache-tomcat-9.0.16.tar.gz
ls
apache-tomcat-9.0.16 apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
#jdk已安装
cd /usr/local/tomcat/bin
./startup.sh
netstat -lntp | grep :8080
tcp6 0 0 :::8080 :::* LISTEN 5206/java
cd /usr/local/tomcat/webapps/
mkdir data
echo 'This is sport web
' > data/index.jsp
cd /usr/local/
srp -r tomcat 192.168.119.30:`pwd`
#转到192.168.119.30
cd /usr/local/tomcat/webapps/data
vim index.jsp
This is the other sport web
浏览器验证:http://192.168.119.20:8080/data/index.jsp http://192.168.119.30:8080/data/index.jsp
#把haproxy主配置文件中的会话保持注释,否则页面不跳转
vim /etc/haproxy/haproxy.cfg
...
#cookie HA_STICKY_dy insert indirect nocache #91行注释
...
5.验证动态页面
浏览器访问:http://192.168.119.10/data/index.jsp
192.168.119.10
vim /etc/haproxy/haproxy.cfg
#最后面添加
...
listen stats #定义监控页面
bind *:1111 #绑定端口1111(端口自定义,访问的时候需要输入)
stats enable #启用统计报告监控
stats refresh 30s #每30秒更新监控数据
stats uri /stats #访问监控页面的uri
stats realm HAProxy\ Stats #监控页面的认证提示
stats auth admin:admin123 #监控页面的用户名和密码
#浏览器访问:192.168.119.10:1111/stats
192.168.119.10
vim /etc/rsyslog.d/haproxy.conf/
$ModLoad imudp
$UDPServerRun 514
$FileCreateMode 0644
local1.* /var/log/haproxy/haproxy_warning.log
local0.* /var/log/haproxy/haproxy_info.log
vim /etc/sysconfig/rsyslog/
SYSLOGD_OPTIONS="-c 2 -r -m 0"
service rsysloc restart
Redirecting to /bin/systemctl restart rsysloc.service
cd /var/log/haproxy/
ls
haproxy_info.log