Haproxy 基础入门
===============================================================================
概述:
===============================================================================
HAProxy:
1.LB CLuster均衡集群工作的协议层分类
★LB CLuster:
⊙传输层(四层):
- lvs:Linux Virtual Server,内核(netfilter, INPUT);
- nginx(stream):
- HAProxy:mode tcp
⊙应用层(七层):(根据自定义的请求模型分类完成分发)
- http:nginx(http模块), haproxy(mode http模块), httpd, ats, ...
2.HAProxy介绍
---单一进程模型,事件驱动,弹性二叉树;
★功能介绍
- HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理;
- HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
- HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。
- HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。
★文档位置
★版本(Version)
- 1.4, 1.5, 1.6, 1.7-dev
3.haproxy的安装、程序环境及配置文件
★安装
- # yum install haproxy -y
★程序环境:
- 配置文件: /etc/haproxy/haproxy.cfg
- Unit File: haproxy.service
- 主程序: /usr/sbin/haproxy
★配置文件:
⊙global:全局配置段
- 进程及安全配置相关的参数
- 性能调整相关的参数
- Debug相关的参数
⊙proxies:代理配置段
- defaults:为frontend, backend以及listen提供默认配置;
- frontend:前端,相当于Nginx中的server{ ... };
- backend:后端,相当于nginx中的upstream { ... };
- listen:前后端的直接组合;
实验:搭建基于haproxy负载均衡后端web server
-------------------------------------------------------------------------------
实验拓扑图
实验环境描述:
- 三台虚拟主机,一台作为haproxy的反代服务器,另外两台作为后端原始Web服务器RS1和RS2;
- 真实工作中的环境应该是:hapoxy作为反代服务器,一手托两家,即要接收来自外网的的客户端请求,又要将客户端请求的内容反向代理至后端web服务器。所以,要在haproxy上准备两块网卡,一块与外网连接,接受客户端请求;一块与内网连接,和后端web服务器在同一网络,反代至后端主机(要打开网络间转发功能)。这里为了实验方便,所有的主机都在同一网段。
ip地址规划:
- haproxy ip:10.1.252.153
- RS1:10.1.252.161
- RS2:10.1.252.73
具体操作如下:
-------------------------------------------------------------------------------------------
1.编辑haproxy的配置文件/etc/haproxy/haproxy.cfg,使其能够反代至后端的web服务器,如下:
[[email protected] ~]# cd /etc/haproxy/ [[email protected] haproxy]# ls haproxy.cfg [[email protected] haproxy]#cp haproxy.cfg{,.bak} //首先做备份 [[email protected] haproxy]# vim haproxy.cfg //编辑配置文件
2.启动服务,查看端口80/tcp
[[email protected] haproxy]# systemctl start haproxy.service [[email protected] haproxy]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 25 *:514 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:*
3.为两台后端web主机提供测试页面;
[[email protected] ~]# cat /var/www/html/index.html <h1>Backend Server 1</h1> [[email protected] ~]# cat /var/www/html/index.html <h1>Backend Server 2</h1>
先启动RS1,可以发现,因为haproxy有健康状态检测所以,只反代至RS1主机
再启动RS2主机,可以发现RS1,RS2两台主机以轮询的方式进行响应,如下:
HAProxy配置参数---global配置端:
1.进程及安全配置相关的参数
★user/uid, group/gid, nbproc, ulimit-n, ca-base, ...
★定义日志系统相关属性
⊙log <address> [len <length>] <facility> [max level [min level]]:
- <address>:日志服务器地址;
- [len <length>]:每行日志记录的最大长度;
启动haproxy的记录日志功能:
1)查看haproxy的配置文件,在全局配置段中获知要想启用记录日志功能,得在/etc/rsyslog.cfg配置文件中添加
2)编辑/etc/rsyslog.cfg配置文件,启动一个记录远程日志的udp或者tcp服务
3)添加记录local2的日志
4)重启rsyslog日志服务,查看端口514/tcp或者514/udp
[[email protected] ~]# systemctl restart rsyslog.service [[email protected] ~]# ss -unl State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:68 *:* UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 *:48491 *:* UNCONN 0 0 *:44489 *:* UNCONN 0 0 *:514 *:* UNCONN 0 0 ::1:323 :::* UNCONN 0 0 :::13758 :::* UNCONN 0 0 :::514 :::*
5)在浏览器中访问两次,查看日志如下:
[[email protected] ~]# tail /var/log/haproxy.log Nov 20 20:08:57 localhost haproxy[4139]: 10.1.250.25:64580 [20/Nov/2016:20:08:57.196] main websrvs/web1 0/0/4/6/10 200 297 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1" Nov 20 20:08:57 localhost haproxy[4139]: 10.1.250.25:64580 [20/Nov/2016:20:08:57.206] main websrvs/web2 627/0/1/1/629 200 297 - - ---- 2/2/0/0/0 0/0 "GET / HTTP/1.1"
-----------------------------------------------------------------------------
2.性能调整相关的参数:
- maxconn <number>: //设定单haproxy进程的最大并发连接数;
- maxconnrate <number>: //设定单haproxy进程每秒接受的连接数;
- maxsslconn <number>: //设定单haproxy进程的ssl连接最大并发连接数;
- maxsslrate <number>: //单haproxy进程的ssl连接的创建速率上限;
- spread-checks <0..50, in percent>
- tune.rcvbuf.client <number> //接收客户端请求的缓冲大小
- tune.rcvbuf.server <number> //接收服务端响应的缓冲大小
- tune.sndbuf.client <number> //向客户端发送响应的缓冲大小
- tune.sndbuf.server <number> //向服务端发送请求的缓冲大小
- tune.ssl.cachesize <number> //ssl会话的缓存大小
- tune.ssl.lifetime <timeout> //ssl会话缓存的有效时长
3.Debugging、Userlists、Peers参数
★Debugging 调试相关的参数
- debug 尽量详细的输出信息
- quiet 尽量不输出信息
★Userlists:定义用户、组及用户列表;
- userlist <listname>
- group <groupname> [users <user>,<user>,(...)]
- user <username> [password|insecure-password <password>]
[groups <group>,<group>,(...)]
★Peers:定义haproxy同步集群
- peer
- peers
HAProxy配置参数---代理配置段:
---Proxy configuration can be located in a set of sections
★proxies:代理配置段
- defaults:为frontend, backend以及listen提供默认配置;
- frontend:前端,相当于Nginx中的server{ ... };
- backend:后端,相当于nginx中的upstream { ... };
- listen:前后端的直接组合;
1.配置参数:
★bind:
- 作用:设定监听的地址和端口;
- 语法:bind [<address>]:<port_range> [, ...]
- 使用位置:frontend,listen
★mode { tcp|http|health }
⊙作用:定义haproxy的工作模型:
- tcp:
基于layer4实现代理,可代理大多数基于tcp的应用层协议,例如ssh,mysql,pgsql等;
- http:
客户端的http请求会被深度解析;
- health:
工作为健康状态检查响应模式,当请求到达时仅回应“OK”即断开连接;
演示:
1.使用bind监听多个地址和端口,编辑配置文件/etc/haproxy/haproxy.cfg如下:
重启haproxy服务,查看端口,发现已经监听80和8080端口,如下:
[[email protected] haproxy]# systemctl restart haproxy [[email protected] haproxy]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:8080 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:6010 *:* LISTEN 0 25 *:514 *:*
2.balance调度算法
★balance
⊙作用:定义向后端主机使用的调度算法;
⊙语法格式:
- balance <algorithm> [ <arguments> ]
- balance url_param <param> [check_post]
⊙<algorithm>:算法
- roundrobin 加权轮询
server后面使用weight来定义权重;
动态算法:支持权重的运行时调整;支持慢启动;仅支持最大4095个后端活动主机
- static-rr
静态算法:不支持权重的运行时调整及慢启动;但后端主机数量无限制;
- leastconn
最少连接算法
动态算法
- first:
- source:
原地址哈希算法,将来自与同一个ip地址的请求发往同一个real server
动态算法或静态算法取决于hash-type;
- uri:
根据用户所请求的uri进行调度,在缓存服务器中使用,保证用户对同一个uri的请求发往同一个后端主机
- url_param:
对用户请求的url中的<param>部分中的指定的参数的值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;
- hdr(<name>):
指定的http首部将会被取出做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;没有有效值的会被轮询调度;
- rdp-cookie
- rdp-cookie(<name>)
⊙hash-type:
- map-based:取模法,hash数据结构是静态数组;
- consistent:一致性哈希,哈希的数据结构是“树”;
3.启动内建统计页面
★maxconn <conns>:
- 最大并发连接数,默认为2000
- 使用位置:frontend、default、listen
★stats enable:
⊙作用:启用内建的统计页,在缺少其它必要的参数时,会使用默认配置;
⊙选项:
- - stats uri : /haproxy?stats
- - stats realm : "HAProxy Statistics"
- - stats auth : no authentication
- - stats scope : no restriction
★stats uri <prefix>:
- 自定义stats页面的uri;
★stats realm <realm>:
- 启用统计信息并设置身份认证域。
★stats auth <user>:<passwd>
- 定义认证使用的账号和密码;
★stats hide-version:
- 隐藏版本信息
★stats refresh <delay>
- 自动刷新相关页面的时间间隔;
★stats admin { if | unless } <cond>
- 条件满足时启用stats内建的管理功能接口;不建议启用,有安全隐患
演示:
定义最大并发连接数并启动内建统计页,并配置统计页相关参数
-------------------------------------------------------------------------------
1.编辑配置文件/etc/haproxy/haproxy.cfg,在fortend前端添加自低昂一的最大并发连接数和启动内建统计页的参数即可,如下:
2.重载haproxy服务,在浏览器中访问内建统计页如下:
[[email protected] haproxy]# systemctl reload haproxy.service
3.自定义stats 页面的uri,同样编辑配置文件,如下:
重载haproxy服务,访问如下:
4.为统计页面添加账号和密码,编辑配置文件如下:
在浏览器中再次刷新访问,可以发现需要输入用户名和密码才可以登录,如下:
5.隐藏stats统计页面的版本信息,定义5s刷新一次,并启动stats管理功能接口,编辑配置文件,如下:
重载haprosy服务,在浏览器中刷新访问,可以看到版本信息已经隐藏,并且管理功能接口已然启动,如下:
=========================================================================================
配置示例总结: