haproxy 介绍

1 工作在ISO 七层 根据http协议(或者工作在ISO四层 根据tcp协议) 提供web服务的负载均衡调度器

负载均衡调度器分类
工作在四层:
# lvs
工作在七层:
# nginx (web,http reverse proxy,cache)
# haproxy (http reverse proxy,tcp proxy)
# tcp: 实现MySQL的读写中读的负载均衡
# ats (apache traffic server)
# perlbal
# pound
# squid
# varnish
以上程序都可以实现服务的向外拓展;
 

haproxy特性

haproxy 当前版本为1.3  1.4,下面我们介绍1.4版本的特性

# 客户端侧的长连接(client-side keep-alive)
# TCP加速(TCP speedups)
# 响应池(response buffering)
# RDP协议
# 基于源的粘性(source-based stickiness)
# 更好的统计数据接口(a much better stats interfaces)
# 更详细的健康状态检测机制(more verbose health checks)
# 基于流量的健康评估机制(traffic-based health)
# 支持HTTP认证
# 服务器管理命令行接口(server management from the CLI)
# 基于ACL的持久性(ACL-based persistence)
# 日志分析器
 

官网站点:haproxy.1wt.eu

haproxy 架构图

haproxy.cfg 配置文件详解

 安装
# yum inistall haproxy -y
配置文件路径
/etc/haproxy/haproxy.cfg
 
(1)配置由两部分组成
#global settings: 对haproxy进程自身属性的设定----------全局设定段
#proxies: 对代理的设定 -----------------代理设定段
defaults
frontend
backend
listen
其中defaults为proxies提供默认属性,frontend接受客户端的请求,backend连接后端的上游服务器(类似于nginx的upstream),listen是特定的frontend与backend的组合
(2)定义一个完整的代理的方式:
frontend
backend
listen
(3)defaults段分析 # option httpclose:使用短连接
# option redispath:使用cookie保持会话,如果后端的server宕机,则使用redispath 重定向另一个路径继续保持会话;
# option http-server-close :当keep-alive超时时,使用该选项在服务器上关闭会话
# timeout connect :haproxy转发到后边upstream server 时等待的时长
# timeout client :客户端非活动状态的超时时长
# timeout server : haproxy和后边的服务器段保持一个会话,当后台服务器down掉后,haproxy等待的超时时间
# timeout-keep-alive:定义保持连接模式的超时时长
# timeout-check : 建立状态检测时间的超时时间
# maxconn :每一个server最大并发连接数
 

负载均衡调度方法

格式:balance  roundrobin| static-rr| leastconn | source | uri | uri_param | hdr(<name>) | rdp-cookie(name)
 
调度方法解析
#roundrobin :属于加权轮询 (动态) 支持服务器活动时修改其权重,服务器下线后重新上线时支持慢启动
#static-rr : 属于加权轮询(静态)不支持服务器活动时修改,需要重启服务才能生效
# 老服务器重新上线上时,立刻会收到大批量的请求
#leastconn :支持动态修改权重,慢启动
#source :默认为(静态)方法,hash/ 源ip 取模算法,支持hash-type调整为动态
#uri :默认为(静态)方法,hash/weight 取模算法,支持hash-type来调整
#url-params:默认为(静态)方法,hash/wgith 算法,支持hash-type调整
#hdr (<name>):默认为静态方法, 先对<name>做hash计算然后 hash/weight 计算,支持hash-type调整
 
调度方法的使用总结
#1、调度众多的MySQL从服务器,用什么调度方法?
leastconn
#2、调度web图片服务器组,用什么调度方法?
roundrobin
#3、调度web图片服务器组,用什么调度方法?
source 或者 cookie
#4、调度web缓存服务器组,用什么调度方法?
uri
hash-type:
map-based (默认的静态的hash表)
consistent(动态的一致性hash) ---------在后端的cache服务器上使用,否则会导致服务器的加入或者退出时 服务器群瘫痪
 

haproxy 的工作模式 (使用mode参数)

http :http协议  --------haproxy的价值体现于此
# 对应用层数据做深入分析,因此支持7层的过滤、处理、转换等机制; tcp :haproxy在客户端和upstream server之间建立一个全双工的连接
# 不会对应用层协议做任何检查
# SSL 、MySQL、SSL等都应该使用此模式;
# 默认模式!
 

指定haproxy日志

