Haproxy安装与配置
有关高负载均衡的软件,目前使用比较多的是haproxy、nginx和lvs。下面我们就开始学习haprxoy这款软件。
1、Haproxy概念
1.1、haproxy原理
haproxy提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
haproxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或七层处理。haproxy运行在时下的硬件上,完全可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
haproxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。
事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。
1.2、haproxy的优点
- 免费开源,稳定性也是非常好。单haproxy也跑得不错,稳定性可以与硬件级的F5相媲美。
- 根据官方文档,haproxy可以跑满10Gbps,这个数值作为软件级负载均衡器是相当惊人的。
- haproxy支持连接拒绝:因为维护一个连接的打开的开销是很低的,有时我们很需要限制
gongji
蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。这个已经为一个陷于小型DDoSgongji
的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。 - haproxy支持全透明代理(已具备硬件防火墙的典型特点):可以用客户端IP地址或者任何其他地址来连接后端服务器。这个特性仅在Linux 2.4/2.6内核打了tcp proxy补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
- haproxy现多于线上的Mysql集群环境,我们常用于它作为MySQL(读)负载均衡。
- 自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警。
- HAProxy支持虚拟主机,许多朋友说它不支持虚拟主机是错误的,通过测试我们知道,HAProxy是支持虚拟主机的。
2、环境
内核版本:3.10.0-862
架构:x86_64
系统版本:CentOS Linux release 7.5.1804 (Core)
HAproxy版本:haproxy-1.8.19.tar.gz
安装方式:源码编译
安装路径:/usr/local/haproxy/
官方文档:https://www.haproxy.org/#docs
下载路径:https://www.haproxy.org/#down
3、安装Haproxy
3.1、yum安装:参考
3.1.1、官方base源安装
CentOS 6.*
和CentOS 7
安装的Haproxy版本一样
[root@node1 ~]# yum install haproxy # base源
[root@node1 ~]# haproxy -v
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>
3.1.2、SCL源安装haproxy1.8
安装 Software Collections (SCL) repository 源以获取最新版本的haproxy
sudo yum install centos-release-scl -y
安装haproxy:访问慢
sudo yum install rh-haproxy18-haproxy rh-haproxy18-haproxy-syspaths -y
开启:systemctl start rh-haproxy18-haproxy
停止:systemctl stop rh-haproxy18-haproxy
开机启动:systemctl enable rhhaproxy18-haproxy
3.2、编译安装Haproxy
3.2.1、创建运行账户和组
groupadd --system haproxy #添加haproxy的组
useradd --system -M -g haproxy haproxy -s /sbin/nologin #创建haproxy的系统账户到haproxy的组,但是禁止其登陆系统。
3.2.2、编译安装Haproxy
[root@node1 opt]# yum install gcc make -y # 安装编译工具
[root@node1 opt]# wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.19.tar.gz
[root@node1 opt]# tar xf haproxy-1.8.19.tar.gz
[root@node1 opt]# cd haproxy-1.8.19
[root@node1 haproxy-1.8.19]# uname -r
3.10.0-862.el7.x86_64
[root@node1 haproxy-1.8.19]# more README # 查看安装说明
... ...38 - linux22 for Linux 2.239 - linux24 for Linux 2.4 and above (default)40 - linux24e for Linux 2.4 with support for a working epoll (> 0.21)41 - linux26 for Linux 2.6 and above42 - linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy)43 - solaris for Solaris 8 or 10 (others untested)44 - freebsd for FreeBSD 5 to 10 (others untested)45 - netbsd for NetBSD46 - osx for Mac OS/X47 - openbsd for OpenBSD 5.7 and above48 - aix51 for AIX 5.149 - aix52 for AIX 5.250 - cygwin for Cygwin51 - haiku for Haiku52 - generic for any other OS or version.53 - custom to manually adjust every setting
... ...要构建haproxy,必须在上面操作系统中选择目标操作系统
并将其分配给TARGET变量: 我的内核是3.10.0,选择linux2628
[root@node1 haproxy-1.8.19]# make TARGET=linux2628 ARCH=x86_64 prefix=/usr/local/haproxy # TARGET指定内核版本,ARCH指定CPU架构,PREFIX指haprxoy的安装路径。
[root@node1 haproxy-1.8.19]# make install PREFIX=/usr/local/haproxy
[root@node1 haproxy-1.8.19]# ll /usr/local/haproxy/
总用量 0
drwxr-xr-x 3 root root 21 3月 22 17:50 doc
drwxr-xr-x 2 root root 21 3月 22 17:50 sbin
drwxr-xr-x 3 root root 17 3月 22 17:50 share
[root@node1 haproxy-1.8.19]# cp -a examples /usr/local/haproxy/ # 拷贝一些模板;
3.2.3、创建目录
mkdir -pv /usr/local/haproxy/conf/ready/{tcp,http} # 为多配置文件准备,省略;
mkdir -pv /usr/local/haproxy/conf/enabled/{tcp,http} # 为多配置文件准备,省略;
mkdir -pv /usr/local/haproxy/logsmkdir -pv /etc/haproxy #创建配置目录
mkdir -pv /usr/share/haproxy/ #防止启动出错
touch /usr/local/haproxy/conf/haproxy.cfg #创建配置文件
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件
3.2.4、查看haprxoy的版本
[root@node1 haproxy-1.8.19]# /usr/local/haproxy/sbin/haproxy -v
HA-Proxy version 1.8.19 2019/02/11
Copyright 2000-2019 Willy Tarreau <willy@haproxy.org>
3.2.5、把haproxy添加到系统服务
复制haproxy文件到/usr/sbin下
因为下面的haproxy.init启动脚本默认会去/usr/sbin下找。
[root@node1 haproxy-1.8.19]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
添加到系统服务并开机自启动
[root@node1 haproxy-1.8.19]# cp ./examples/haproxy.init /etc/init.d/haproxy
[root@node1 haproxy-1.8.19]# chmod 755 /etc/init.d/haproxy
[root@node1 haproxy-1.8.19]# chkconfig --add haproxy
[root@node1 haproxy-1.8.19]# chkconfig haproxy on
[root@node1 haproxy-1.8.19]# chkconfig --list|grep haproxy注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。要列出 systemd 服务,请执行 'systemctl list-unit-files'。查看在具体 target 启用的服务请执行'systemctl list-dependencies [target]'。haproxy 0:关 1:关 2:开 3:开 4:开 5:开 6:关
服务管理:
启动:service haproxy start
停止:service haproxy stop
重载:service haproxy restart
状态:service haproxy status
检查:service haproxy test
处理一个报错
[root@node1 haproxy-1.8.19]# service haproxy status
/etc/init.d/haproxy: 第 26 行:[: =: 期待一元表达式
● haproxy.service - SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments.Loaded: loaded (/etc/rc.d/init.d/haproxy; bad; vendor preset: disabled)Active: inactive (dead)Docs: man:systemd-sysv-generator(8)[root@node1 haproxy-1.8.19]# vim +26 /etc/rc.d/init.d/haproxy26 [ ${NETWORKING} = "no" ] && exit 0改为:26 [ "${NETWORKING}" = "no" ] && exit 0
4、配置Haproxy
官方文档:
https://cbonte.github.io/haproxy-dconv/1.8/configuration.html
4.1、为多配置文件准备,省略;
熟悉 Nginx 和 Apache 的朋友都知道,这两个 Webservice 都支持 include 加载多个配置文件的语法,但是 Haproxy 并不支持!如果现网映射规则非常多,那么 haproxy.cfg 这个配置文件就很长!
Hparoxy 实现多配置文件的方案,但是不是 include 语法,而是在启动的时候多次使用-f 拼接配置文件,比如:
cd /usr/local/haproxy/sbin
./haproxy -f ../conf/haproxy.cfg -f ../conf/ext1.cfg -f ../conf/ext2.cfg
因此,我们可以在配置文件目录以及启动脚本上做点改变,让 Haproxy 支持多配置文件。
路径约定:
- 待上线的 tcp 映射规则存放目录:/usr/local/haproxy/conf/ready/tcp
- 待上线的 http 映射规则存放目录:/usr/local/haproxy/conf/ready/http
- 已上线的 tcp 映射规则存放目录:/usr/local/haproxy/conf/enabled/tcp
- 已上线的 http 映射规则存放目录:/usr/local/haproxy/conf/enabled/http
- Ps:本文为多配置模式,enabled 里面的配置为软链接形式,软链接至 ready 对应配置文件,方便管理。
4.2、配置模板
Haproxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。
• global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改;
• default:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件;
• frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择);
• backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器;
• listen:Frontend和Backend的组合体;通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。
主配置:/usr/local/haproxy/haproxy.cfg文件
[root@node1 ~]# vim /usr/local/haproxy/conf/haproxy.cfg
#configure haproxy.cfg
# 全局配置
globallog 127.0.0.1 local0 # 设置日志log 127.0.0.1 local1 noticemaxconn 4000 # 最大连接数chroot /usr/local/haproxy # 安装目录user haproxygroup haproxydaemon # 守护进程运行#nbproc 1 # 进程数量,只能用于守护进程模式的haproxy;默认启动一个进程,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;pidfile /var/run/haproxy.pid# 默认配置
defaultslog globalmode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OKoption httplog # http 日志格式option dontlognull # 不记录健康检查日志信息;option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器option http-server-close#option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接;#option forwardfor # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip;#option httpclose # 主动关闭http通道,每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现; balance roundrobin # 负载均衡算法,轮询;retries 3 # 重试次数;timeout http-request 10s # 客户端建立连接但不请求数据时,关闭客户端连接;timeout queue 1m # 等待最大时长;timeout connect 10s # 定义haproxy将客户端请求转发至后端服务器所等待的超时时间;timeout client 1m # 客户端非活动状态的超长时间(默认毫秒)timeout server 1m # 客户端与服务器建立连接后,等待服务器端的超时时长(默认毫秒)timeout http-keep-alive 10s # 定义保持连接的超时时长;timeout check 10s # 心跳检测超时;maxconn 3000 # 每个server最大的连接数;# 统计页面配置
listen admin_stats bind 0.0.0.0:50000 # 监听IP和端口,为了安全可以设置本机的局域网IP及端口;mode httpoption httplog # 采用http日志格式 stats refresh 30s # 统计页面自动刷新时间 stats uri /haproxy?stats # 状态管理页面,通过/haproxy?stats来访问stats realm Haproxy Manager # 统计页面密码框上提示文本 stats auth admin:psadmin # 统计页面用户名和密码设置 #stats hide-version # 隐藏统计页面上HAProxy的版本信息#errorfile 403 /usr/local/haproxy/examples/errorfiles/ #设置haproxy 错误页面#前端配置
frontend http_mainbind 0.0.0.0:80 # http请求的端口,会被转发到设置的ip及端口# 转发规则#acl url_yuming path_beg www.yuming.com#use_backend server_yuming if url_yuming# 默认跳转项,当上面都没有匹配上,就转到backend的http_default上;default_backend http_default# 提升失败的时候的用户体验#errorfile 502 /usr/local/haproxy/examples/errorfiles/502.http#errorfile 503 /usr/local/haproxy/examples/errorfiles/503.http#errorfile 504 /usr/local/haproxy/examples/errorfiles/504.http# 后端配置
backend http_default# 额外的一些设置,按需使用option forwardforoption forwardfor header Client-IPoption http-server-closeoption httpclose# 负载均衡方式#source 根据请求源IP#static-rr 根据权重#leastconn 最少连接先处理;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,#uri 根据请求的uri#url_param 根据请求的url参数#rdp-cookie 据据cookie(name)来锁定并哈希每一次请求#hdr(name) 根据HTTP请求头来锁定每一次HTTP请求#roundrobin 轮询方式balance roundrobin # 负载均衡的方式,轮询方式# 设置健康检查页面#option httpchk GET /index.html#传递客户端真实IPoption forwardfor header X-Forwarded-For# 需要转发的ip及端口# inter 2000 健康检查时间间隔2秒# rise 3 检测多少次才认为是正常的# fall 3 失败多少次才认为是不可用的# weight 30 权重server node1 192.168.1.101:8080 check inter 2000 rise 3 fall 3 weight 30server node2 192.168.1.101:8081 check inter 2000 rise 3 fall 3 weight 30
多配置模式中,多个 frontend 必须绑定不同的 IP 或者端口,否则数据会串,导致映射到不同的后端而报错。因此,同一个 IP+端口下的映射务必配置到同一个 frontend 模块内。
4.3、配置说明
转发规则
前端配置frontend中
acl url_yuming path_beg www.yuming.com
use_backend yuming if url_yuming
当www.yuming.com
访问时,会转发给后端backend的yuming项目;可用于一下几种配置:
域名跳转:客户端通过访问某个域名跳转到跳转指定服务器或者其他域名;
IP地址跳转:客户端访问指定IP地址时,转发到后端IP;
端口跳转:客户端通过域名加端口访问时,转发到后端IP和端口;
动静分离:
默认跳转:客户端访问时,如果其它规则都不匹配,默认转发到后端IP和端口;
多ACL匹配:当指定客户端(根据IP匹配)访问某一个域名或者IP时,默认转发到后端IP和端口;
5、配置日志rsyslog
vim /etc/rsyslog.conf
# 取消如下2行注释
$ModLoad imudp
$UDPServerRun 514# 新增配置:local 1~7 –自定义的日志设备
local7.* /var/log/haproxy.log
重启syslog服务
# centos 6.*
service rsyslog restart# CentOS 7.*
systemctl restart rsyslog
6、验证
6.1、启动Haproxy
[root@node1 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
[root@node1 ~]# ps -ef |grep haproxy |grep -v grep
root 6950 1 0 19:35 ? 00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
或者
[root@node1 ~]# service haproxy start
Starting haproxy (via systemctl): [ 确定 ]
[root@node1 ~]# ps -ef |grep haproxy |grep -v grep
haproxy 4383 1 0 15:53 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
haproxy参数说明
-v 显示版本;
-vv 显示已知的构建选项。
-f 指定配置文件启动;
-p 指定pid文件;
-d 进入调试模式;
-db 仅禁用后台模式。
-dM [<byte>] 使用<byte>中毒内存(默认为0x50)
-V 进入详细模式(禁用安静模式)
-D 去守护进程;
-C 在加载文件之前更改为<dir>。
-q quiet mode:不显示消息
-c check mode:只检查配置文件并退出
-n 设置最大连接数(2000)
-m 限制可用内存量(以MB为单位)
-N 设置默认的每代理最大连接数(2000)
-L 设置本地对等名称(默认为hostname)
-p 将所有子项的pid写入此文件
-de 即使在可用时也禁用epoll()用法
-dp 即使在可用时也禁用poll()用法
-dS 禁用拼接使用(在旧内核上断开)
-dG 禁用getaddrinfo()用法
-dV 在服务器端禁用SSL验证
-sf/-st [pid]* 完成/终止旧的pid。必须是最后的论点。
6.2、前端登陆页面
URL:http://$IP:80
建议把上面两个转发改为不同的页面,不停刷新,查看是否有页面切换;
6.3、后台监控登陆
URL:http://$IP:50000/haproxy?stats
username:admin
password:psadmin
haproxy监控后台服务器的情况如图:
参考
https://www.cnblogs.com/ilanni/p/4750081.html
http://www.ttlsa.com/linux/haproxy-study-tutorial/
转载于:https://blog.51cto.com/moerjinrong/2370128