您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页Haproxy安装及配置详解与算法

Haproxy安装及配置详解与算法

来源:华佗健康网
HAProxy安装及配置详解与算法

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、

快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy

运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的

均衡负载。如果说在功能上,能以proxy反向代理方式实现 WEB均衡负载,这样的产品有很多。包括Nginx,ApacheProxy,lighttpd,Cheroke 等。

但要明确一点的,Haproxy 并不是 Http 服务器。以上提到所有带反向代理均衡负载的产品,都

清一色是 WEB 服务器。简单说,就是他们能自个儿提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。而Haproxy 仅仅,而且专门是一款的用于均衡负载的应用代理。其自身并不能提供http服务。

但其配置简单,拥有非常不错的服务器健康检查功能还有专门的系统状态监控页面,当其代理的后端

服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。自1.3版本开始还引入了frontend,backend,frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend。

1.安装

官方版本获取地址:http://haproxy.1wt.eu/,不过官方页面已经打不开了,请自行搜索! 上面中的26是linux系统内核,通过命令# uname -a可查看,我使用的是CentOS

# tar xzvf haproxy-1.4.24.tar.gz # cd haproxy-1.4.24

# make TARGET=linux26 PREFIX=/usr/local/haproxy # make install PREFIX=/usr/local/haproxyb

2.配置

安装完毕后,进入安装目录配置文件,默认情况下目录里是没有.cfg配置文件的,可以回到安装文件目录下将examples下的haproxy.cfg拷贝到usr/local/haproxy下。

# cd /usr/local/haproxy # vi haproxy.cfg

默认文件内容如下:(注意!!标示开始的为默认的配置文件没有的)

CODE:

# this config needs haproxy-1.1.28 or haproxy-1.2.1

####################全局配置信息#################################### ##########参数为进程级,通常和操作系统相关########################## global

log 127.0.0.1 local0 log 127.0.0.1 local1 notice #log loghost local0 info #日志 maxconn 4096

#默认最大连接数

chroot /usr/share/haproxy #chroot运行路径 uid 99 #所属运行的用户uid gid 99 #所属运行的用户组 daemon #以后台形式运行haproxy

!!nbproc 2 #进程数量(可以设置多个进程提高性能)

!!pidfile /usr/local/haproxy/haproxy.pid #haproxy的pid存放路径,启动进程的用户必须有权限

访问此文件 #debug # #quiet

####################默认的全局设置#################################### ##########参数可以被利用配置到frontend,backend,listen组件############# defaults

log global

mode http #所处理的类别 (#7层 http;4层tcp ) option httplog #日志类别http日志格式

!!option httpclose #每次请求完毕后主动关闭http通道 option dontlognull #不记录健康检查的日志信息

!! option forwardfor #后端服务器需要获得客户端真实ip需配置的参数,可从Http Header中获得ip !!option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器 !!option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 !!stats refresh 30 #统计页面刷新间隔

retries 3 #3次连接失败就认为服务不可用,也可以通过后面设置

redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器 !!balance roundrobin #默认的负载均衡的方式,轮询方式

!!balance source #默认的负载均衡的方式,类似nginx的ip_hash !!balance leastconn #默认的负载均衡的方式,最小连接 maxconn 2000 #最大连接数 contimeout 5000 #连接超时 clitimeout 50000 #客户端超时 srvtimeout 50000 #服务器超时

####################监控页面设置#################################### listen appli1-rewrite 0.0.0.0:10001 cookie SERVERID rewrite

!! timeout check 2000 #心跳检测超时

balance roundrobin

server app1_1 192.168.34.23:8080 cookie app1inst1 check inter 2000 rise 2 fall 5 server app1_2 192.168.34.32:8080 cookie app1inst2 check inter 2000 rise 2 fall 5 server app1_3 192.168.34.27:8080 cookie app1inst3 check inter 2000 rise 2 fall 5 server app1_4 192.168.34.42:8080 cookie app1inst4 check inter 2000 rise 2 fall 5

listen appli2-insert 0.0.0.0:10002 option httpchk balance roundrobin

cookie SERVERID insert indirect nocache

server inst1 192.168.114.56:80 cookie server01 check inter 2000 fall 3 server inst2 192.168.114.56:81 cookie server02 check inter 2000 fall 3 capture cookie vgnvisitor= len 32

option httpclose # disable keep-alive

rspidel ^Set-cookie:\\ IP= # do not let this cookie tell our internal IP address

listen appli3-relais 0.0.0.0:10003 dispatch 192.168.135.17:80 listen appli4-backup 0.0.0.0:10004 option httpchk /index.html option persist balance roundrobin

server inst1 192.168.114.56:80 check inter 2000 fall 3

server inst2 192.168.114.56:81 check inter 2000 fall 3 backup