# log global : 使用全局配置中定义的日志服务器;
# log <address> <facility> [<level> [<minlevel>]]
# capture request header <HEADER> len <LENGTH>
# capture resopense header <HEADER> len <LENGTH>
实例:在frontend中定义一个日志
(1)编辑rsyslog.conf
#vim /etc/rsyslog.conf 在日志服务器上先定义一个日志
local3.* /var/log/hawebsrv.log
#service rsyslog restart
(2)编辑haproxy.cfg
#vim /etc/haproxy/haproxy.cfg
frontend websrv
log 127.0.0.1 local3
bind *:80
default_backend webservers
#serivce haproxy reload
(3)haproxy服务器测试
#tail /var/log/hawebsrv.log
 

haproxy中的ACL

格式:acl <aclname>  <criterion> [flags] [oprator] <value>    

      value:   支持整数或者整数范围
支持字符串
支持正则表达式
支持ip地址和网络地址
 
ACL例子
# acl url_static path_beg /static /images /img /css
# acl url_static path_end .gif .png .jpg .css .js
# acl host_www hdr_beg(host) -i www
# acl host_static hdr_beg(host) -i img. video. download. ftp.
# use_backend static if host_static or host_www or url_static
# use_backend www if host_www
 
实现访问控制
http-request:7层过滤 (借助于定义好的acl实现)
tcp-request: 4层过滤 (借助于定义好的acl实现)
 

haproxy 动静分离的实现

 架构图

1、 环境配置

haproxy服务器配置
外网网卡
# ifconfig eth0 172.16.13.2/16 up
# route add default gw 172.16.0.1
内网网卡
# ifconfig eth1 192.168.20.1/24 up 两台上游服务器配置 server1 配置
# ifconfig eth0 192.168.20.11/24
# route add default gw 192.168.20.1
提供页面
# vim /var/www/html/index.html
<h1>node1.linux.com</h1>
# service httpd start server2配置
# ifconfig eth0 192.168.20.12/24 up
# route add default gw 192.168.20.1
提供页面
# vim /var/www/html/index.html
<h1>node2.linux.com<h1>
# service httpd start
 

2、  安装配置haproxy

# yum install haproxy -y   安装haproxy
# vim /etc/haproxy/haproxy.cfg 编辑配置文件自定义一个backend和frontend,注释原有的内容
frontend websrv *:80
default_backend webservers
backend webservers
balance roundrobin
server node1 192.168.20.11:80 check
server node2 192.168.20.12:80 check
 

3、 客户端测试

此时说明 haproxy服务器将客户的请求以roundrobin算法 反向代理给后端的服务器!

4、启用全局日志功能

(一)编辑rsyslog.conf
#vim /etc/rsyslog.conf 开启如下行
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
添加日志
local2.* /var/log/haproxy.log #service rsyslog restart 重启服务
(二)编辑haproxy.cfg
# vim /etc/haproxy/haproxy.cfg 开启如下行
log 127.0.0.1 local2
# service haproxy restart 重启服务
(三)日志查看
#tail -f /var/log/haproxy.log
 

接下来让我们来拓展haproxy的功能

5 、调度算法 uri的实现

1)后端服务器 server1 与 server2 同时创建多个页面
server1
#cd /var/www/html/
# for i in {1..10}; do echo "<h1>node1.test$i</h1>" > test$i.html; done
server2 方法同 server1
2)更改haproxy.cfg的配置文件中的调度算法
balance uri
3)客户端测试
# http://172.16.13.2/test1.html
 

基于172.16.13.2/test1.html 该uri,haproxy服务器反向代理至后台服务器至同一台服务器server2

6、基于cookie实现会话绑定

1)编辑haproxy.cfg配置文件
#vim /etc/haproxy/haproxy.cfg 内容如下
frontend websrv
bind *:80
default_backend webservers
backend webservers
cookie node insert nocache
balance roundrobin
server node1 192.168.20.11:80 check cookie node1
server node2 192.168.20.12:80 check cookie node2
2)客户端测试
#http://172.16.13.2/test1.html
 

上图可见,基于cookie实现了客户端的请求与后端服务器server2的会话绑定。

7、haproxy管理界面---stats enable

# vim /etc/haproxy/haproxy.cfg 增加一个listen段,如下所示
listen statspage
bind *:8009 -------侦听端口
stats enable -------开启stats
stats hide-version -----隐藏版本
stats auth admin:admin ----登录验证信息
stats admin if TRUE ----实现在管理界面上对所有backend服务器管理
stats uri /admin?stats ----登录的uri路径
 

8、haproxy动静分离的实现

