HAproxy负载均衡动静分离实现及配置详解

HAproxy的介绍


HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

HAproxy的安装及生成重要文件


HAproxy在centos6.6有较新的包,因此我们可以直接yum安装使用

#yum install haproxy -y
[root@localhost ~ ]# rpm -ql haproxy
/etc/rc.d/init.d/haproxy       //服务脚本
/etc/haproxy/haproxy.cfg       //配置文件

HAproxy的应用层次和实现模型


HAproxy的应用层次

1.可以是应用层:http

2.可以是TCP层:mysql,缓存处理

其常规应用的模型是fullnat型:

在网卡地址转换时,源IP地址和目标IP敌阵地都会发生变化。

HAproxy的配置详解


一.配置段组成:

1.全局配置:global

2.代理配置段:其中代理配置端大致还有四类:

defaults:段用于为所有其它配置段提供默认参数.

frontend:定义前端监听套接字,类似于nginx的server.

backend :定义后端的服务器,类似与nginx的upstream.

listen  :可以将前后端一起定义在listen中,通常在TCP层时使用。

整体配置如下:

global   log         127.0.0.1 local2      //定义日志chroot      /var/lib/haproxy      pidfile     /var/run/haproxy.pidmaxconn     40000user        haproxygroup       haproxydaemon# turn on stats unix socketstats socket /var/lib/haproxy/stats
defaultsmode                    httplog                     globaloption                  httplogoption                  dontlognulloption http-server-closeoption forwardfor       except 127.0.0.0/8 header X-Forword-Foroption                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 30000
listen stats                   //单独定义状态页面mode httpbind 0.0.0.0:1080stats enablestats hide-version   stats uri     /haproxyuri?statsstats realm   Haproxy\ Statisticsstats auth    admin:adminstats admin if TRUE
frontend http-in       //前端配置bind *:80mode httplog globalacl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheetsacl url_static       path_end       -i .jpg .jpeg .gif .png .css .jsuse_backend static_servers          if url_staticdefault_backend dynamic_serversbackend static_serversbalance roundrobinserver imgsrv1 172.16.200.7:80 check maxconn 6000server imgsrv2 172.16.200.8:80 check maxconn 6000
backend dynamic_serverscookie srv insert nocachebalance roundrobinserver websrv1 172.16.200.7:80 check maxconn 1000 cookie websrv1server websrv2 172.16.200.8:80 check maxconn 1000 cookie websrv2server websrv3 172.16.200.9:80 check maxconn 1000 cookie websrv3

二.HAproxy的关键指令

balance :用于指明调度算法

使用位置:defaults,listen,backend

使用格式:balance url_param <param>

常用的参数有:

roundrobin 动态加权轮询;最多接受4095并发请求。

static-rr:静态的加权轮询,其在后端服务器连接数上没有限制;

leastconn:最少连接数;动态的,适用于缓存服务器和mysql等较长会话;

source:源IP绑定,是否是静态的取决于使用的hash_type

uri:基于uri的方式,进行客户端服务器绑定,是否静态使用hash-type决定;

url_param:通过用户的参数标识来负载在均衡至不同的后端.

bind :用于定义一个或几个监听地址。

使用位置:frontend和listen。

使用格式:bind [<address>]:<port_range> [, ...]

如果定义多个监听端口:

bind :80,:8080  中间不要有空格

mode :用于实例的运行模式或协议

mode { tcp|http|health }

1.tcp: 通常用于SSL、SSH、SMTP等应用;

2.http:应用于HTTP模式,工作于应用层;

3.health:自定义外部健康状态检测

例如:mode http 指定使用http协议

hash-type

使用格式:hash-type <method>

定义用于将hash码映射至后端服务器的方法;其不能用于frontend区段;可用方法有map-based和consistent,在大多数场景下推荐使用默认的map-based方法。

map-based:就是在调度时把根据用户请求的URL,进行hash计算,然后将这个结果对后端主机的个数进行取模。假设每个主机给予1,2, 3编号这个值必然是在后端主机的之中的一个,因此这样不同的url最终hash计算结果必然不同,那么最终调度到后端主机的也必然不同,这样只有同一个UR,请求才会被调度至后端主机。这就是取模法。

但是:取模法一旦有一台主机发生故障,那么所有的主机的取模计算都将发生错误。

consistent:这种方式是将所有主机建设分布在一个0-2的32次方的数字大环上,将用户请求的URL,也进行hash计算,然后把这个结果对2的32次方取模,这个数字结果也必然是落在这个32次方数字的大环上。然后按照顺时针方向,这个数字离那个主机进,就被调度至那一台主机。

log

log global

log <address> <facility> [<level> [<minlevel>]]

启用日志,因此可用于所有区段。。

