首页 > 代码库 > Hapoxy--基础篇

Hapoxy--基础篇

                                    Hapoxy--基础篇

主要用于为tcp和基于http应用提供,高可用,负载均衡和代理服务器的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点

wKiom1Qgv4LhIMSwAAFlCyGwkIY558.jpg

工作原理如上图所示

当客户端请求到达时,经过层层解封装得到httpd的报文,然后hapoxy按照事先的配置文件对报文进行处理,而后,层层封装,传到后端,响应报文同样的也会解封装再封装最后到达客户端

Haproxy的配置结构

Global setting :全局配置段

Proxies:代理配置段

       Backend:后端服务器组的定义

       Frontend:定义面向客户的监听的地址和端口,以及关联的后端的服务器组 

       Listen:组合的方式直接定义frontend及相关的backend

       Defaults:默认的配置

 

Global配置中的参数为进程级别参数,且通常与其运行的OS有关

进程与安全相关的查宿

Chroot [dir]:修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot(),以提高安全级别,注意要确保指定的目录为空目录且任何用户不能有写权限

Daemon:以守护进程的方式工作于后台,其等同于-D选项的功能

Gid:指定GID

Group:GID不过指明的是组名

Log  <address> <facility>  {Max level [min level]]:定义全局的syslog服务器,最多两个

Log-send-hostname :syslog的信息的***添加当前主机名,可以为后面的字符串指定的名称,也可以缺省使用当前的主机名

Nbproc :指定进程个数,只能用于守护进行模式的haproxy:默认只启动一个进程,鉴于调试困难等原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式

Pidfile

Uid:指定UID

Ulimit-n:设定没进程所能打开的最大的文件描述符的个数,默认情况下会自动计算,一次不必修改此项

User:UID,但是用的是用户名

Stats

Node:定义当前节点的名称,用于HA场景中多haproxy进程共享一个IP地址时

Description:当前实例的描述信息

 

 

性能调整的相关参数

Maxconn:设定每个haproxy进程所接受的最大并发连接数其等同于命令行选项-n;

Maxpipes:使用pipe完成没和的tcp报文重组

noepoll: 禁用epoll机制

Nokqueue:禁用kqueue

Nopoll:禁用poll

Nosepoll:禁用启发式的epoll

Nosplice:禁止在linux套接字上使用tcp重组

Tune.bufsize :设定buffer的大小,同样的内存条件,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以使某些程序使用较大的cookie信息:默认为16384,其可在编译时修改,不过强烈建议使用默认值

Tune.maxaccept:设定内核调度运行时一次性可以接受的连接个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100多进程下为设定为-1可以禁止此设置一般不建议修改

Tune.maxpollevents:设定一次系统调用可以处理的最大事件数,默认取决于OS:其值小于200时可节约贷款淡水略微增大网络延迟,而大于200时会降低延迟,但会 稍稍增加网络带宽 的占用量

Tune.maxrewrite:设置首部重写或是追加而预留的缓冲空间,建议值为1024左右:在需要使用更大的空间是,haproxy会自动增加其值

Tune.rcvbuf.client

Tune,rcbuf.server 设定内核套接字中服务端和客户端接受缓存的大小,单位为字节,强烈建议使用默认值

 

Debug相关的参数

Debug

Quiet

 

代理段的定义

Defaults <name> 同于定义所有的其他配置段使用的默认彩塑,这个配置的默认配置参数可有下一个defaults重新设定

defaults

    mode                    http

    log                     global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 3000

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

frontend  main *:5000

    acl url_static       path_beg       -i /static /images /javascript /stylesheets

    acl url_static       path_end       -i .jpg .gif .png .css .js

 

    use_backend static          if url_static

    default_backend             app

Backend <name> 用于定义一系列的后端服务器,代理会叫对应客户端的请求转发至这些服务器

backend app

    balance     roundrobin

    server  app1 127.0.0.1:5001 check

    server  app2 127.0.0.1:5002 check

    server  app3 127.0.0.1:5003 check

    server  app4 127.0.0.1:5004 check

 

Listen  <name> 通过关联前端和后端定义一个完整的代理,通常只对TCP流量有用

所有的代理的名称只能使用大小写字母,数字 - _ .:此外ACL名称会分字母大小写

简单应用实验:

wKioL1Qgv9HjPMhSAAE6Qzo5018522.jpg


Yum install haproxy

修改配置文件如下

global

    log         127.0.0.1 local2

 

    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon

 

    stats socket /var/lib/haproxy/stats

 

defaults

    mode                    http

    log                     global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 3000

frontend weserver 172.16.101.200:80

         default_backend httpdserver

backend  httpdserver

         balance roundrobin

         server httpd1 192.168.1.101:80 check

         server httpd2 192.168.1.102:80 check 

 

编辑Vim /etc/rsyslog.conf添加如下内容

local2.*                                                /var/log/haproxy.log

后端节点分别安装httpd而后启动

下面查看负载均衡的效果

wKiom1QgwAaivVn_AAFtGuwcoEs748.jpg


代理段参数详解

Bind [<address>]:<port_range> [,.....]

例如

Listen http_proxy

Bind :80,:443

Bind 10.0.0.1:10080,10.0.0.1:10443

Balance <algo> [<arguments>]

Balance url_param <pram> [check_post[<max_wait>]]

Aglo:

Roundrobin 轮询   支持权重 后端服务器权重可以动态调整 支持节点慢启动方式 例如后端新加入一个服务器,那么所有客户多的分配不是一下子全部加入此服务器而是慢慢均衡