listen ssl-relay 0.0.0.0:8443 option ssl-hello-chk balance source

server inst1 192.168.110.56:443 check inter 2000 fall 3 server inst2 192.168.110.57:443 check inter 2000 fall 3 server back1 192.168.120.58:443 backup

listen appli5-backup 0.0.0.0:10005 option httpchk * balance roundrobin

cookie SERVERID insert indirect nocache

server inst1 192.168.114.56:80 cookie server01 check inter 2000 fall 3 server inst2 192.168.114.56:81 cookie server02 check inter 2000 fall 3 server inst3 192.168.114.57:80 backup check inter 2000 fall 3 capture cookie ASPSESSION len 32 srvtimeout 20000

option httpclose # disable keep-alive

option checkcache # block response if set-cookie & cacheable

rspidel ^Set-cookie:\\ IP= # do not let this cookie tell our internal IP address

errorloc 502 http://192.168.114.58/error502.html errorfile 503 /etc/haproxy/errors/503.http

####################监控页面的设置#######################

listen admin_status #Frontend和Backend的组合体,监控组的名称,按需自定义名称 bind 0.0.0.0:65532 #监听端口 mode http #http的7层模式 log 127.0.0.1 local3 err #错误日志记录

stats refresh 5s #每隔5秒自动刷新监控页面 stats uri /admin?stats #监控页面的url

stats realm itnihao\\ itnihao #监控页面的提示信息

stats auth admin:admin #监控页面的用户和密码admin,可以设置多个用户名 stats auth admin1:admin1 #监控页面的用户和密码admin1 stats hide-version #隐藏统计页面上的HAproxy版本信息

stats admin if TRUE #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)

errorfile 403 /etc/haproxy/errorfiles/403.http errorfile 500 /etc/haproxy/errorfiles/500.http errorfile 502 /etc/haproxy/errorfiles/502.http errorfile 503 /etc/haproxy/errorfiles/503.http errorfile 504 /etc/haproxy/errorfiles/504.http

#################HAProxy的日志记录内容设置################### capture request header Host len 40 capture request header Content-Length len 10 capture request header Referer len 200 capture response header Server len 40 capture response header Content-Length len 10 capture response header Cache-Control len 8

#######################网站监测listen配置##################### ###########此用法主要是监控haproxy后端服务器的监控状态############ listen site_status

bind 0.0.0.0:1081 #监听端口 mode http #http的7层模式

log 127.0.0.1 local3 err #[err warning info debug]

monitor-uri /site_status #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503

acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true

acl site_dead nbsrv(server_blog) lt 2 acl site_dead nbsrv(server_bbs) lt 2

monitor fail if site_dead #当满足策略的时候返回503,网上文档说的是500,实际测试为503 monitor-net 192.168.16.2/32 #来自192.168.16.2的日志信息不会被记录和转发 monitor-net 192.168.16.3/32

########frontend配置可以定义多个acl进行匹配操作######## frontend http_80_in

bind 0.0.0.0:80 #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似 mode http #http的7层模式 log global #应用全局的日志配置 option httplog #启用http的log

option httpclose #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式

option forwardfor #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP

########acl策略配置#############

acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$ #如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写 acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn #如果请求的域名满足www.itnihao.cn返回true -i是忽略大小写 #acl itnihao hdr(host) -i itnihao.cn

#如果请求的域名满足itnihao.cn返回true -i是忽略大小写 #acl file_req url_sub -i killall=

#在请求url中包含killall=,则此控制策略返回true,否则为false #acl dir_req url_dir -i allow

#在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false #acl missing_cl hdr_cnt(Content-length) eq 0 #当请求的header中Content-length等于0时返回true

########acl策略匹配相应############# #block if missing_cl

#当请求中header中Content-length等于0阻止请求返回403 #block if !file_req || dir_req

#block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求 use_backend server_web if itnihao_web

#当满足itnihao_web的策略时使用server_web的backend use_backend server_blog if itnihao_blog

#当满足itnihao_blog的策略时使用server_blog的backend

#redirect prefix http://blog.itniaho.cn code 301 if itnihao #当访问itnihao.cn的时候,用http的301挑转到http://192.168.16.3 default_backend server_bbs

#以上都不满足的时候使用默认server_bbs的backend

##########backend的设置##############

######################backend server_web############################# backend server_web

mode http #http的7层模式

balance roundrobin #负载均衡的方式,roundrobin平均方式

cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义 option httpchk GET /index.html #心跳检测的文件

server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1 #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,

#fall 3是3次失败认为服务器不可用,weight代表权重

server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2 #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,

#fall 3是3次失败认为服务器不可用,weight代表权重

#########################backend server_blog######################################## backend server_blog

mode http #http的7层模式