启用方法:编辑日志配置文件

 # vim /etc/rsyslog.conf14 $UDPServerRun 51460 # Save boot        messages also to boot.log61 local7.*                                               var/log/boot.log62 local2.*                                               /var/log/haproxy.log#service rsyslog restart

maxconn

使用格式:maxconn <conns>

指明前端链接的最大并发连接数,指定尽量大一些,但是不可以大于globle段落的值。

default_backend 指定默认后端,通常用于匹配的后端没有找到时使用。

使用格式:default_backend <backend>

例如:

use_backend     dynamic  if  url_dyn

use_backend     static   if  url_css url_img extension_img

default_backend dynamic

server 后端用于声明server

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

工作位置:不可以用于defaults和frontend段。

<name>:主机标示,最好设置和主机名一致。

<address>:此服务器的的IPv4地址,也支持使用可解析的主机名;

[:port]:指定目标端口,未设定时,将使用客户端请求时的同一相端口;

例如:server    node3  192.168.1.122:80 check

服务器或默认服务器参数:

backup:设定为备用服务器,这样只有当其他所有的服务器均故障时才启用。

check :启动对此server执行健康状态检查,他可以带的参数有:

inter <delay>:设定健康状态检查的时间间隔

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

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

cookie <value>:基于cookie的绑定

maxconn <maxconn>:指定此服务器接受的最大并发连接数;

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

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

redir <prefix>:启用重定向功能

server srv1 172.16.100.6:80 redir http://p_w_picpathserver.magedu.com check

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

基于cookie的绑定实例:

 cookie srv insertindirect nocache76    server    node2  172.16.249.220:80 cookie first check rise 2 fall 177    server    node4  172.16.249.248:80 cookie second check rise2   fall 1

这里面cookie绑定在了first上了。

Redir 重定向

直接在想要重定向的地方,后面添加

server    node4  172.16.249.248:80  redir http://172.16.249.122 check

Stats_enable

启用状态页面,这个页面不仅可以显示信息,还可以是控制的功能。

直接启用后端使用stats_enable ,对那个组启启用状态页面。这时的默认访问路径为

/Haproxy?stats  因此我们给予施加权限。

为了安全我们还可以修改它的Uri的

backend static74    balance     roundrobin75    server    node2  192.168.1.220:80  check rise 2    fall 176    server    node4  192.168.1.179:80   check rise 2    fall 177     stats enable                                 启用状态页面78     stats uri /ha?stats                     //状态页面请求路径79     stats realm HAPorxyStats  //状态页面的领域,中间如果有空格要\转义80     stats auth admin:pass              //认证的用户名和密码,中间用:冒号隔开。81     stats admin if TRUE         //如果是密码验证成功允许进入管理区域

但是我们通常会把stats单独定义在listen中如:

listen statsmode httpbind 0.0.0.0:1080stats enablestats uri     /haproxyadmin?statsstats realm   Haproxy\ Statisticsstats auth    admin:adminstats admin if TRUE

option forwardfor

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

含义:就是指明记录客户端ip,除了127.0.0.1 之外的IP会被记录下来。

实现过程:

frontend http-inmode httpoption forwardfor except 127.0.0.1 header X-Forword-For

然后,后端主机访问日志格式也需要做响应的修改才能实现这种结果。

编辑后端主机的配置文件,修改配置文件日志格式:

 497 LogFormat "%{X-Forword-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined498 LogFormat "%h %l %u %t \"%r\" %>s %b" common499 LogFormat "%{Referer}i -> %U" referer500 LogFormat "%{User-agent}i" agent

ACL

acl <aclname> <criterion> [flags] [operator] <value> ...

<aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;

<criterion>:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator];

[flags]:目前haproxy的acl支持的标志位有3个:

-i:不区分<value>中模式字符的大小写;

-f:从指定的文件中加载模式;

--:标志符的强制结束标记,在模式中的字符串像标记符时使用;

<value>:acl测试条件支持的值有以下四类:

整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为           通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;

字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在         其之前使用“--”标志位;

正则表达式:其机制类同字符串匹配;

IP地址及网络地址

path_beg <string>:用于测试请求的URL是否以<string>指定的模式开头;

path_end <string>:用于测试请求的URL是否以<string>指定的模式结尾;

动静的实现:


事例演示

frontend http-inbind *:80mode httpacl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheetsacl url_static       path_end       -i .jpg .jpeg .gif .png .css .jsuse_backend static_servers          if url_staticdefault_backend dynamic_servers
backend static_serversbalance roundrobinserver node1 172.16.11.1:80 check server node2 172.16.11.2:80 check
backend dynamic_serverscookie srv insert nocache   //动态内容我们是一般做cookie绑定的balance roundrobinserver node3 172.16.11.3:80 check  cookie firstserver node4 172.16.11.4:80 check  cookie secondserver node5 172.16.11.5:80 check  cookie three