stratic-rr  静态轮询 

Leatconn 最少连接 适用于长连接的应用 支持慢启动

Source 源地址哈希 建议用于TCP模式调整,且不支持使用的cookie插入模式时使用:hash-type参数决定其是否支持慢启动或是static

Uri 基于请求的uri的左半部分[query之前]或全部进行hash常用于backendcache server hash type决定其是否支持慢启动

url_param 基于params的值进行哈希 即为=后面的值常用语后端服务器要对用户进行认证的场景

Url的语法<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

 

Hdr (<name>) 根据用户请求报文中指定的http首部进行调度 例如:hdr(host) 根据主机名进行哈希 use_domain_only:在进行哈希时仅使用域名

rdp-cookie

rdp-cookie(name)

这两种主要用于ms远程桌面的不常用

基于cookiesession绑定机制

backend中定义cookie

Cookie node insert nocache

Server name IP:port  cookie name

 

HAProxy的工作模式分为httptcp 调度时发生的协议层次 

http:仅用于调度httpd协议的服务器 会对应用层数据做深入分析,因此支持7层过滤 处理 转换的处理

Tcp:http协议的服务器调度 包括https

Mode {tcp|http|health} 默认模式不定义的话就是tcp模式

 

指定代理服务器使用的日志

Log global :使用全局中的定义

No log

Log + 格式  参考配置文件段解释

 

Capture request header host len 15

Capture rsponse header <name> len <#>

 

hash-type : map-base[取模法]不支持慢启动和consistent[一致性hash]支持慢启动

推荐cacahe servers负载均衡调度时的配置

Balance uri

hash-type consistent

 

Server <name> <address>[:port] [params]

[paramas] 

Backup 备用节点

Check:健康状态检测

可跟 inter <delay>  设定检测时时间间隔,单位为ms默认2000 也可使用fastinterdowninter来根据服务器端状态优化时间延迟

      Rise <count> :恢复时的确认次数

      Fall <count> :失时的确认次数

Maxconn:超出此数放入队列

Maxque

Observe <mode>:观察方式检测后端服务器健康状态 layer4 layer7

Redir <prefix>

示例:server srv2 172.16.100.6:80 redir http://www.baidu.com

Weight <weight>

Option使健康状态的检测个精细

语法:option httpchk <method> <uri> <version>

示例

Backend http

Mode tcp

Option httpchk OPTIONS * HTTP/1.1\r\nHost:\www.baidu.com

状态页

启用stats enable  stats auth user:password  stats hide-version  stats uri /ha?ststus  stats scope . 有效的范围 为但前页  stats realm string 登陆提示

管理接口启用的方式

Stats admin  if LOCALHOST|TURE

下面未启用后的页面

 

wKioL1QgwEmQP9ixAAP4Rm0GGXs743.jpg


ACL 访问控制列表

使用方式

定义列表---------->使用列表

Acl  <aclname> <criterion>匹配标准  [flags] [operator] <value> ......

[flags] -i 不区分大小写 -f 从指定的文件加载模式

Value 支持以下四种

整数或范围 如1024:65535 支持的操作符eq ge gt le lt 

正则表达式

<critersion>

be_sess_rate  用于测试指定的backend上会话的创建速率

示例

Acl xyz be_sess_rate gt 50

Fe_sess_rate 用于测试指定的frontnd 上会话的创建的速率

Hdr(header) <string>

Hdr(connection) -i close 请求报文测试 shdr则是响应报文

Method <string>

Path_beg <string>用于测试请求的URL是否已指定的模式开头

Acl url_static  path_beg -i /static /javescript

Path_end <string>

Acl url_static  path_end -i .jpg .png .css .js

hadr_beg <string>

Acl host_static hdr_beg(host) -i img. Video. Download ftp.

hdr_end <string> 同上

Url <string>

Url_beg <string>

url_reg <string>

 

示例

Acl static_graph url_reg.*\.(jpj|gif|js|css|ico|swf)$

use_backend varnish if static_graph

 

四层的ACL匹配标准

Dst <ip_adress> 目标地址

Dst_port <interger> 目标端狗

Src <ip_adress> 源地址

src_port <integer> 源端口

示例:

Acl good src 10.0.0.0/24

tcp-request content accept if good

tcp-request conetent reject

 

其他参数

Redirect location |prefix<to> [code<code> ] <option> [{if|unless}<condition>]

.location重写整个url prefix只重写前缀

示例

Redirect prefix https://centod.com if login_page !secure

Redirect location http://www.centod.com/ if !login_page secure

Reqadd|rspadd <string> [{if|unless} <aclname>]

示例

Acl is-ssl dst_port 81

Reqadd x-proto:\ SSl  if is-ssl

请求报文的首部的尾部添加一个首部

Option forwardfor [except <network>] [header <name>] [if-none]将真实客户端的地址加在发往后端服务器的请求首部的X-Fowarded-For

Option |no option http-server-close 是否使用长连接的在客户端侧

Option |no option httpclose 被动关闭连接,即客户端主动关闭连接是否被允许

Option |no option redispatch 是否在后端server发生故障时将同一个用户的请求定向至其他的server

Block {if|unless} <condition>

阻塞用户请求

Errorfile <code> <file>自定义错误页

示例

Errorfile 400 /etc/haproxy/errorfiles/400.html

http-request {allow|deny|auth[realm <realm>]} [{if|unless} <condition>] 基于7层做访问控制

示例

Acl nagios src 192.168.129.2

http-request allow if nagios


Hapoxy--基础篇