HAProxy

HAProxy简介

HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。HAProxy还可以将后端的服务器与网络隔离,起到保护后端服务器的作用。HAProxy的负载均衡能力虽不如LVS,但也是相当不错,而且由于其工作在7层,可以对http请求报文做深入分析,按照自己的需要将报文转发至后端不同的服务器(例如动静分离),这一点工作在4层的LVS无法完成。

HAProxy目前主要有版本: 1.3 , 1.4 ,1.5,1.6,1.7

CentOS6.6 自带的RPM包为 1.5 的

安装配置HAproxy

HAProxy已经集成在base源中,可直接通过yum下载。

HAProxy

可以去官网直接下载源码编译安装。

配置文件HAproxy

/etc/haproxy/haproxy.cfg为haproxy的主配置文件,里面包括全局配置段(global
settings)和代理配置段(proxies)。

haproxy 的配置文件由两部分组成:全局设定(global
settings)和对代理的设定(proxies),共分为五段:global,defaults,frontend,backend,listen。

global settings:主要用于定义haproxy进程管理安全及性能相关的参数

proxies:代理相关的配置可以有如下几个配置端组成。

– defaults <name>:为其它配置段提供默认参数,默认配置参数可由下一个“defaults”重新设定。

– frontend <name>:定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。

– backend  <name>:定义“后端”服务器,前端代理服务器将会把客户端的请求调度至这些服务器。

– listen  
<name>:定义监听的套接字和后端的服务器。类似于将frontend和backend段放在一起 

HAproxy的工作模式:

HAProxy的工作模式一般有两种:tcp模式和http模式。

tcp模式:实例运行于TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查,只能以简单模式工作。此为默认模式,通常用于SSL、SSH、SMTP等应用。

http模式:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝。

当实现内容交换时,前端和后端必须工作于同一种模式(一般都是HTTP模式),否则将无法启动实例。工作模式可通过mo

mode参数在default,frontend,listen,backend中实现定义。

     

下面介绍一些HAproxy的常见用法。

应用实例

基于HAProxy实现负载均衡

在backend段或listen段中通过server定义后端节点。

格式:server <name> <address>[:port] [param*]

<name>:为此服务器指定的内部名称

[param*]:为此服务器设定的一系参数。其可用的参数很多,以下为常用参数。

服务器参数:

backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;

maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;

maxqueue <maxqueue>:设定请求队列的最大长度;

observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;

redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;

weight <weight>:服务器权重,默认为1,最大值为256,0表示不参与负载均衡;

定义负载均衡的算法,算法的定义除了listen段和backend段中也可以放在defaults段中,定义格式如下:

balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post [<max_wait>]]

常见的调度算法有:

roundrobin:基于权重进行轮询,此算法是动态的,其权重可以在运行时进行调整。

static-rr:基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效。

leastconn:新的连接请求被派发至具有最少连接数目的后端服务器,动态算法,适用于较长时间会话的场景。

source:将请求的源地址进行hash运算,并与后端服务器的总权重作取模运算后调度至某台服务器;同一IP地址的请求将始终被调度至某特定的服务器,静态算法,可以使用hash-type修改此特性;

uri:对URI的左半部分(“?”之前的部分)或整个URI进行hash运算,并与后端服务器的总权重作取模运算后调度至某台服务器;同一URI的请求将始终被调度至某特定的服务器,静态算法,可以使用hash-type修改此特性;

hdr(<name>):根据用户请求报文中指定的http首部的值进行调度,常用于实现将对同一个虚拟主机的请求始终发往同个backend
server。

前端代理服务器上配置示例(其余为默认配置):


#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  service *:80
default_backend             app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server      app1 192.168.2.7:80 maxconn 3000 weight 2
    server      app2 192.168.2.18:80 maxconn 3000 weight 1
    server      app3 127.0.0.1:8080 backup

在app1(192.168.2.7)上配置测试页面:

[root@node1 ~]# vim /web/index.html
           <h1>server node1</h1>

在app1(192.168.2.18)上:

[root@node2 ~]# vim /web/index.html
          <h1>server node2</h1>

在代理服务器上有两个接口:192.168.1.116(面向客户端),192.168.2.11。配置完成后启动haproxy服务。后端节点上启动nginx服务

HAProxy

HAProxy

已实现轮询访问。

在上述的算法中涉及到hash运算,hash-type参数可定义hash的运算方式。格式如下:

格式:hash-type <map-based|consistent>

map-based:静态方法,在线调整服务器权重不能立即生效。hash表是一个包含了所有在线服务器的静态数组。简而言之,通过这种运算方式将请求调度至后端的某台服务器,当后端的服务器放生变动时(如某台服务器宕机或新添加了一台服务器),大部分的连接将会被重新调度至一个与之前不同的服务器上。

consistent:动态发放,支持在线调整服务器权重。hash表是一个由各服务器填充而成的树状结构,使用此算法调度,当后端的服务器发生变动时,大分布的连接将依旧被调度至原本的服务器上。

默认方式为map-based,可应用于大部分场景。但是若后端的服务器为缓存服务器,使用默认方式,当后端的服务器调整时,将导致缓存无法命中,从而影响系统的性能。推荐的配置方式:

    backend <name>
    balance    uri
    hash-type consistent
    server      ....
    server      ...

对后端服务器健康状况的检测

check为server的参数,可启动对此server执行健康状态的检测。check借助其额外的参数可实现更精细的监测机制。