1)server2 服务器安装php
#yum -y install php php-mysql
提供php动态页面
#vim /var/www/html/index.php
<h1>node2.linux.com</h1>
<?php
phpinfo();
?> 2)重新配置haproxy配置文件
#vim /etc/haproxy/haproxy.cfg 定义frontend 和 backend
frontend websrvs
bind *:80
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js .html
acl host_static hdr_beg(host) -i img. video. download. ftp. imags. videos.
acl url_php path_end -i .php
use_backend static if url_static or host_static
use_backend dynamic if url_php
default_backend dynamic
backend static
balance roundrobin
server node1 192.168.20.11:80 check maxconn 30000 backend dynamic
balance roundrobin
server node2 192.168.20.12:80 check maxconn 1000
# service haproxy restart
3) 客户端测试 动静分离
 

如图所示:静态页面由server1服务器显示,动态页面由server2 显示。

原文链接:https://blog.51cto.com/dengaosky/2050317

Haproxy 基础详解及动静分离配置的更多相关文章

  1. NUint使用详解及Visual Studio配置

    NUint使用详解及Visual Studio配置 阅读目录 什么是单元测试? 为什么使用单元测试? NUint使用详解: 示例 属性 断言 简单测试 VS配置: External Tools Vis ...

  2. Dom探索之基础详解

    认识DOM DOM级别 注::DOM 0级标准实际并不存在,只是历史坐标系的一个参照点而已,具体的说,它指IE4.0和Netscape Navigator4.0最初支持的DHTML. 节点类型 注:1 ...

  3. nginx 的动静分离配置(tomcat)

    nginx+tomcat是想动静分离配置 首先在nginx的配置文件中添加tomcat的的集群配置 upstream tomcats { ip_hash; server 192.168.0.251:8 ...

  4. 【转】 详解Kafka生产者Producer配置

    粘贴一下这个配置,与我自己的程序做对比,看看能不能完善我的异步带代码:   -----------------------------------------    详解Kafka生产者Produce ...

  5. ubuntu apache2配置详解(含虚拟主机配置方法)

    ubuntu apache2配置详解(含虚拟主机配置方法) 在Windows下,Apache的配置文件通常只有一个,就是httpd.conf.但我在Ubuntu Linux上用apt-get inst ...

  6. Spring、Spring事务详解;使用XML配置事务

    @Transactional可以设置以下参数: @Transactional(readOnly=false) // 指定事务是否只读的 true/false @Transactional(rollba ...

  7. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  8. javaScript基础详解(1)

    javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...

  9. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

随机推荐

  1. 编译Android系统源码和内核源码

    [日期:2016-01-11] 来源:Linux社区  作者:jiangwei [字体:大 中 小]     把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...

  2. 使用Microsoft.Practices.Unity 依赖注入 转载https://www.cnblogs.com/slardar1978/p/4205394.html

    Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...

  3. Leetcode 最长连续序列

    题目链接:https://leetcode-cn.com/problems/longest-consecutive-sequence/ 题目大意: 略. 分析: 注意有重复值,序列为空等情况. 代码如 ...

  4. 极致CMS建站系统后台GETSHELL

    起因 正在学习代码审计 看到有人提交了一个注入https://www.cnvd.org.cn/flaw/show/CNVD-2019-42775 想试试看还有没有别的漏洞 受影响版本 v1.6.3 - ...

  5. js添加onclick中自定义方法

    最近写一个插件的时候遇到了这么一个问题. 插件的要求是,仅仅通过一行js代码,就需要生成相应的页面,不能改变源文件的代码 生成页面还好说,但是有一个问题就是,生成的页面中是有一个按钮的.按钮也是可以添 ...

  6. Dubbo 系列(07-1)集群容错 - 服务字典

    Dubbo 系列(07-1)集群容错 - 服务字典 [toc] Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 本篇文章,将开始分析 Dubbo 集群容错方面的 ...

  7. multiple-cursors实在是太好用了

    multiple-cursors实在是太好用了 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #8 ...

  8. python获取沪股通、深股通、港股通每日资金流向数据

    接口:moneyflow_hsgt 描述:获取沪股通.深股通.港股通每日资金流向数据,每次最多返回300条记录,总量不限制. 注:tushare模块下载和安装教程,请查阅我之前的文章 输入参数 名称  ...

  9. MOV EAX,DWORD PTR SS:[EBP+8]

    nasm来写可以写成mov eax,dword ptr [ebp + 8]理由:ebp和esp默认是ss段,所以根本不用显式说明.          eax,ebx,ecx,edx,edi,esi默认 ...

  10. Electron 常见问题

    导读: 以下记录了作者在实践中遇到的问题和最后的解决方法,如果有错误或者更新更完美的解决方案,欢迎留言指正.交流. 1.jQuery/RequireJS/Meteor/AngularJS 的问题 jQ ...