balance roundrobin #负载均衡的方式,roundrobin平均方式

cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义 option httpchk GET /index.html #心跳检测的文件

server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1 #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2 #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

###################################backend erver_bbs####################################

backend server_bbs

mode http #http的7层模式

balance roundrobin #负载均衡的方式,roundrobin平均方式

cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义 option httpchk GET /index.html #心跳检测的文件

server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1 #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2 #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重 根据实际需求,更改配置文件,我的配置如下

3.加上日志支持

是根据上面的global和default里的log配置

# vim /etc/syslog.conf

在最下边增加

local3.* /var/log/haproxy.log local0.* /var/log/haproxy.log

#vim /etc/sysconfig/syslog

修改: SYSLOGD_OPTIONS=\"-r -m 0\" 启日志服务service syslog restart

然后就可查看日志了

# tail –f /var/log/harpoxy.log

4.设置开机启动

为了方便系统在开机时加载,还可以创建启动脚本:

# vim /etc/rc.d/init.d/haproxy

内容如下: CODE: #! /bin/sh set -e PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin PROGDIR=/usr/local/haproxy PROGNAME=haproxy DAEMON=$PROGDIR/sbin/$PROGNAME CONFIG=$PROGDIR/conf/$PROGNAME.conf PIDFILE=$PROGDIR/run/$PROGNAME.pid DESC=\"HAProxy daemon\" SCRIPTNAME=/etc/init.d/$PROGNAME # Gracefully exit if the package has been removed. test -x $DAEMON || exit 0 start() { echo -n \"Starting $DESC: $PROGNAME\" $DAEMON -f $CONFIG echo \".\" } stop() {

echo -n \"Stopping $DESC: $PROGNAME\" haproxy_pid=cat $PIDFILE kill $haproxy_pid echo \".\" }

restart() {

echo -n \"Restarting $DESC: $PROGNAME\"

$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE) echo \".\" }

case \"$1\" in start) start ;; stop) stop ;; restart) restart ;; *)

echo \"Usage: $SCRIPTNAME {start|stop|restart}\" >&2 exit 1 ;; esac exit 0

保存后赐予可执行权限

# chmod +x /etc/rc.d/init.d/haproxy

就可以使用 service haproxy start|stop|restart 来控制服务的启动停止跟重启。 并通过以下命令加载到开机服务启动列表

# chkconfig –add haproxy

5.启动参数

haproxy -f <配置文件>

[-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p ] [-s] [-l] [-dk]

[-ds] [-de] [-dp] [-db] [-m <内存M>] [{-sf|-st} pidlist...] -d 前台,debug模式

-D daemon模式启动 -q 安静模式,不输出信息 -V 详细模式

-c 对配置文件进行语法检查 -s 显示统计数据 -l 显示详细统计数据 -dk 不使用kqueue

-ds 不使用speculative epoll -de 不使用epoll -dp 不使用poll

-db 禁用后台模式,程序跑在前台

-sf 程序启动后向pidlist里的进程发送FINISH信号,参数放在命令行的最后 -st 程序启动后向pidlist里的进程发送TERMINATE信号,参数放在命令行的最后

6.启动服务

启动服务:

#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

重启服务:

#/usr/local/haproxy/sbin/haproxy /usr/local/haproxy/logs/haproxy.pid`

-f

/usr/local/haproxy/haproxy.cfg

-st

`cat

停止服务:

# killall haproxy

6.查看状态

在浏览器中输入haproxy监控地址:http://ipaddress:8080/admin_status

7.Haproxy的算法

HAProxy的算法有如下8种:

1). roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的; 2). static-rr,表示根据权重,建议关注; 3). leastconn,表示最少连接者先处理,建议关注; 4). source,表示根据请求源IP,建议关注; 5). uri,表示根据请求的URI;

6). url_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name

7). hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;

8). rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

其实这些算法各有各的用法,我们平时应用得比较多的应该是roundrobin、source和lestconn,

大家可以重点关注下。这里我用HAProxy+Keepalived时没有考虑HAProxy进程级别的高HA,一来是因为淘宝也在用它作为负载均衡器,稳定性肯定不需要怀疑;二来在测试时发现确实相当的稳定,杀掉HAProxy进程还必须用kill -9。

有一点要提醒大家,HAProxy是支持虚拟主机的,这个其实很好验证,我们做个1+1的架构,后面

随便放台Nginx或Aapceh的web服务器就可能验证这种说法了;另外,经过与Nginx的正则对比,我们也确实发现HAProxy的正则处理能力上不如Nginx的强大和灵活的,我们这里也可以采取一个折衷的方案,后面的web服务器我们都用Nginx来作,如果是jsp应用,可以用Nginx+tomat,如果是跑PHP的,可以用Nginx+FastCGI(PHP5)。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务