HAProxy安装及配置
1、安装
1、安装相关软件库
yum install -y gcc
2、创建路径下载安装包
mkdir –p /zjl/software
wget http://download.openpkg.org/components/cache/haproxy/haproxy-1.8.6.tar.gz
3、创建一个不能登录的用户管理HAProxy
groupadd HAProxy
useradd -s /sbin/nologin –M –g HAProxy HAProxy
4、创建安装目录:
创建安装目录: mkdir –p /zjl/program
5、编译参数说明(转载自:http://blog.sina.com.cn/s/blog_51d3553f0100u1bb.html):
make TARGET=os ARCH=arch CPU=cpu USE_xxx=1 …
编译之前,首先查看一下系统内核,因为参数与系统内核有关。 uname –r 或 uname –a
2.6.32-504.el6.x86_64
参数说明(在README文件中这些参数都有体现)
TARGET:
指定对目标操作系统在编译的时候进行优化,可选择如下值之一:
linux22 for Linux 2.2
linux24 for Linux 2.4 and above (default)
linux24e for Linux 2.4 with support for a working epoll (> 0.21)
linux26 for Linux 2.6 and above
solaris for Solaris 8 or 10 (others untested)
freebsd for FreeBSD 5 to 8.0 (others untested)
openbsd for OpenBSD 3.1 to 4.6 (others untested)
cygwin for Cygwin
generic for any other OS.
custom to manually adjust every setting
如果目标系统不确定,则保持默认值generic即可。
CPU:
指定对特定的cpu进行优化,可以选择值如下:
i686 for intel PentiumPro, Pentium 2 and above, AMD Athlon
i586 for intel Pentium, AMD K6, VIA C3.
ultrasparc : Sun UltraSparc I/II/III/IV processor
generic : any other processor or no specific optimization. (default)
ARCH:
指定ARCH值可强制编译成圣针对一个特定系统架构程序。
通常用于在一个系统架构的平台上生成针对另一个不同架构平台的程序。
比如:在一个64位架构的目标系统上编译生成一个32位的程序。
当前可选的值有:
x86_64
i386
i486
i586
i686
注意:如果选择上述其中的一个值“-m32”或“-m64”会被添加到CFLAGS和LDFLAG选项中。
DEBUG:
指定生成调试信息,可通过指定DEBUG= DDEBUG_xxx对特定的代码部分生成调试信息。当前定义的DEBUG宏有:
DEBUG_FULL
DEBUG_MEMORY
DEBUG_FSM
DEBUG_HASH
DEBUG_AUTH
USE_PCRE和USE_STATIC_PCRE:
可以通过指定“USE_xxx=1”表示使用,“USE_xxx=”表示禁用。
指定是否使用libpcre库中的正则表达式实现来替换系统的libc库中的实现,考虑到使用libpcre库的效率要比libc高,因此推荐此项使用。
注意:
因为libpcre还没有广泛普及,因此在动态链接的时候,需要确保目标系统安装有libpcre的动态库。针对上面的问题,可以使用USE_STATIC_PCRE 指定动态链接libpcre。
使用libpcre编译时,需要确保系统中已经安装了libpcre库。若不使用libpcre,则默认使用系统libc库中的标准正则表达式实现。
强烈推荐使用STATIC_PCRE
PREFIX:
指定安装目录,默认为/usr/local,其他诸如文档之类的文件将会在PREFIX指定的相应目录下。
DESTDIR:
指定安装目录,默认没有设置,如果想将haproxy安装一个沙盒中则可以指定该属性。
考虑到我们的系统为Linux,内核2.6+版本的,CPU为x86_64的,可以使用如下命令编译:
make TARGET=linux26 USE_STATIC_PCRE=1
以上参数值用于说明使用,重点是下面所要执行的命令:
为了简便,我们这里不加USE_STATIC_PCRE参数。
make TARGET=linux26 PREFIX=/usr/local/haproxy-1.8.6
6、编译命令:
make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
7、配置文件:
解压后的安装包里examples 文件夹下一些cfg格式的文件都是简单的配置
配置:
View Codeglobal daemon # 后台方式运行 nbproc 1 pidfile /zjl/program/haproxy/conf/haproxy.pid defaults mode tcp #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置 option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 maxconn 4096 #默认的最大连接数 timeout connect 5000ms #连接超时 timeout client 30000ms #客户端超时 timeout server 30000ms #服务器超时 #timeout check 2000 #=心跳检测超时 log 127.0.0.1 local0 err #[err warning info debug] ########test1配置################# listen test1 #这里是配置负载均衡,test1是名字,可以任意 bind 0.0.0.0:80 #这里是监听的IP地址和端口,端口号可以在0-65535之间,要避免端口冲突 mode tcp #连接的协议,这里是tcp协议 #maxconn 4086 #log 127.0.0.1 local0 debug server s1 192.168.244.131:80 #负载的机器 server s2 192.168.244.130:80 #负载的机器,负载的机器可以有多个,往下排列即可8、启动:
/zjl/program/haproxy/sbin/haproxy -f /zjl/program/haproxy/conf/haproxy.cfg
-f 是指定我们的配置文件的路径。
9、验证
在另外两台机器192.168.244.130、192.168.244.131 上安装了nginx
haproxy所在的机器为:192.168.244.128
配置haproxy.cfg 监听端口 80 , 协议为http
重启后多次访问http://192.168.244.128 把访问负载到192.168.244.130、192.168.244.131 这两台机器上的nginx
10、配置监控页面
haproxy带有监控功能,而且配置简单,直接在主配置文件中加入一下配置即可
用户名/密码 admin/admin
listen admin_stats bind 0.0.0.0:8888 mode http stats uri /haproxy stats realm Global\ statistics stats auth admin:admin给监控配置端口检测:注意(check port 3306)
listen test1 bind 0.0.0.0:3306 mode tcp #maxconn 4086 #log 127.0.0.1 local0 debug server s1 192.168.111.101:3306 check port 3306 server s2 192.168.111.102:3306 check port 3306
2、配置文件详解
haproxy 配置中分成五部分内容,分别如下:
1 、global: 参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改
2 、defaults: 配置默认参数,这些参数可以被用到frontend,backend,Listen组件
3 、frontend: 接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend
4 、 backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器
5 、 Listen: 是 Fronted和backend的组合体
有关haproxy配置文件我们先简单介绍,如下:
global配置段,用于设定全局配置参数。
代理配置段中,主要是使用defaults、frontend、backend、listen关键词。
1、defaults配置段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。
2、frontend配置段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
3、backend配置段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
4、listen配置段通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。
在上述haproxy配置文件中,我们主要讲解ACL的匹配规则。
acl is_dg hdr_beg(host) dg.test.com 该行定义一个is_dg规则,如果客户端请求的是dg.test.com这个域名,则定义该规则为is_dg。
use_backend dgserver if is_dg 该定义一个dgserver服务器组,如果客户端请求符合is_dg定义的规则,则把该客户端的请求分发到dgserver服务器组。
acl is_ip src 192.168.5.140 该行定义一个is_ip规则,如果客户端的IP地址是192.168.5.140,则定义该规则为is_ip。
use_backend acl if is_171 is_ip 该定义一个acl服务器组,如果客户端请求同时符合is_ip和is_171定义的规则,则把该客户端的请求分发到acl服务器组。
default_backend backend_default 该行定义一个默认服务器组,如果客户端请求不符合上述定义的任何一个规则,则把该客户端的请求分发到backend_default服务器组。
##全局配置信息### global log 127.0.0.1 local3 #[error warringinfo debug]#定义haproxy 日志级别 #log 127.0.0.1 local1 notice #log loghost local0 info maxconn 32768 #默认最大连接数 chroot /usr/local/haproxy #安装目录 uid 99 #运行haproxy 用户 UID gid 99 #运行haproxy 用户组gid daemon #以后台形式运行harpoxy nbproc 1 #设置harpoxy 的进程数量 pidfile /usr/local/haproxy/run/haproxy.pid #haproxy的进程PID文件 ulimit-n 65535 #ulimit 的数量限制 #debug #haproxy 调试级别,建议只在开启单进程的时候调试 #quiet ####默认配置选项####### defaults log global mode http #设置haproxy的代理模式(7层代理http,4层代理tcp) maxconn 65535 #最大连接数 option httplog #设置日志类别为http日志 option httpclose #设置每次请求完毕后主动关闭http通道 option dontlognull #不记录健康检查日志信息 option forwardfor #如果后端服务器需要获得客户端的真实ip,需要配置此参数,可以从http header 中获取客户端的IP retries 3 #3次连接失败就认为服务器不可用,也可以通过后面设置 option redispatch #设置serverID 对应的服务器挂掉后,强制定向到其他健康的服务器 stats refresh 30 # 设置统计页面刷新时间间隔 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 balance roundrobin #设置默认负载均衡方式,轮询方式 #balance source # 设置默认负载均衡方式,对源ip的hash,原理类似于nginx的ip_hash #balnace leastconn #设置默认负载均衡方式,最小连接数 contimeout 5000 #设置连接超时时间 clitimeout 50000 #设置客户端超时时间 srvtimeout 50000 #设置服务器超时时间 timeout check 2000 #设置心跳检查超时时间 #timeout http-request 10s #默认http请求超时时间 #timeout queue 1m #默认队列超时时间 #timeout connect 10s #默认连接超时时间 #timeout client 1m #默认客户端超时时间 #timeout server 1m #默认服务器超时时间 #timeout http-keep-alive10s #默认持久连接超时时间 #########设置监控页面###### listen admin_status bind 0.0.0.0:81 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称 mode http #设置http的7 层模式层 log 127.0.0.1 local3 err #错误日志记录 stats refresh 30s #设置监控页面刷新时间:5s stats uri /haproxy-stats # 设置监控页面的url stats realm Frank \Frank #设置页面提示信息 stats auth admin:admin123 #设置监控页面的用户名和密码:admin,可以设置多个用户名 stats auth Frank:Frank #设置监控页面的用户和密码:Frank stats hide-version #隐藏监控页面的HAproxy版本信息 stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本) ########设置haproxy 错误页面##### errorfile 403 /usr/local/haproxy/errorfiles/403.http errorfile 500 /usr/local/haproxy/errorfiles/500.http errorfile 502 /usr/local/haproxy/errorfiles/502.http errorfile 503 /usr/local/haproxy/errorfiles/503.http errorfile 504 /usr/local/haproxy/errorfiles/504.http ##### 设置frontend######### 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,需要配置此参数,将可以从HttpHeader中获得客户端IP ####acl 策略配置###### acl frank_web hdr_reg(host) -i ^(www.test.com.sh|news.test.com.sh)$ #如果请求的域名满足正则表达式中的2个域名返回true -i 是忽略大小写 # acl frank_fund hdr_dom(host) -i fund.test.com.sh #如果请求的域名满足fund.test.com.sh返回true -i是忽略大小写 acl frank hdr(host) -i test.com.sh #如果请求的域名满足test.com.sh返回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 #### Manage interface #### acl Frank_Manage path_dir /Frank/manage/ acl Frank_Network src 192.168.151.189 192.168.152.0/24 ## deny lb.html### acl Frank_lb path /lb.html ########acl策略匹配相应############# block if Frank_lb block if Frank_Manage !Frank_Network #block if missing_cl #当请求的header中Content-length等于0阻止请求返回403 #block if !file_req || dir_req #block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求 redirect prefix http://192.168.151.249 code 301 if frank #当访问test.com.sh的时候,用http的301挑转到http://192.168.151.249 use_backend server_web if frank_web #当满足frank_web的策略时使用server_web的backend服务器 #use_backend server_blog if frank_fund #当满足frank_fund的策略时使用server_blog的backend服务器 default_backend server_web #以上都不满足的时候使用默认server_web的backend服务器 ##########backend的设置############## ####################backend server_web######################### backend server_web mode http #http的7层模式 balance roundrobin #负载均衡的方式,roundrobin平均方式 #cookie SERVERID insert indirect nocache #允许serverid插入cookie中,serverid后面可以定义 option httpchk GET /lb.html HTTP/1.0 #心跳检测的文件 server 192.168.51.78 192.168.151.78:80 weight 1 cookie cookie78 check inter 1500 rise 3 fall 3 #服务器定义,cookie 78表示serverid为web78,check inter1500 是检测心跳频率,rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight 1代表权重为1 server 192.168.151.79 192.168.151.79:80 weight 1 cookie cookie79 check inter 1500 rise 3 fall 3 #服务器定义,cookie 79表示serverid为web79,check inter1500 是检测心跳频率,rise 3 是3次正确认为服务器可用,fall 3 是3次失败认为服务器不可用,weight 1代表权重为1另:
global daemon maxconn 60000 #ulimit -n至少为60018最大连接并发数 #user /var/sbin/haproxy #user haproxy #运行haproxy的用户 #chroot /usr/local/haproxy #安裝根目錄 pidfile /var/run/haproxy.pid log 127.0.0.1 local2 defaults mode http log global #option http-keep-alive #使用keepAlive连接 option forwardfor #如果后端服务器需要获得客户端的真实ip,需要配置的参数,记录客户端IP在X-Forwarded-For头域中 option http-server-close # 后端为动态应用程序建议使用http-server-close,后端为静态建议使用http-keep-alive option httplog #开启httplog,HAProxy会记录更丰富的请求信息 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 #option httpchk GET /healthCheck.html #定义默认的健康检查策略 option redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康的服务器 balance roundrobin #设置默认负载均衡方式,轮询方式 #balance source 设置默认负载均衡方式,类似于nginx的ip_hash #balance leastconn 设置默认负载均衡方式,请求转发到具有最少连接数目的后端服务器,在会话时间较长的场景中推荐使用此算法。例如数据库负载均衡等 timeout connect 2000ms #haproxy和服务端建立连接的最大时长,设置为1秒就足够了。局域网内建立连接一般都是瞬间的 timeout client 10000ms #和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为10秒以尽快释放连接 timeout server 8000ms #和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是并发时,如设置为1-3秒 timeout http-request 12000ms #从连接创建开始到从客户端读取完整HTTP请求的超时时间,用于避免类DoS攻击 timeout queue 5000ms #请求在队列中排隊的最大时长 ########frontend前端配置############## frontend http-in bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了 #maxconn 30000 #定义此端口上的maxconn最大连接并发数 #url地址重寫,條件 #acl login_AuthCallBack path_beg -i /Account/AuthCallBack? #acl login_AuthCallBack url_beg (/Account/AuthCallBack\?) #acl login_AuthCallBack path_reg (/Account/AuthCallBack\?) #acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 #acl url_ms1 path_beg -i /ms1/ #定义ACL,当uri以/ms1/开头时,ACL[url_ms1]为true #acl url_ms2 path_beg -i /ms2/ #同上,url_ms2 #acl web hdr(host) -i www.abc.com #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则 #acl img hdr(host) -i img.abc.com #如果访问img.abc.com这个域名,就触发img规则。 #redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 重定向 #redirect prefix http://192.168.21.126:8089 if login_AuthCallBack #測試可用1 重定向 #redirect location http://192.168.21.126:8089 if login_AuthCallBack #redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #redirect location http://0.0.0.0:8000/ if login_AuthCallBack #use_backend youxi_pool if youxi #use_backend ms1 if url_ms1 #当[url_ms1]为true时,定向到后端服务群ms1中 #use_backend ms2 if url_ms2 #当[url_ms2]为true时,定向到后端服务群ms2中 #use_backend webserver if web #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。 #use_backend imgserver if img #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。 default_backend dynamic_servers #其他情况时,定向到后端服务群default_servers中 backend dynamic_servers #定义后端服务群default_servers #balance roundrobin #棄用這行設置,會導致後端服務器誰優先寫入了cookie的值,則以後每次請求都會定向到此後端服務器(不會輪詢了) #cookie app_cook insert indirect nocache #server webser1 192.168.21.126:8076 cookie webser1 maxconn 300 check server webser1 192.168.21.126:8070 cookie webser1 maxconn 300 check server webser2 192.168.21.126:8071 cookie webser2 maxconn 300 check server webser3 192.168.21.126:8072 cookie webser3 maxconn 300 check server webser4 192.168.21.126:8073 cookie webser4 maxconn 300 check #backend ms1 #定义后端服务群ms1 # balance roundrobin #使用RR负载均衡算法 # cookie HA_STICKY_ms1 insert indirect nocache #会话保持策略,insert名为"HA_STICKY_ms1"的cookie # # #定义后端server[ms1.srv1],请求定向到该server时会在响应中写入cookie值[ms1.srv1] # #针对此server的maxconn设置为300 # #应用默认健康检查策略,健康检查间隔和超时时间为2000ms,两次成功视为节点UP,三次失败视为节点DOWN # server ms1.srv1 192.168.8.111:8080 cookie ms1.srv1 maxconn 300 check inter 2000ms rise 2 fall 3 # # #同上,inter 2000ms rise 2 fall 3是默认值,可以省略 # server ms1.srv2 192.168.8.112:8080 cookie ms1.srv2 maxconn 300 check # #backend ms2 #定义后端服务群ms2 # balance roundrobin # cookie HA_STICKY_ms2 insert indirect nocache # server ms2.srv1 192.168.8.111:8081 cookie ms2.srv1 maxconn 300 check # server ms2.srv2 192.168.8.112:8081 cookie ms2.srv2 maxconn 300 check #backend imgserver # mode http # option httpchk /index.php # balance roundrobin # server img01 192.168.137.101:80 check inter 2000 fall 3 # server img02 192.168.137.102:80 check inter 2000 fall 3 ########统计页面配置######## listen stats #定义监控页面 bind *:2000 #绑定端口1080 maxconn 10 #默认的最大连接数 stats refresh 30s #每30秒更新监控数据 stats uri /stats #访问监控页面的uri #stats realm HAProxy\ Stats #监控页面的认证提示 #stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名 #stats auth Frank:Frank #设置监控页面的用户和密码:Frank #stats hide-version #隐藏统计页面上HAProxy的版本信息 #登錄回調端口監聽 listen port8070_8071_8072_8073 bind *:8070 bind *:8071 bind *:8072 bind *:8073 #條件 acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 #重定向 redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 #listen port8070 # bind *:8070 # #條件 # acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 # #重定向 # redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 # #listen port8071 # bind *:8071 # #條件 # acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 # #重定向 # redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 # #listen port8072 # bind *:8072 # #條件 # acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 # #重定向 # redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 # #listen port8073 # bind *:8073 # #條件 # acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 # #重定向 # redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1
参考:https://blog.csdn.net/king_kgh/article/details/75599083