目录
- 一、Haproxy介绍
- 二、Haproxy的部署
一、Haproxy介绍
- Haproxy是一种高性能的TCP/HTTP负载均衡器(tcp和http的反向代理),它支持丰富的负载均衡算法和会话保持功能。Haproxy可以进行健康检查和故障转移,并提供实时监控和日志记录功能。它适用于处理大量的并发连接和高可用性要求的应用场景,不像nginx可以作web服务器
- 这是官网地址
1.1 常见的负载均衡器
- LVS(Linux Virtual Server)、nginx和Haproxy都是常见的负载均衡器软件,它们的主要作用都是分发网络流量,提高网络性能和可靠性
- 硬件也有:硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,比如:梭子鱼、绿盟等
1.2 三者的优缺点
1.2.1 LVS
-
LVS是一种基于Linux内核的负载均衡器,具有高性能和可扩展性。它通过将流量分发到多个服务器来实现负载均衡。LVS可以根据不同的调度算法(如轮询、源IP哈希)来分发请求,同时支持对后端服务器的健康检查。LVS适合于大规模网络环境和高并发负载。
-
优点
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生。因此负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
2、LVS工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案。
3、无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响。
4、应用范围较广,因为LVS工作在4层,所以它几乎可对所有应用做负载均衡,包括http、数据库等
- 缺点
1、软件本身不支持正则表达式处理,不能做动静分离。相对来说,Nginx/HAProxy+Keepalived则具有明显的优势。
2、如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了。相对来说,Nginx/HAProxy+Keepalived就简单多了
1.2.2 Nginx
-
Nginx是一种轻量级的反向代理服务器,也可以用作负载均衡器。Nginx具有高性能、低内存消耗和高并发处理能力。它支持多种负载均衡算法,并且具有灵活的配置选项。Nginx还集成了其他功能,如静态文件服务和缓存加速,使其成为一个全能的Web服务器。Nginx适合用于静态内容的分发以及高并发的Web应用场景。
-
优点
1、web服务器,应用比较广泛,大家都会
2、可以作为7层负载均衡,location设置复杂的基于HTTP的负载均衡
3、性能强大,网络依赖小
4、安装配置简单
-
nginx有四种负载均衡方式:
- 轮询
- 最小连接数
- ip_hash(用于会话保持,使某一ip最近一段时间的访问全部分配到同一个服务器,现在很多保持会话的方式已经不需要定位同一个不变的服务器了,如 通过算法签发token、或者将登录状态保存到数据库)
- weight(其实是在轮询的基础上,提高某个权重高的服务器的分发请求频率)
- 轮询
-
缺点
1、Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些(一般只用作web服务器的负载均衡)
2、健康检查单一,不支持基于url的健康检查(可以使用第三方插件实现)
3、负载均衡算法少
4、不能动态管理,比如踢出某个web节点,需要reload配置
5、没有集群upstream的状态页面
6、不支持Session的直接保持,需要通过ip_hash和cookie的引导来解决
1.2.3 Haproxy
- 优点
1、专门做反向代理负载均衡,且支持TCP/HTTP协议,适用范围更广
2、负载均衡算法比较多,大于等于8种,比nginx丰富
3、性能不低于nginx,大于等于nginx
4、支持动态管理,通过和haproxy的sock进行通信,可以进行管理
5、有比较丰富的Dashboard的页面,监控方便。有管理页面
6、比较强大的7层反向代理功能,在7层方便,功能强大
7、会话保持比nginx丰富。可以基于cookie和源IP(nginx也能做到基于IP和cookie)
8、HAProxy也是支持虚拟主机的
-
Haproxy负载均衡策略非常多,常见的有8种
- roundrobin:表示简单的轮询
- static-rr:表示根据权重
- leastconn:表示最少连接先处理
- source:表示根军请求源IP
- uri:表示根据请求的URL,做cdn需使用
- url_param:表示根据请求的URL参数
- hdr(name):表示根据HTTP请求头来锁定每一次HTTP请求
- rdp-cookie(name):表示根据cookie(name)来锁定并哈希每一次TCP请求
1.2.4 总结
理论总结
-
LVS基于Linux操作系统实现软负载均衡,而Haproxy和Nginx是基于第三方应用实现的软负载均衡
-
LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而Haproxy和Nginx都可以实现4层和7层技术,Haproxy可提供TCP和HTTP应用的负载均衡综合解决方案
-
LVS因为工作在ISO模型的第四层,其状态监测功能单一,而Haproxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式
-
Haproxy功能强大,但整体性能低于4层模式的LVS负载均衡
-
Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持集群功能,但是对集群节点健康检查功能不强,性能没有Haproxy好
-
一般来说,Haproxy是除了对web服务器负载之外最好的选择,超高型并发场景(如淘宝、京东等)还是LVS更好
应用总结
- 性能需求:根据预期的流量负载和性能需求,选择适合的负载均衡器。如果需要处理大规模的并发请求,LVS可能是更好的选择。如果需要高性能的Web服务器加上负载均衡功能,Nginx可能是更合适的选择。
- 功能需求:根据项目需求确定所需的额外功能。如果需要复杂的负载均衡算法、健康检查和监控等功能,HAProxy可能是更适合的选择。
- 可扩展性:考虑未来的扩展需求,选择具有良好可扩展性的负载均衡器。例如,如果你需要在多个数据中心进行负载均衡,那么HAProxy可能是更灵活的选择。
- 熟悉程度:考虑团队成员对负载均衡器的了解和经验,选择他们熟悉和擅长的工具。这有助于快速部署和维护负载均衡器
3个案例
- 大型电子商务网站:假设你正在开发一个大型电子商务网站,该网站需要处理大量的并发请求。在这种情况下,你可能会选择使用LVS作为负载均衡器。LVS能够将流量分发到多台后端服务器,确保请求能够有效地分散,从而提高网站的性能和可扩展性。
- 微服务架构:在一个基于微服务的架构中,各个微服务相互独立,可以部署在不同的服务器上。为了实现负载均衡和高可用性,你可以选择使用Nginx或HAProxy作为负载均衡器。它们可以根据请求的内容或其他因素将流量分发到不同的微服务实例,确保每个服务都能够平均地处理请求,并在其中一台服务器故障时自动转移到其他正常的服务器上。
- 高流量的媒体分享网站:如果你运行一个媒体分享网站,用户上传和下载大型媒体文件可能会产生大量的流量。在这种情况下,你可能需要一个具有高性能和可靠性的负载均衡器。在这种情况下,HAProxy可能是一个不错的选择,它支持丰富的负载均衡算法和高并发连接处理能力,可以帮助你有效地管理流量并提供稳定的服务
负载均衡的通用的配置步骤
- 安装和配置负载均衡器软件:根据选择的负载均衡器类型,按照官方文档提供的指导安装和配置相应软件。例如,对于Nginx,可以通过包管理器进行安装,并编辑配置文件。
- 定义后端服务器:在负载均衡器配置中,定义要使用的后端服务器列表。这些服务器可以是实际处理请求的应用服务器、微服务实例或其他类型的服务器。确保每个服务器都能够正常运行,并具有相同的应用程序或服务。
- 配置监听端口和负载均衡算法:指定负载均衡器监听的端口号,并选择适合需求的负载均衡算法。常见的负载均衡算法包括轮询、加权轮询、IP散列等。根据实际情况选择适当的算法。
- 配置健康检查:负载均衡器通常会定期检查后端服务器的健康状态,以确保只将流量分发到健康的服务器上。配置健康检查机制,例如定期发送HTTP请求检查响应码或使用TCP连接检查端口。
- 配置 SSL/TLS:如果需要通过负载均衡器传输安全的HTTPS流量,需要配置SSL/TLS证书和相关参数。根据负载均衡器的要求和证书颁发机构提供的指导完成配置。
- 测试和监控:在配置完成后,进行测试以确保负载均衡器正常工作。发送请求并观察流量是否正确地分发到后端服务器。此外,设置监控系统来实时监测负载均衡器和后端服务器的性能和健康状态
二、Haproxy的部署
- haproxy的部署分为以下几个步骤
- 下载安装haproxy
- 添加haproxy系统服务
- 创建haproxy用户和相关目录
- 配置haproxy的配置文件(配置反向代理和负载均衡)(修改haproxy的配置后需要重启haproxy服务才能生效)
- 配置haproxy的日志输出
- 启动haproxy
2.1 下载、安装Haproxy
- 下面以centos系统为例,通过yum、编译安装haproxy
- centos安装要注意关闭防火墙
2.1.1 yum源安装
[root@linux-node1 haproxy-1.6.3]# yum -y install haproxy
[root@linux-node1 haproxy-1.6.3]# haproxy -v
HA-Proxy version 1.6.3 2015/12/25
Copyright 2000-2015 Willy Tarreau <[email protected]>
2.1.2 第三方安装包
- 去 第三方 ,下载rpm包(第三方编译好的)
- 参考地址:https://centos.pkgs.org/7/ius-testing-x86_64/haproxy22-2.2.10-1.el7.ius.x86_64.rpm.html
# 基于互联⽹在线安装
[root@linux-node1 ~]# wget https://repo.ius.io/ius-release-el7.rpm
# 安装使用yum解决epel源的依赖关系
[root@linux-node1 ~]# yum -y localinstall ius-release-el7.rpm
# 安装haproxy
[root@linux-node1 ~]# yum -y --enablerepo=ius-testing install haproxy22
# haproxy的配置文件已经生成
[root@linux-node1 ~]# vi /etc/haproxy/haproxy.cfg
bind *:5000 # 他会监听在5000端口,启动以下试试
# 关闭防火墙
[root@linux-node1 ~]# systemctl restart haproxy
[root@linux-node1 ~]# setenforce 0
# 启动haproxy(5000端口已监听)
[root@linux-node1 ~]# systemctl restart haproxy
[root@linux-node1 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:5000 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
2.1.3 编译安装
- 首先到官网下载LTS稳定版的版本,这里部署的是haproxy-2.2.12LTS版本
- 然后下载Haproxy依赖:
lua
- 由于centos⾃带的lua版本⽐较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy
- 过程如下:
#---------------------------------下载及安装Haproxy的依赖--------------------------------------
# 安装基础命令及编译依赖环境
[root@linux-node1 src]# yum -y install libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate
# 切换目录
[root@linux-node1 ~]# cd /usr/local/src/
# 下载源码包
[root@linux-node1 src]# wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
[root@linux-node1 src]# ls
haproxy-2.2.12 haproxy-2.2.12.tar.gz lua-5.3.5.tar.gz
# 解压源码包
[root@linux-node1 src]# tar xvf lua-5.3.5.tar.gz
# 切换目录
[root@linux-node1 src]# ls
haproxy-2.2.12 haproxy-2.2.12.tar.gz lua-5.3.5 lua-5.3.5.tar.gz
[root@linux-node1 src]# cd lua-5.3.5
# 编译安装
[root@linux-node1 lua-5.3.5]# ls
doc Makefile README src
[root@linux-node1 lua-5.3.5]# make linux test
# 当前lua版本(安装成功)
[root@linux-node1 lua-5.3.5]# ./src/lua -v
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
#---------------------------------下载及安装Haproxy--------------------------------------
# 切换目录
[root@linux-node1 ~]# cd /usr/local/src/
# 下载haproxy源码包
[root@linux-node1 src]# pwd
/usr/local/src
[root@linux-node1 src]# wget https://www.haproxy.org/download/2.2/src/haproxy-2.2.12.tar.gz
[root@linux-node1 src]# ls
haproxy-2.2.12.tar.gz
# 解压源码包
[root@linux-node1 src]# tar xvf haproxy-2.2.12.tar.gz
[root@linux-node1 src]# cd haproxy-2.2.12
[root@linux-node1 haproxy-2.2.12]# ll
总用量 1044
-rw-rw-r--. 1 root root 14046 3月 31 21:33 BRANCHES
-rw-rw-r--. 1 root root 868326 3月 31 21:33 CHANGELOG
drwxrwxr-x. 24 root root 4096 3月 31 21:33 contrib
-rw-rw-r--. 1 root root 55832 3月 31 21:33 CONTRIBUTING
drwxrwxr-x. 5 root root 4096 3月 31 21:33 doc
drwxrwxr-x. 3 root root 200 3月 31 21:33 examples
drwxrwxr-x. 4 root root 35 3月 31 21:33 include
-rw-rw-r--. 1 root root 26326 3月 31 21:33 INSTALL
-rw-rw-r--. 1 root root 2029 3月 31 21:33 LICENSE
-rw-rw-r--. 1 root root 3747 3月 31 21:33 MAINTAINERS
-rw-rw-r--. 1 root root 41604 3月 31 21:33 Makefile
-rw-rw-r--. 1 root root 1093 3月 31 21:33 README # 自述文件,有安装详情
drwxrwxr-x. 28 root root 4096 3月 31 21:33 reg-tests
-rw-rw-r--. 1 root root 2433 3月 31 21:33 ROADMAP
drwxrwxr-x. 2 root root 160 3月 31 21:33 scripts
drwxrwxr-x. 2 root root 4096 3月 31 21:33 src
-rw-rw-r--. 1 root root 10 3月 31 21:33 SUBVERS
drwxrwxr-x. 2 root root 4096 3月 31 21:33 tests
-rw-rw-r--. 1 root root 37 3月 31 21:33 VERDATE
-rw-rw-r--. 1 root root 7 3月 31 21:33 VERSION
# 编译安装(编译参数在README文件中有介绍)
## HAProxy 1.8及1.9版本编译参数:
make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy
## HAProxy 2.0编译参数(linux-glibc是一个通用的内核参数):
[root@linux-node1 haproxy-2.2.12]# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ PREFIX=/apps/haproxy
# 安装
[root@linux-node1 haproxy-2.2.12]# make install PREFIX=/apps/haproxy
[root@linux-node1 haproxy-2.2.12]# ls /apps/haproxy/sbin
haproxy
# 将haproxy的可执行程序,放到/usr/sbin/中,会有环境变量,可以直接调用
[root@linux-node1 haproxy-2.2.12]# cp /apps/haproxy/sbin/haproxy /usr/sbin
# 验证haproxy环境变量,和版本(可以看到版本好就是编译成功了)
[root@linux-node1 haproxy-2.2.12]# haproxy -v
HA-Proxy version 2.2.12-a723e77 2021/03/31 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2025.
Known bugs: http://www.haproxy.org/bugs/bugs-2.2.12.html
Running on: Linux 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64
# 查看配置模板文件(这里面提供的是配置文件的模板)
[root@linux-node1 haproxy-2.2.12]# ls examples/
acl-content-sw.cfg errorfiles option-http_proxy.cfg transparent_proxy.cfg
content-sw-sample.cfg haproxy.init socks4.cfg wurfl-example.cfg
# 创建配置文件(自己创建配置文件)
[root@linux-node1 haproxy-2.2.12]# mkdir -pv /etc/haproxy
mkdir: 已创建目录 "/etc/haproxy"
[root@linux-node1 haproxy-2.2.12]# vi /etc/haproxy/haproxy.cfg
global # 声明全局配置,跟缩进没有要求
maxconn 1000000 # 整个连接的最大值,每个haproxy进程的最大并发连接数,整个值一般可以调的大点,通常是10万,如果是4个进程就是40万了,这个值设置大点没关系,比如100万,不要设置小了万一那天并发量上来haproxy就处理不了,可能要排队
chroot /apps/haproxy # 为了安全考虑,锁定运行工作目录,路径需要提前存在
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin # 指定socket路径,注意:/var/lib/haproxy/ 目录需要首先存在,sock文件服务启动时自动创建,mode 600表示haproxy.sock这个文件的权限是600,level级别是admin也就是管理员级别,他可以通过socket对haproxy进行管理操作,包括加服务器,减服务器
uid 99 # 99是系统nobody用户
gid 99
daemon # 把haproxy进程发到后端,要不然他就在前台执行了,在一些容器运行haproxy的时候可能会用到这个
#nbproc 4 # 指定开启的工作进程数量,进程数量一般等于cpu内核数一样,多进程不能和多线程同时开,否者启动不来,可以看系统日志,默认一个进程一个线程,
#cpu-map 1 0 # cup绑定,1 0前面的1是进程,0是cpu,绑定后工作进程就不会在多个cpu之间抖动了
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
#nbthread 4 # 开启多线程,性能会有提升但是没有多进程性能好ps -ef | grep haproxy查看,默认是多线程
pidfile /var/lib/haproxy/haproxy.pid # 指定pid文件路径,需要跟systemd定义的路径一致
log 127.0.0.1 local3 info # 记录日志
defaults
option redispatch
option abortonclose
option http-keep-alive
option forwardfor # ip地址透传,在defaults定义,listen中没有定义,会继承
mode http
timeout http-keep-alive 120s
timeout connect 120s
timeout server 600s
timeout client 600s
timeout check 5s
maxconn 100000
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status # haproxy的状态页,指定一个uri
stats auth haadmin:q1w2e3r4ys # 认证的账号和密码
# listen web_port
# bind 192.168.7.101:80 # 绑定的地址,需要改成自己地址否者会启动不起来
# mode http
# log global
# server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
# frontend helloworld-webserver-80 # 名字要见字达意,frontend这种方式用的不多,大多数用的是listen
# bind 192.168.127.130:80 # 绑定一个监听地址和端口
# mode http # 工作模式
# use_backend helloworld-webserver-80-host # 要使用哪个后端服务器,不然 bind 192.168.127.130:80 这里找不到后端服务器
# backend helloworld-webserver-80-host # 后端服务器
# mode http # 工作模式
# server web1 192.168.127.129:80 check inter 3s fall 3 rise 5 # 声明服务器,后面定义服务器名称,下线服务器的时候就是helloworld-webserver-80-host在这个名称里面找到web1进行下线,haproxy下线服务器不是通过ip地址下线的,check表示对后端>服务器进行状态检测,如果服务器挂了,将不在发送请求到挂了的后端服务器上,intre表示多长时间检测一次,这里定义3秒,fall 3表示连续检测失败3次就踢出去,rise 5连续五次检测成功了,就在加回来
# server web2 192.168.127.131:80 check inter 3s fall 3 rise 5 # 定义两个默认会轮询访问
listen webserver-80
bind 192.168.127.130:80
mode http
# redirect prefix https://www.cnblogs.com/hao-ran/ # 单独打开,他的作用的就是nginx的转发功能,这是一个302临时重定向,不记录dns缓存
server web1 192.168.127.129:80 check weight 1 maxconn 500 addr 192.168.127.129 port 8080 inter 3s fall 3 rise 5 # 如果这个地址是后端httpd的代理服务器地址,代理至后端的tomcat服务器上,addr如果我们有多个网卡的话,就写另外一个地址,用另外的网卡专门用来做这种服务检测,port检测后端服务器的哪个端口,比如8080,比如3306,只要这些端口存在我就认为他们是可用的,如果不存在我就认为他们是不可用的,可用状态页的服务器是绿的,健康检测,如果有两个端口,就会检测两个端口,如果都是好的服务都在,状态页中才会显示绿色,weight 1表示权重,如果服务器硬件性能不一样可以单独设置以下,maxconn 500表示这台服务器500并发量
server web2 192.168.127.131:80 check inter 3s fall 3 rise 5
2.2 添加haproxy系统服务
- 源码包里有启动脚本,拷贝到 /etc/init.d 目录下
- 为后面的启动haproxy服务铺垫
[root@linux-node1 haproxy-2.2.12]# pwd
/usr/local/src/haproxy-2.2.12
# 查看haproxy-2.2.12配置的模板文件(这里面提供的是配置文件的模板)
[root@linux-node1 haproxy-2.2.12]# ls examples/
acl-content-sw.cfg errorfiles option-http_proxy.cfg transparent_proxy.cfg
content-sw-sample.cfg haproxy.init socks4.cfg wurfl-example.cfg
[root@linux-node1 haproxy-2.2.12]# cd examples/
[root@linux-node1 examples]# ls haproxy.init
haproxy.init
[root@linux-node1 examples]# cp haproxy.init /etc/init.d/haproxy
[root@linux-node1 examples]# chmod +x /etc/init.d/haproxy
2.3 创建haproxy用户和相关目录
[root@linux-node1 examples]# useradd -r haproxy # -r 参数表示创建系统账号
[root@linux-node1 examples]#
[root@linux-node1 examples]# mkdir -p /etc/haproxy # 用来待会放置我们自定义的haproxy配置文件
[root@linux-node1 examples]# mkdir -p /var/lib/haproxy # 对应下面Haproxy配置文件中的 chroot /var/lib/haproxy
2.4 配置Haproxy的配置
2.4.1 Haproxy的配置详解
- 介绍了Haproxy的配置文件中的各种参数含义
2.4.1.1 HAProxy的配置文件的5个域
# HAProxy的配置文件共有5个域:
global:用于配置全局参数
default:用于配置所有frontend和backend的默认属性
frontend:用于配置前端服务(即HAProxy自身提供的服务)实例
backend:用于配置后端服务(即HAProxy后面接的服务)实例组 # frontend 监听到的访问IP,会将该请求转发到backed中的server
listen:frontend+backend的组合配置,可以理解成更简洁的配置方法
2.4.1.2 global域的关键配置
# global域的关键配置
daemon:指定HAProxy以后台模式运行,通常情况下都应该使用这一配置
user [username] :指定HAProxy进程所属的用户
group [groupname] :指定HAProxy进程所属的用户组
log [address] [device] [maxlevel] [minlevel]:设置日志文件输出定向,如log 127.0.0.1 local0 info warning,即向本机rsyslog或syslog的local0输出info到warning级别的日志。其中[minlevel]可以省略。HAProxy的日志共有8个级别,从高到低为emerg/alert/crit/err/warning/notice/info/debug
pidfile :指定记录HAProxy进程号的文件绝对路径。主要用于HAProxy进程的停止和重启动作。
maxconn :HAProxy进程同时处理的连接数,当连接数达到这一数值时,HAProxy将停止接收连接请求
2.4.1.3 frontend域的关键配置
# frontend域的关键配置
acl [name] [criterion] [flags] [operator] [value]:定义一条ACL,ACL是根据数据包的指定属性以指定表达式计算出的true/false值。如"acl url_ms1 path_beg -i /ms1/"定义了名为url_ms1的ACL,该ACL在请求uri以/ms1/开头(忽略大小写)时为true
bind [ip]:[port]:frontend服务监听的ip和端口
default_backend [name]:frontend对应的默认backend
disabled:禁用此frontend
http-request [operation] [condition]:对所有到达此frontend的HTTP请求应用的策略,例如可以拒绝、要求认证、添加header、替换header、定义ACL等等。
http-response [operation] [condition]:对所有从此frontend返回的HTTP响应应用的策略,大体同上
log:同global域的log配置,仅应用于此frontend。如果要沿用global域的log配置,则此处配置为log global
maxconn:同global域的maxconn,仅应用于此frontend
mode:此frontend的工作模式,主要有http和tcp两种,对应L7和L4两种负载均衡模式
option forwardfor:在请求中添加X-Forwarded-For Header,记录客户端ip
option http-keep-alive:以KeepAlive模式提供服务
option httpclose:与http-keep-alive对应,关闭KeepAlive模式,如果HAProxy主要提供的是接口类型的服务,可以考虑采用httpclose模式,以节省连接数资源。但如果这样做了,接口的调用端将不能使用HTTP连接池
option httplog:开启httplog,HAProxy将会以类似Apache HTTP或Nginx的格式来记录请求日志
option tcplog:开启tcplog,HAProxy将会在日志中记录数据包在传输层的更多属性
stats uri [uri]:在此frontend上开启监控页面,通过[uri]访问
stats refresh [time]:监控数据刷新周期
stats auth [user]:[password]:监控页面的认证用户名密码
timeout client [time]:指连接创建后,客户端持续不发送数据的超时时间
timeout http-request [time]:指连接创建后,客户端没能发送完整HTTP请求的超时时间,主要用于防止DoS类攻击,即创建连接后,以非常缓慢的速度发送请求包,导致HAProxy连接被长时间占用
use_backend [backend] if|unless [acl]:与ACL搭配使用,在满足/不满足ACL时转发至指定的backend
2.4.1.4 backend域的关键配置
# backend域的关键配置
acl:同frontend域
balance [algorithm]:在此backend下所有server间的负载均衡算法,常用的有 roundrobin(轮询) ileastconn(长连接合适) source(同IP访问固定后端),完整的算法说明见官方文档configuration.html
cookie:在backend server间启用基于cookie的会话保持策略,最常用的是insert方式,如cookie HA_STICKY_ms1 insert indirect nocache,指HAProxy将在响应中插入名为HA_STICKY_ms1的cookie,其值为对应的server定义中指定的值,并根据请求中此cookie的值决定转发至哪个server。indirect代表如果请求中已经带有合法的HA_STICK_ms1 cookie,则HAProxy不会在响应中再次插入此cookie,nocache则代表禁止链路上的所有网关和缓存服务器缓存带有Set-Cookie头的响应。
default-server:用于指定此backend下所有server的默认设置。具体见下面的server配置。
disabled:禁用此backend
http-request/http-response:同frontend域
log:同frontend域
mode:同frontend域
option forwardfor:同frontend域
option http-keep-alive:同frontend域
option httpclose:同frontend域
option httpchk [METHOD] [URL] [VERSION]:定义以http方式进行的健康检查策略。如option httpchk GET /healthCheck.html HTTP/1.1
option httplog:同frontend域
option tcplog:同frontend域
server [name] [ip]:[port] [params]:定义backend中的一个后端server,[params]用于指定这个server的参数,常用的包括有:
check:指定此参数时,HAProxy将会对此server执行健康检查,检查方法在option httpchk中配置。同时还可以在check后指定inter, rise, fall三个参数,分别代表健康检查的周期、连续几次成功认为server UP,连续几次失败认为server DOWN,默认值是inter 2000ms rise 2 fall 3
cookie [value]:用于配合基于cookie的会话保持,如cookie ms1.srv1代表交由此server处理的请求会在响应中写入值为ms1.srv1的cookie(具体的cookie名则在backend域中的cookie设置中指定)
maxconn:指HAProxy最多同时向此server发起的连接数,当连接数到达maxconn后,向此server发起的新连接会进入等待队列。默认为0,即无限
maxqueue:等待队列的长度,当队列已满后,后续请求将会发至此backend下的其他server,默认为0,即无限
weight:server的权重,0-256,权重越大,分给这个server的请求就越多。weight为0的server将不会被分配任何新的连接。所有server默认weight为1
# 如:server server_test 192.168.179.131:8081 check inter 2000 rise 3 fall 3 weight 30
# 如:server web1 10.1.1.2:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maxconn 8
timeout connect [time]:指HAProxy尝试与backend server创建连接的超时时间
timeout check [time]:默认情况下,健康检查的连接+响应超时时间为server命令中指定的inter值,如果配置了timeout check,HAProxy会以inter作为健康检查请求的连接超时时间,并以timeout check的值作为健康检查请求的响应超时时间
timeout server [time]:指backend server响应HAProxy请求的超时时间
2.4.1.5 default域 和 listen域
1. default域
上文所属的frontend和backend域关键配置中,除acl、bind、http-request、http-response、use_backend外,其余的均可以配置在default域中。default域中配置了的项目,如果在frontend或backend域中没有配置,将会使用default域中的配置。
2. listen域
listen域是frontend域和backend域的组合,frontend域和backend域中所有的配置都可以配置在listen域下
2.4.2 自定义Haproxy配置
# 2.3步骤中已经创建了配置文件(自己创建配置文件)
[root@linux-node1 haproxy-2.2.12]# cd /etc/haproxy/
# 将自带的模板配置,复制到我们的/etc/haproxy下,进行编辑
[root@linux-node1 haproxy]# cp /usr/local/src/haproxy-2.2.12/examples/haproxy.cfg haproxy.cfg
[root@linux-node1 haproxy]# vim haproxy.cfg
# global为全局设置
global
log 127.0.0.1 local3 info # 记录日志
chroot /var/lib/haproxy # 为了安全考虑,锁定运行工作目录,路径需要提前存在,默认即可
pidfile /var/run/haproxy.pid # 指定pid文件路径,需要跟systemd定义的路径一致,默认即可
maxconn 20000 # 最大连接数,每个haproxy进程的最大并发连接数,整个值一般可以调的大点,通常是10万,如果是4个进程就是40万了,这个值设置大点没关系,比如100万,不要设置小了万一那天并发量上来haproxy就处理不了,可能要排队
user haproxy # 指定HAProxy进程所属的用户
group haproxy # 指定HAProxy进程所属的用户组
nbproc 4 # 并发进程数
daemon # 指定HAProxy以后台模式运行,通常情况下都应该使用这一配置
stats socket /var/lib/haproxy/stats
defaults
mode tcp # 默认的工作模式,主要有http和tcp两种,对应L7和L4两种负载均衡模式,不写默认http
log global
option redispatch
retries 3
timeout connect 10s
timeout client 15m
timeout server 15m
timeout check 10s
timeout tunnel 12h
option nolinger
no option dontlognull
option tcplog
option log-separate-errors
#roundrobin(轮询) ileastconn(长连接合适) source(同IP访问固定后端)
# 示例1
frontend http_front
bind *:80 # bind [ip]:[port]:frontend服务监听的端口,*表示任何请求80端口http协议(因为mode为http)的ip都会被转发到default_backend http_bac 中设置的ip及端口
default_backend http_back # http_front 对应的其默认的 http_back
backend http_back
balance roundrobin
server linux-node1 10.0.1.105:8080 check
server linux-node2 10.0.1.106:8080 check
# 示例2
# 示例2.1
frontend helloworld-webserver-80 # frontend后的备注名要见字达意,frontend这种方式用的不多,大多数用的是listen
bind 192.168.127.130:80 # 绑定一个监听地址和端口
mode http # 工作模式
use_backend helloworld-webserver-80-host # 要使用哪个后端服务器,不然 bind 192.168.127.130:80 这里找不到后端服务器
backend helloworld-webserver-80-host # 后端服务器
mode http # 工作模式
server web1 192.168.127.129:80 check inter 3s fall 3 rise 5 # 声明服务器,后面定义服务器名称,下线服务器的时候就是helloworld-webserver-80-host在这个名称里面找到web1进行下线,haproxy下线服务器不是通过ip地址下线的,check表示对后端>服务器进行状态检测,如果服务器挂了,将不在发送请求到挂了的后端服务器上,intre表示多长时间检测一次,这里定义3秒,fall 3表示连续检测失败3次就踢出去,rise 5连续五次检测成功了,就在加回来
# server web2 192.168.127.131:80 check inter 3s fall 3 rise 5 # 定义两个默认会轮询访问
# 示例2.2,listen
listen webserver-80
bind 192.168.127.130:80
mode http
# redirect prefix https://www.cnblogs.com/hao-ran/ # 单独打开,他的作用的就是nginx的转发功能,这是一个302临时重定向,不记录dns缓存
server web1 192.168.127.129:80 check weight 1 maxconn 500 addr 192.168.127.129 port 8080 inter 3s fall 3 rise 5 # 如果这个地址是后端httpd的代理服务器地址,代理至后端的tomcat服务器上,addr如果我们有多个网卡的话,就写另外一个地址,用另外的网卡专门用来做这种服务检测,port检测后端服务器的哪个端口,比如8080,比如3306,只要这些端口存在我就认为他们是可用的,如果不存在我就认为他们是不可用的,可用状态页的服务器是绿的,健康检测,如果有两个端口,就会检测两个端口,如果都是好的服务都在,状态页中才会显示绿色,weight 1表示权重,如果服务器硬件性能不一样可以单独设置以下,maxconn 500表示这台服务器500并发量
server web2 192.168.127.131:80 check inter 3s fall 3 rise 5
2.5 Haproxy日志配置
- 将Haproxy的日志输出到rsyslog中,进行统一管理
- Hproxy默认的日志是输出到系统的rsyslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要haproxy的info及notice日志分别记录到不同的日志文件中
2.5.1 rsyslog
-
rsyslog是一个centos的日志处理系统,下面简单介绍下
-
/etc/rsyslog.conf
是rsyslog服务的总配置文件(相当于全局配置) -
/etc/rsyslog.d
该目录是单独配置的一个个rsyslog配置文件(相当于个性配置) -
通过修改
/etc/rsyslog.conf
以及/etc/rsyslog.d/xxx.conf
,来控制各种日志的输出
-
-
rsyslog的日志等级
日志等级简写 | 日志等级含义 | 说明 |
---|---|---|
none | 没有优先级,不记录任何日志消息 | |
0 | debug | 调试程序产生的信息 |
1 | info | 通用性消息,一般用来提供有用信息 |
2 | notice | 不是错误,但是可能需要处理 |
3 | warning/warn | 警告 |
4 | error/err | 一般错误消息 |
5 | crit | 危险情况,例如硬盘错误,可能会阻碍程序的部分功能 |
6 | alert | 需要立即修复的告警 |
7 | emerg | 紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户 |
2.5.2 配置Haproxy日志
-
首先配置haproxy的配置文件中的log设置
-
再打开rsyslog的UDP系统日志接收和TCP系统日志接收
-
过程如下:
# 1. 在haproxy的配置的global域定义:
log 127.0.0.1 local3 info # 基于rsyslog记录⽇志到指定设备
# log 127.0.0.1 local{1-7} info # 基于rsyslog记录⽇志到指定设备,级别有(err、warning、info、debug)
# 2. 编辑系统日志服务配置文件
vim /etc/rsyslog.conf
... (打开UDP和TCP的系统日志,并在文件最后添加 local3.* /var/log/haproxy.log )
# Provides UDP syslog reception (提供 UDP 系统日志接收)
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception (提供 TCP 系统日志接收)
$ModLoad imtcp
$InputTCPServerRun 514
local3.* /var/log/haproxy.log # 意思是将日志等级为3的全部输出到 /var/log/haproxy.log 文件
# 3. 重启系统日志服务
systemctl restart rsyslog
2.6 启动Haproxy
# 1. 启动Haproxy
[root@linux-node1 ~]# /etc/init.d/haproxy start
Reloading systemd: [ 确定 ]
Starting haproxy (via systemctl): [ 确定 ]
[root@linux-node1 ~]#
[root@linux-node1 ~]# netstat -lntp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 27556/haproxy
tcp6 0 0 :::8080 :::* LISTEN 20130/httpd
# 2. 启动后即可查看到日志了。 /var/log/haproxy.log 对应上面2.5中的vim /etc/rsyslog.conf 中的 local3.* /var/log/haproxy.log # 意思是将日志等级为3的全部输出到 /var/log/haproxy.log 文件
[root@linux-node1 ~]# tail -f /var/log/haproxy.log
# 3. 修改haproxy配置需要重启后生效
/etc/init.d/haproxy restart # 重启haproxy命令
标签:Haproxy,haproxy,负载,均衡器,linux,node1,服务器,root
From: https://www.cnblogs.com/Mcoming/p/18093791