HAProxy是一款高可用性、负载均衡基于TCP(四层)和HTTP(七层)应用的代理软件,支持虚拟主机。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。
并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
HAProxy性能
- 单进程、事件驱动模型显著降低了上下文切换的开销及内存占用
- O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测
- 在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽
相比其他负载均衡调度器,优点有:
- HAProxy是支持虚拟主机的,通过frontend指令来实现
- 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
- 支持url检测后端的服务器
- 它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
- HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS。
- 能对请求的url和header中的信息做匹配,有比lvs有更好的7层实现
配置中两大配置段、五部分配置
两大配置段
|
|
proxie配置段中的五部分配置
|
|
时间格式
|
|
Global配置参数
|
|
Proxie配置参数
- defaults
:默认配置 - frontend
:以服务端的身份对客户请求时使用 - backend
:以客户端的身份对后端服务器请求时使用 - listen
:一一对应时、或者只需监听前端,不用处理后端时(类似status页的工作原理)
配置参数:
- bind
|
|
此指令仅能用于frontend
和listen
区段,用于定义一个或几个监听的套接字
<address>
:可选选项,其可以为主机名、IPv4地址、IPv6地址或*
;省略此选项、将其指定为*
或0.0.0.0时,将监听当前系统的所有IPv4地址<port_range>
:可以是一个特定的TCP端口,也可是一个端口范围(如5005-5010),指定多个端口时,用逗号分割。代理服务器将通过指定的端口来接收客户端请求;需要注意的是,每组监听的套接字<interface>
:指定物理接口的名称,其不能使用接口别名,而仅能使用物理接口名称,而且只有管理有权限指定绑定的物理接口
示例:
|
|
- balance:后端服务器组内的服务器调度算法(不能用在frontend)
|
|
定义负载均衡算法,用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或需要将一个连接重新派发至另一个服务器时。
支持的算法有:
|
|
- hash-type
|
|
定义用于将hash码映射至后端服务器的方法;其不能用于frontend区段;可用方法有map-based和consistent,在大多数场景下推荐使用默认的map-based方法。
method:
|
|
- default_backend
|
|
在没有匹配的”use_backend”规则时为实例指定使用的默认后端,因此,其不可应用于backend区段。在”frontend”和”backend”之间进行内容交换时,通常使用”use-backend”定义其匹配规则;而没有被规则匹配到的请求将由此参数指定的后端接收。
- default-server
|
|
为backend中的各server设定默认选项
- server
|
|
为后端声明一个server,因此,不能用于defaults和frontend区段。
<name>
:为此服务器指定的内部名称,其将出现在日志及警告信息中;如果设定了”http-send-server-name”,它还将被添加至发往此服务器的请求首部中<address>
:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时需要解析主机名至相应的IPv4地址[:port]
:指定将连接请求所发往的此服务器时的目标端口,其为可选项;未设定时,将使用客户端请求时的同一相端口[param*]
:为此服务器设定的一系参数;其可用的参数非常多,具体请参考官方文档中的说明,下面仅说明几个常用的参数
|
|
- stats enable
启用基于程序编译时默认设置的统计报告,不能用于“frontend”区段。只要没有另外的其它设定,它们就会使用如下的配置
|
|
尽管”stats enable”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。下面是一个配置案例:
|
|
- stats hide-version
启用统计报告并隐藏HAProxy版本报告,不能用于“frontend”区段。默认情况下,统计页面会显示一些有用信息,包括HAProxy的版本号,然而,向所有人公开HAProxy的精确版本号是非常有风险的,因为它能帮助恶意用户快速定位版本的缺陷和漏洞。尽管“stats hide-version”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期后果。
- stats realm
|
|
启用统计报告并高精认证领域,不能用于”frontend”区段。haproxy在读取realm时会将其视作一个单词,因此,中间的任何空白字符都必须使用反斜线进行转义。此参数仅在与”stats auth”配置使用时有意义。
- stats auth
|
|
启用带认证的统计报告功能并授权一个用户帐号,其不能用于”frontend”区段。<user>
:授权进行访问的用户名<passwd>
:此用户的访问密码,明文格式
- stats admin
|
|
在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器,不过,基于安全的角度考虑,统计报告页面应该尽可能为只读的。此外,如果启用了HAProxy的多进程模式,启用此管理级别将有可能导致异常行为。
- option httplog
|
|
启用记录HTTP请求、会话状态和计时器的功能。clf
:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。
- errorfile
|
|
在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。
<code>
:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504<file>
:指定用于响应的页面文件
- option forwardfor
|
|
允许在发往服务器的请求首部中插入”X-Forwarded-For”首部。用于向后端主发送真实的客户端IP
<network>
:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能。<name>
:可选参数,可使用一个自定义的首部,如“X-Client”来替代“X-Forwarded-For”。有些独特的web服务器的确需要用于一个独特的首部。if-none
:仅在此首部不存在时才将其添加至请求报文问道中。
HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,“X-Forwarded-For”首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。
示例:
|
|
- reqadd
|
|
在请求报文中添加首部
- rspadd
|
|
在响应给客户端的报文中添加首部;上下文,除了default都可以
- reqdel
|
|
删除请求报文的某个首部、依据正则表达式进行删除
- rspdel
|
|
删除响应报文的首部
配置示例
|
|
日志配置
默认格式
|
|
tcp日志格式
option tcplog:指定日志格式为tcplog
|
|
http日志格式
option httplog:指定日志格式为 httplog
|
|
- capture cookie
|
|
记录指定cookie的日志
name
:cookie的名字length
:记录日志的长度
- capture request header
|
|
捕获请求报文的指定首部的值并记录下来
- capture response header
|
|
捕获响应报文的指定首部的值并记录
健康状态检查
对后端服务器做http协议的健康状态检测(除frontend段,都可以使用)
|
|
定义基于http协议的7层健康状态检测机制
- http-check
|
|
检查,指定返回的内容/响应码
rstatus
:匹配响应码rstring
:匹配内容
连接超时时长配置
|
|
其他配置
- use_backend
|
|
当符合指定的条件时使用特定的backend
- block
|
|
阻塞请求
- http-request
|
|
http访问控制
配置示例
|
|
ACL
aproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性。其配置法则通常分为两步,首先去定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或转发至某特定的后端。
语法格式:
|
|
<aclname>
:acl的名称(标识符)
<criterion>
:匹配标准
|
|
path: string
提取请求url的地址信息,从第一个”/“开始,不包含host,不包含参数
|
|
url : string
提取URL的全部内容,包含host和参数ACL
|
|
req请求报文:hdr([
请求报文首部访问控制
|
|
<value>
类型:
|
|
<flags>
标识位
|
|
[operator]
- 匹配整数值:
|
|
- 匹配字符串:
|
|
acl作为条件时的逻辑关系
|
|
配置示例
|
|
配置HAProxy支持https协议
- 配置支持ssl会话
|
|
ssl
:要求必须使用 ssl会话crt
:指明证书文件路径 –> 证书和私钥都在这个文件内
- 把80端口的请求重向定443
|
|
scheme
:协议ssl_fc
:如果请求的是非ssl前端的,则重定向(无需定义,因为是內建的,直接调用 ssl_fc)
- 向后端传递用户请求的协议和端口
|
|
在下一章节,我们会讲解如何使用HAProxy
对网站的动静分离实现负载均衡调度,搭配上我们前一节所学varnish
,加快对动静资源的访问速度。
本文出自Maxie’s Notes博客,转载请务必保留此出处。