inter <delay>:健康状态检测的时间间隔,单位为毫秒,默认为2000,可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;

rise <count>:健康状态检测中,某离线的server从离线状态转换至正常状态需要成功检查的次数;

fall <count>:确认server从正常状态转换为不可用状态需要检查的次数;

配置示例:

    backend app
    balance     roundrobin
    server      app1 192.168.2.7:80 maxconn 3000 weight 2 check inter 1 rise 1 fall 2
    server      app2 192.168.2.18:80 maxconn 3000 weight 1 check inter 1 rise 1 fall 2
    server      app3 127.0.0.1:8080 backup

state页面

启用统计报告,通过state页面可查看到各服务器的状态及其相关信息。关于state的配置建议单独定义一个listen。

    listen stats
    mode http                                   
    bind 192.168.1.116:1080              #监听端口  
    stats enable                         #启用state功能
    stats scope app                      #统计报告的报告区段,不启动这项则报告所有区段
    stats hide-version                   #隐藏HAProxy版本号
    stats uri /haproxyadmin?stats        #state页面的访问路径
    stats realm Haproxy\ Statistics      #认证时提示信息
    stats auth baby:baby                 #认证的账号密码
    stats admin if TRUE                  #启用管理功能

配置完成后重启haproxy服务。然后访问定义的路径:http://192.168.1.116:1080/haproxyadmin?stats。首先完成认证。

HAProxyHAProxy

基于前面配置完成的健康状态检测,现在停止其中一台后端服务器的nginx服务。

    [root@node1 web]# service nginx stop
    Stopping nginx:                                            [  OK  ]

HAProxy

红色表示服务不在线,若停止所有后端服务器的服务,则会访问定义为backup的server(127.0.0.1上的sorry页面)。

HAProxy

HAProxy

基于cookie的session绑定

在响应报文中添加cookie信息,下一次的客户请求会带上这个cookie信息,服务器端根据cookie将请求始终定向至后端的某一台服务器。可用于保持session会话。

cookie配置格式:

    cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ][ postonly ] [ preserve ] [ httponly ] [ secure ][ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]

配置示例:

    backend app
    balance     roundrobin
    cookie      babyserver insert nocache indirect
    server      app1 192.168.2.17:80 check port 80 cookie app1
    server      app2 192.168.2.16:80 check port 80 cookie app2

重启服务,客户端进行访问。

客户端查看响应报文:

HAProxy

Set-Cookie首部已经添加信息,接下来该客户端的访问(只要cookie信息还在)将始终被定向至app2。

option forwardfor

客户端的请求经前端的代理服务器转发至后端的web服务器,代理服务器在转发时将目标地址改为后端的某台web服务器地址,将源地址由client
ip(客户端地址)改为自己面向后端服务器的地址。后端的web服务器若使用默认格式记录日志,则记录的客户端IP地址都为前端的代理服务器地址。这时需要在发往后端的请求报文中添加内容为客户端IP地址的首部,以便后端的web服务器能够正确获取客户端地址。

使用option forwardfor 在发往服务器的请求首部中插入“X-Forwarded-For”首部。

格式:option forwardfor [ except <network> ] [ header
<name> ] [ if-none ]

<network>:源地址被该参数匹配到时,禁用此功能;

<name>:可自定义首部名称代替“X-Forwarded-For”;

if-none:仅在此首部不存在时才允许添加至请求报文中。

    backend app
    .......
    option forwardfor header X-Client

在后端的web服务器上修改日志格式。

HAProxy

这里后端的web服务器为nginx,若为httpd,%{headname}i获取指定首部信息。重新加载配置文件后,即可获取客户端IP。需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。如果想为每一个请求都附加此首部,需要确保同时使用了“option
httpclose”,“option forceclose”和“option http-server-close”几个option。

原创文章,作者:一如既往天天荡漾,如若转载,请注明出处:http://www.178linux.com/76060

(0)
一如既往天天荡漾一如既往天天荡漾
上一篇 2017-05-17
下一篇 2017-05-17

相关推荐

  • 学习开始拼搏、加油、努力

          搏一搏单车变摩托,用4个月时间为自己创造一个更好的未来,欧耶!。。。

    Linux干货 2016-10-28
  • keepalived相关配置示例(二)

    虚拟服务器配置实验: 两台centos6主机为web service系统为CentOS6.8 n1:172.16.253.87 n2:172.16.252.5都安装httpd yum install -y httpd[root@n1 ~]#vim /var/www/html/index.html<h1>Real Server 1</h1&g…

    Linux干货 2017-06-28
  • Liunx获取信息帮助与man文档章节的划分

    首先要判断命令的类型,可用 type COMMAND 来判断命令 如果显示结果为(….是 shell内嵌)即为shell内嵌命令,如需获取帮助,使用 help COMMAND 即可; 下图的例子是pwd是shell内嵌命令 内部命令属于Shell的一部分,所以并没有单独对应的系统文件,只要Shell解释器被运行,内部指…

    2017-07-02
  • linux中权限管理

    权限的描述:           权限的意思就是用户拥有的对系统支配能力的大小在linux中是严格控制用户权限的,不同的用户给予不同的权限,权限应遵循能少给就尽量少给的原则从而增加系统的安全性。 进程安全上下文:    进程对问件访问权限的应用模型:进程的属主与文件的属主是否相同,如果相同…

    系统运维 2016-08-05
  • SED命令

    sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转…

    Linux干货 2017-05-01