haproxy学习笔记

HAProxy: 实现了一种事件驱动,单一进程模型,支持数万计的并发链接,用于为tcp和http应用程序提供高可用,负载均衡和代理服前端

务的解决方案,尤为适用于高负载且须要持久链接或7层处理机制的web站点nginx


代理(http): 
正向代理:
反向代理:web

代理做用:web缓存(加速)、反向代理、内容路由(根据流量及内容类型等将请求转发至特定服务器)、转码器;redis

在代理服务器上添加Via首部;算法

缓存的做用:
减小冗余内容传输;
节省带宽、缓解网络瓶颈;
下降了对原始服务器的请求压力;
下降了传输延迟vim

yum -y install haproxy,安装haproxy  rpm -ql haproxy,查看安装了哪些包,找到主配置文件/etc/haproxy/haproxy.cfg后端

全局配置段:浏览器

除去全局配置段,其余的都是代理配置段缓存

chroot 切换根目录,将haproxy都运行在/var/lib/haproxy 这样作是为了增长haproxy的安全安全

pidfile 指定主进程文件  maxconn  默认最大链接数   user 以哪一个用户运行haproxy   group 以哪一个组运行haproxy  daemon 运行

位守护进程 stats socket 图中有解释(这样作是为了基于共享内存访问数据,而不须要经过tcp链接以提升运行性能)

 

第一项log 指全部日志都记录到本机, 经过local2设备输出,所以还得去/etc/rsyslog.conf中添加和修改必要参数vim

/etc/rsyslog.conf (在全局配置段log 最多能够指定两个)

开启日志监听 tcp和udp的端口都开启   

local2.*  定义haproxy的日志记录位置,service rsyslog restart 重启日志服务

跳过defaults配置段去配置一台简单的负载均衡服务器

frontend 指的是代理的前端,  main是名字  *:80  全部地址都监听在80端口,default_backend:为frontend指明使用的默认后

端,使用use_backend:指明使用哪一个后端

bind 能够用来指定监听多个端口

backend 指的是代理的后端,  叫作webservers

server 指定后端服务器  web1指定名字后面是该server的ip地址 check  健康检测单位为毫秒默认2秒检测一次,  weight 权重默认

为1, backup指其余服务器都不可用时启用此server

balance: 指明调度算法;
动态:权重可动态调整
静态:调整权重不会实时生效

roundrobin: 轮询,动态算法,每一个后端主机最多支持4128个链接

static-rr: 轮询,静态算法,每一个后端主机支持的数量无上限

leastconn: 根据后端主机的负载数量进行调度;仅适用长链接的会话;动态

source :将客户端源地址hash,并由后端服务器的权重相除后发送至匹配的服务器,这使得同一个ip地址总会被发送给同一台服务器,

默认为静态

 

uri :将uri hash 此算法经常使用后端是代理缓存或反病毒代理以提升缓存命中率,默认为静态

url_param: 根据url中的指定的参数的值进行调度;把值作hash计算,并除以总权重,默认为静态

hdr(<name>) :根据请求报文中指定的header(如use_agent, referer, hostname)进行调度;把指定的header的值作hash计

,默认为静态

在hash算法中 map-based是取模法,静态 consistent是一致性哈希法,动态  下面是一个示例:

 

 再说下check,haproxy默认的健康检测时基于第四层的tcp协议,会根据配置对后端服务器的指定端口进行检测

另一种检测是基于http协议的第七层检测,有三种方法此处只介绍两种,第一种:

此种方法不推荐使用,在有些状况下会检测失误,好比后端是nginx+fpm时,本人亲测

 

第二种:

此种检测方法(经过去后端服务器获取页面资源)能够准确检测服务是否可用,推荐使用

健康检测还可指定失败次数如: fall 3   指定检测时间间隔如: inter  1000

 

如何启用haproxy的状态监控页配置以下

listen 它表明既是前端,又是后端,enable激活监控页面,hide-version隐藏haproxy的版本,auth 用户密码认证 if TRUE admin

用户认证成功了将在监控页面的底部打开调试功能

 

 

haproxy实现另外一个功能:基于浏览器cookie实现session sticky

加入了这几条指令: cookie serverid insert(在响应报文中插入serverid) cookie websrv1 当响应报文是web1发送回给

haproxy,haproxy从新构建响应首部时在Cookie首部插入serverid=websrv1,当客户端再次请求时,haproxy就会根据首部中刚插

入的serverid再次将请求调度到同一台服务器上

 

介绍defaults配置段的参数,defaults中的参数若是frotend和backend段都没有定义默认就是用defaults段的参数

mode  定义haproxy工做在哪一种模式http | tcp   log  global  表示日志就使用全句段中定义的记录日志方法 

httplog  丰富日志记录格式, dontlognull 不记录健康检测日志

 forwardfor if-none execpt x.x.x.x/mask 容许在发日后端服务器的请求首部中添加X-Forwarded-For首部 except排除哪些网

段, if-none 仅在X-Forwarded-For这个首部不存在时才添加,若是不指定if-none那么回覆盖原来X-Forwarded-For,代理若是有

多级这个if-none参数就必须了,这样作只是为了后端server记录真实的客户端ip地址 

redispatch 是否容许将session从新分配到健康的后端服务器上(在与后端服务器session创建失败时) redispatch表示容许 http-

server-close 通常http-keep-alive启用时它才起做用,容许haproxy端主动断开客户端的链接(客户端创建了server链接但没发起

请求并且持久链接超时的状况下或者客户端请求的资源达到必定个数)

3 表示3次与后端服务器链接失败就认定服务器不可用  queue 设定请求队列的超时时长  http-request  等待客户端http请求超时时长

(若是客户端发送请求发了一半但客户端挂了的状况下) http-keep-alive 指定客户端与haproxy的持久链接超时时长, connect与

后端服务器成功创建tcp链接须要等待的超时时长,server等待后端服务器发送响应报文的超时时长,client  haproxy发送了响应报文

等待client肯定的超时时长 maxconn haproxy最多能创建多少个并发链接

 

haproxy 还能够向响应报文首部添加自定义首部

rspadd Via:\ nihao   向对客户端的响应报文中添加Via首部,\是由于后面跟了一个空格,要对空格转义

 

haproxy 经过acl功能根据http请求报文中的请求方法实现对后端不一样服务器组的调度

read 定义acl的名字, method匹配请求报文中首部Request Method的值

 if write 若是匹配write这条acl 就使用tag_engine这个服务器组(if后面若是给了多个名字则要同时知足)

 

haproxy经过acl实现动静网页分离

 

这里的应用服务器我使用了cookie作会话绑定,insert 后面加nocache是官方给出的建议

这样就实现了动静分离 很简单吧

相关文章
相关标签/搜索