一 简介:
1 haproxy 介绍
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
2 haproxy与LVS的异同:
1 两者都是负载均衡产品,但LVS是基于Linux操作系统的一种负载均衡,而haproxy 是基于第三方应用实现的软负载均衡
2 LVS是基于四层IP负载均衡技术,而haproxy是基于七层和四层技术,可以提供TCP和http应用的负载均衡总和解决方案
3 haproxy在状态检测方面功能强大,可支持端口、URL、脚本等多种检测方式
4 haproxy处理能力低于四层的LVS负载均衡,四层性能接近于硬件的性能。
二 实验环境:
主机名 | IP地址 | 作用 |
---|---|---|
server2 | 192.168.122.20 | 用于配置haproxy,以实现对后端设备的负载均衡 |
server4 | 192.168.122.40 | 后端web服务器 |
server5 | 192.168.122.50 | 后端web服务器 |
三 实验:
一 haproxy 安装
1 安装rpmbuild 来获取rpm包
1 解决依赖关系
2 进行rpmbulid -tb 进行产生rpm包
安装并复制到server3 上:(目前server3 不应用)
二 后端节点配置
1 安装HTTPd服务并设置网页
三:配置haproxy
一 复制配置文件
二 基本配置
1 配置监听IP地址和默认网页
参数讲解:
1 bind*:80
bind:此选项只能在frontend和listen部分进行定义,用于定义一个或集合鉴定的套接字,bind 使用格式
Bind[<address>:<port_range>] interface <interface>
其中address是可选,可以设置主机名或IP地址,如果设置为"*"或0.0.0.0 ,将监听当前系统的所有IPV4地址(作为监听负载均衡的服务,应该监听所有的IP地址),port_range可以是一个特定的TCP端口,也可以是一个端口的范围,小于1024的端口需要有特点通过的权限的用户才能使用,interface 是可选,用来指定网络接口的名称,只能在Linux上使用
2 mode :
指定haproxy实例运行模式。可为tcp、http。tcp为4层代理模式,不会对协议进行任何分析,只是单纯地转发数据包,如HTTPS/MYSQL等,http为7层代理模式。如果所有配置区段都没有设置mode,则默认为tcp模式。
3 log
为每个实例启用事件和流量日志,因此可用于所有区段。每个实例最多可以指定两个log参数。配置方法和意义同前文 全局配置参数 的log。
如果使用log global,则表示从全局继承日志设置。另外,如果全局已经定义过两个log了,此处除引用global外还自定义了一个log,则此自定义的log失效,因为只支持两个日志设置。
4 Option httplog
在默认情况下,haproxy 日志是不记录HTTP请求的,通过此选项可以启用日志记录HTTP请求
5 Option forwardfor
如果后端服务器需要获得客户端的真实IP,就需要配置此参数,由于haproxy工作于反向代理模式,因此发往后端真实服务器的请求中的客户端IP均为haproxy主机的IP,而非真正访问客户端的IP,通过使用forwardfor选项,haproxy 就额可以向没和发往后端真实服务器的请求添加“X-forwarded-for ”记录,这样后端真实服务器日志可以通过"x-forwarded-for"信息来记录客户端来源IP,后端服务器需要打开此设置
6 maxconn <conns>
不能用于backend区段
设定一个前端的最大并发连接数??对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出"global"段中的定义。此外,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其它的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发连接。
如果为指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;因此,将其设定了一个可接受值方为明智决定。默认为2000。
7 status_uri :
定义haproxy访问的网页。
8 default_backend
在没有匹配的"use_backend"规则时为实例指定默认后端。在"frontend"和"backend"之间进行内容交换时,通常使用"use-backend"定义匹配规则;而没有被规则匹配到的请求将由此参数指定的后端接收。
2 配置静态网页的后端调度并注释动态网页
参数讲解:
1 Balance roundrobin
此关键字用来定义负载均衡算法
roundrobin:是基于权重进行轮叫的调度算法,在服务器性能分布比较均匀时,这是一种公平的合理的算法
Static-rr:是基于权重进行轮叫调度的算法,不过此算法是静态算法,在运行时调整服务器权重不会生效
source:是基于请求源IP的算法,此算法先对请求的源IP进行hash,然后将结果与后端服务器的权重总数相除后转发至某个匹配的后端服务器,这种方式可以使用同一个客户端IP的请求始终被转发到特定的后台服务器
leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器,在会话时间较长的场景中推荐使用此算法,
uri:此算法会对部分或整个URI进行hash运算,在经过与服务器的总权重相除,最后转发到某台特定的后端服务器上
uri_param:此算法会根据URL路径中的参数进行转发,可以保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上
hdr(<name>):此算法会根据HTTP头进行转发, 如果指定的http头名不存在,则使用rondrobin算法进行策略转发
2 option redispatch
在backend服务器组启用cookie功能,以便实现cookie绑定。需要同时设置server指令中的cookie选项。
后端为静态服务器设置:
cookie NAME insert nocache
PHP做后端时设置:
cookie SESSION_COOKIE insert indirect nocache
当客户端绑定cookie对应的后端服务器宕机后,应该为此客户端重新调度一个后端server,否则将打不开页面。这时需要使用option redispatch,表示当找不到cookie对应的服务器时分配新的服务器给客户端。
3 超时时间相关
timeout http-request
haproxy等待客户端请求发送完整的超时时长。如果一开始发送了一部分,后续没有再发送,或者后续发送的一直是请求的某一部分,等达到超时时间将断开此连接。这可以防止DoS攻击。
timeout queue
当调度的后端服务器已经满负载了,即达到了该backend的最大并发连接数时,后续要调度到此backend的请求将进入队列等待后端服务器释放可用。该超时时间设置的就是某一请求在队列中的最大等待时长,当达到此时长后将被认为该请求永远无法到达服务端,haproxy会丢弃该请求并向客户端返回503状态码。
timeout connect 和retries
haproxy要和后端服务器建立连接时等待超时时间。一般如果haproxy和后端服务器处于局域网中,建立连接是瞬间的,所以该值可以设置的小一些。
retries表示和服务端建立连接失败时重试连接的次数。
timeout client
客户端和haproxy之间非活动连接保持的最大时长,达到此时长haproxy将断开和此客户端的连接。非活动表示客户端没有请求报文发送给haproxy。
timeout server
服务端和haproxy之间非活动连接保持的最大时长,达到此时长haproxy将断开和此服务器的连接。非活动表示服务端没有响应报文发送给haproxy。
timeout http-keep-alive
等待出现http请求报文出现的最大时长,即和客户端保持长连接的时长。建议设置小一些,以尽快释放连接,例如设置为2-3秒钟。
如果此项未设置,则使用timeout http-request值,如果timeout http-request也没设置,则使用timeout client的值。
timeout check
在和服务端建立连接后,健康状况检查判断的超时时长。
4 Server 这个关键字用来定义后端真实的服务器,不能用户defaults和frontend部分,格式:
Server<name><address>[:port][param*]
其中。每个参数的含义如下:
<name>,后端真实服务器制定一个内部名称,随便定义
<address>后端真实服务器的IP地址或主机名
<port>:指定连接请求发往真实服务器的目标端口,在未设定时,将使用与客户端请求的同一个端口。
[param*]:为后端服务器设定的一系列参数,
check:表示启用对后端服务器执行健康状态检查
inter:设置健康状态检查的时间间隔,单位为毫秒
rise:设置从故障状态转换至正常状态需要成功检查的次数,
fall:设置后端服务器从正常转台转换为不可用状态需要检查的次数
cookie:为指定后端服务器设定cookie值,此处指定的值将在请求入栈是被检查,第一次为此值挑选后端服务器将在后续的请求中一致被选中,目的在于实现持久化链接的功能。前面必须启用cookie。
Weight : 设置后端真实服务器的权重,默认为1,最大值为256,设置为0表示不参与负载均衡
backup:设置后端真实服务器的备份服务器,仅仅在后端所有真实服务器均不可用的情况下才启动。
三 重启服务并观察
测试:
实现了调度
当server4down 机后:
服务没有中断
四 配置backup 服务器
因为此时haproxy 监控的是80 端口,因此要用本机来做backup则需要修改本机httpd 的监听端口为8080
1 安装HTTPd服务
修改监听端口
启动服务
添加网页提示
5 重启haproxy
当server5 也down 掉之后:
五 开启日志记录功能
添加haproxy 访问日志默认其是local0
打开日志记录功能:
访问并查看:
六 配置认证和密码:
配置认证,用户名为admin,密码为root
查看是否生效:
七 配置ACL规则
ACL 语法:
acl <aclname> <criterion> [flags] [operator] [<value>] ...
aclname:指定acl的名称,在引用时区分大小写。可随意指定,且多个acl指令可以指定同一个aclname,这表示"或"的逻辑关系。
flags:可选项,表示标识位。一般会用到的标识位只有"-i",表示不区分大小写。
operator:可选项,某些操作符,有"eq"、"ge"、"gt"、"le"、"lt",表示数学上的等于、大于、小于。
<criterion>:指定检查标准,即检查方法。见下文给出的常用4层标准和7层标准
value:根据criterion的不同,值的类型不同。
(1).4层常用检查标准,官方手册: https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#7.3.3
src <ip_addr>
src_port <PORT or PORT_ranges>
dst <ip_addr>
dst_port <PORT or PORT_ranges>
其中src、src_port、dst和dst_port就是检查标准creiterion,其后的值就是value。
例如:
acl accept_clients src 192.168.100.0/24
acl reject_clients src 172.16.0.0/16
tcp-request content accept if accept_clients
tcp-request content reject if reject_clients
tcp-request content reject # 此项表明不匹配前两项的默认都拒绝
(2).7层常用检查标准,官方手册: https://cbonte.github.io/haproxy-dconv/1.9/configuration.html#7.3.6
hdr(HEADER):检查首部字段的值是否为指定的值,如hdr(Connection) -i close表示首部字段Connection的值是否为不区分大小写的close。hdr(Host) -i www.linuxidc.com表示首部字段Host的值是否为www.linuxidc.com,即请求的主机是否是指定的值。
hdr_reg(HEADER):检查首部字段是否匹配指定的模式。如hdr_reg(Host) -i .*.linuxidc.com。
http_first_req:当正处理的请求是第一个请求时返回true。
method:请求的方法为指定的方法时返回方法对应的数值,也就表示true。例如"method GET"。
acl valid_method method GET
http-request deny if ! valid_method
path:匹配uri的path部分,一般用来匹配精确的文件资源。例如path -i /a.png。
path_beg:匹配path的前缀部分。
path_end:匹配path的后缀部分。
path_reg:使用正则表达式来匹配path。
url:对整个url进行匹配。
url_beg:对url的前缀进行匹配。
还有很多很多检查方法,更多的查询官方手册,太多了。一般4层的检查标准和7层对路径path和首部hdr的标准就够了。
多个条件使用"AND"、"OR"、"!"操作符表示逻辑与、逻辑或和取反,不写时默认的操作符是"AND"。
启动后端服务器:
进行访问查看
配置页面跳转:
直接将某个客户端IP访问进行重定向
效果是一样的
八 配置网页的动静分离:
在50上安装php ,以提供动态网页
在静态网页的网站服务器上配置:
重启服务
测试:
其默认访问的是动态网页
当以/images 结尾的文件时,是跳转到静态网页的服务器中去了
原文地址:http://blog.51cto.com/11233559/2110376