转载于:https://blog.51cto.com/guanqianjian/1601470

HAproxy负载均衡动静分离实现及配置详解相关推荐

  1. 运维企业专题(5)LVS高可用与负载均衡中篇——VS/DR模式配置详解

    实验准备 1.下面的实验使用的是rhel6系列(rhel6.5)的虚拟机,因此你需要有对应的镜像和yum源 2.准备三台虚拟机,为了区分主机名与IP分别为 server1 172.25.6.1 ser ...

  2. 运维企业专题(6)LVS高可用与负载均衡中篇——VS/TUN模式配置详解

    VS/TUN隧道模式(原理就是将传输报头加一个IP进行封装),DR和NAT模式都不能跨网络,IP隧道可以,但是弊端是:IP报文进行传递时不能跨过MTU传输单元 实验准备 1.下面的实验使用的是rhel ...

  3. 运维企业专题(7)LVS高可用与负载均衡中篇——VS/NAT模式配置详解

    VS/NAT 在一组服务器前有一个调度器,它们是通过 Switch/HUB 相连接的.这些服务器提供相同的网络服 务.相同的内容,即不管请求被发送到哪一台服务器,执 行结果是一样的.服务的内容可以复制 ...

  4. Nginx+Tomcat负载均衡和动静分离理论实操详解来袭!

    文章目录 一:关于动静分离和负载均衡介绍 1.1:Nginx+Tomcat的动静分离 1.2:Nginx+Tomcat的负载均衡 1.3:Nginx配置反向代理的主要参数 二:Nginx+Tomcat ...

  5. ngixn+tomcat负载均衡 动静分离配置 (nginx反向代理)

    文章目录 Tomcat主要配置文件 Nginx负载均衡实现原理 实验环境 动静分离配置 创建静态页面 配置动态页面 图片动静分离 Tomcat主要配置文件 bin:存放启动和关闭Tomcat脚本 co ...

  6. nginx+apache实现负载均衡+动静分离配置(编译安装)

    一.编译安装nginx cd /usr/local/src wget http://nginx.org/download/nginx-1.6.3.tar.gz tar -zxvf nginx-1.6. ...

  7. Nginx的动态代理,负载均衡,动静分离的简单使用

    nginx 一 Nginx介绍 1.1 为什么要学习Nginx 问题1: 客户端到底要将请求发送那台服务器 问题2:所有客户端的请求都发送给了服务器1 问题3:客户端发送的请求可能是申请静态资源的,也 ...

  8. Nginx 反向代理 负载均衡 动静分离 高可用 原理

    1.Nginx简介 1.1 概述 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能 ...

  9. 四层负载均衡 动静分离和资源分离 Rewrite rewrite伪静态实例

    文章目录 四层负载均衡 四层负载均衡特点 查看四层负载均衡语法 四层负载均衡配置 优化配置文件 四层负载均衡日志配置 nginx的TCP负载均衡---端口转发 动静分离 单台的动静分离 多台机器动静分 ...

最新文章

  1. linux 系统目录 java_Linux系统目录及说明
  2. SQL语句在数据库中是如何执行的
  3. 回头再看N层架构(图解)
  4. AutoMapper入门使用
  5. Class类中的getEnclosing*、getDeclared*与getDeclaringClass的区别
  6. Docker 入门使用 (二)
  7. 深搜--1-n的全排列
  8. Android音视频【十一】视频混音
  9. java线程系列一:Thread类中的start()方法与run方法
  10. C#资源文件的使用方法
  11. 【数学建模常用模型】分类专题
  12. Ubuntu:back up whole system
  13. 专家建议|2022内容运营的5大SEO错误以及如何避免
  14. 十五、移动端vw+rem等比缩放布局开发的详细步骤:包含px与rem的单位换算、二倍图以及如何使用UI给的设计稿等(开发工具HBuilder)
  15. SystemUI原生信号塔替换为五格信号塔
  16. fixture ‘xxx‘ not found
  17. svchost占用内存过高电脑很卡如何解决
  18. 一款基于chatGPT的插件【Merlin】,聊天式感受强大AI能力
  19. 魅族mx四核即将使用android,魅族MX四核真机主板曝光 6月份即将上市
  20. 进制转换----二进制转十进制

热门文章

  1. 期望为线性的选择算法
  2. 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路
  3. 转------计算机网络面试小宝典
  4. 从动态表单得到的一些思考
  5. AppStore上传已经开发好的App的方法
  6. 调用函数的ALV、面向对象的ALV设置带选择列
  7. Nginx Upload Module 上传模块
  8. C++第五章课后习题16-字符串按逆序输出
  9. 运营商大数据有哪些好处
  10. Java多线程-生产者消费者问题(多个消费者多个生产者)