2、haproxy配置参数详解

代理相关配置参数   

内容参考自马哥教育

URI Syntax:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>  //<scheme>表示协议;<user>:<password>可以省略;<params>表示参数;?<query>表示查询字符串;

URI的左半部分是:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>

;<params>

ftp://downloads.dongshi.com/pub/gnu;type=d   //type=d就是指明了类型,是一个params

http://www.dongshi.com/hammers;sale=false/index.html;graphics=true   //红色部分为params

?<query>

http://www.joes-hardware.com/inventory-check.cgi?item=12741   //?item=12741表示要把item=12741当作查询条件,通过URL(红色部分)把条件发送给服务器端,然后服务器端会把查询条件嵌入到php或jsp的页面程序当中,由这个页面程序基于mysql或者其他存储协议发往服务器端,并由服务器端执行并取回结果,所以?item=12741是查询字符串。

 

什么情况下可以用到URI算法?(调度方式:对URL做hash计算,将计算结果除以总权重数)

当后端服务器是缓存服务器时特别有用,即无论哪个客户端发出请求,只要资源链接是同一个,haproxy主机都可以始终把请求发送至同一个backend server(缓存服务器)。假如有一个资源链接在之前没有被用户请求过,所以并没有缓存,那么haproxy就会根据后端缓存服务器的权重挑选一个backend server响应用户的请求。一旦根据算法挑选backend server结束,haproxy内部就会维护一个hash表,表中存储的是键值对,键是URL的hash值,值是之前挑选出的对应的backend server的地址,因此如果有客户端再次请求同一个资源链接时,haproxy会把URL做hash计算,对比内部维护的hash表,有相同的键就直接把这个请求发送到键对应的值的backend server中。

 

URI算法示例(根据请求的URL进行调度)

# vim /etc/haproxy/haproxy.cfg   //在代理服务器上进行操作

1 #---------------------------------------------------------------------
2 # static backend for serving up images, stylesheets and such
3 #---------------------------------------------------------------------
4 backend websrvs
5     balance     uri          //使用uri算法
6     hash-type   consistent   //类型为consistent
7     server   web1 192.168.128.132:80 check
8     server   web2 192.168.128.133:80 check

# systemctl reload haproxy

# systemctl status haproxy

# for i in {1..10}; do echo "<h1>Page $i on node2" > /var/www/html/test$i.html; done   //在node2上添加10个页面

# for i in {1..10}; do echo "<h1>Page $i on node3" > /var/www/html/test$i.html; done   //在node3上添加10个页面

从上面的图片可以看出,利用uri算法可以把同一个资源链接始终发送至后端的同一个backend server,无论使用什么样的请求方式。

代理参数:

balance: 指明调度算法;

动态:权重可动态调整

静态:调整权重不会实时生效

 

roundrobin: 轮询(加权轮询),动态算法,每个后端主机最多支持4128个连接;

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

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

source:这种算法有静态和动态两种,取决于hash类型

hash-type:

map-based:取模法;静态;

consistent:一致性哈希法;动态;

uri:

hash-type

map-based:更省资源

consistent:由于服务器总会上下线,所以一般会把hash-type设置为consistent

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

hash-type

map-based:

consistent:

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

hash-type

map-based:

consistent:

 

bind:

只能用于frontend, listen;

 

mode:

HAProxy的工作模式;默认为tcp;

tcp, http, health

 

log:

 

maxconn:

 

default_backend:

为frontend指明使用的默认后端;

 

use_backend: 条件式后端调用;

 

 

K.I.S.S: Keep it simple, stupid.

 

server:

 

server <name> <addr>[:port] [param*]

backup: 设定当前server为backup server;

check: 健康状态检测;

inter <delay>:检测时间间隔;单位为ms, 默认为2000;

fall: up --> down, soft state, soft state, hard state;

rise:down --> up,

cookie <value>:

maxconn: 此服务接受的并发连接的最大数量;

maxqueue: 请求队列的最大长度;

observe: 根据流量判断后端server的健康状态;

weight: 指定权重,默认为1,最大为256;0表示不被调度;

redir <prefix>: 重定向;所有发往此服务器的请求均以302响应;

 

后端http服务时的健康状态的检测方法:

option httpchk

 

基于浏览器cookie实现session sticky:

backend websrvs

balance     roundrobin

cookie SERVERID insert nocache indirect

server web1 172.16.100.68:80 check weight 1 cookie websrv1

server web2 172.16.100.69:80 check weight 3 cookie websrv2

 

要点:

(1) 每个server有自己惟一的cookie标识;

(2) 在backend中定义为用户请求调度完成后操纵其cookie

 

启用stats:

listen statistics

bind *:9090

stats enable

stats hide-version

#stats scope .

stats uri /haproxyadmin?stats

stats realm "HAPorxy\ Statistics"

stats auth admin:mageedu

stats admin if TRUE

 

向日志中记录额外信息:

capture request header

capture response header

 

当mode为http时,记录丰富的日志信息:

option httplog

 

错误页面重定向:

errorfile: 使用haproxy主机本地文件进行响应;

errorloc, errorloc302: 使用指定的url进行响应,响应状态码为302;不适用于GET以外的其它请求方法;

errorloc303:返回303状态码;

 

访问控制:

http_request

tcp_request

 

添加请求或响应报文首部:

reqadd

rspadd

 

ACL

定义,及调用;

猜你喜欢

转载自www.cnblogs.com/hanshanxiaoheshang/p/10295375.html