Haproxy调度器介绍和配置文件详解
1.haproxy介绍 (四层TCP和七层HTTP都可用)
是一个开源的、高性能的基于TCP(四层)和HTTP(七层)应用代理的高可用的、负载均衡服务软件,它支持双击热备、高可用、负载均衡、虚拟主机、基于TCP和HTTP的应用代理、图形界面查看信息等功能。其配置简单、维护方便,且拥有良好的对服务器节点的健康检查功能,当其代理的后端服务器出现故障时,haproxy会自动的将该故障服务器摘除,当故障服务器恢复后,haproxy还会自动将该服务自动加入进来提供服务。Haproxy是代理客户端访问后端服务器,当服务器返给客户端页面时候也是先经过haproxy,然后才返给客户端,类似lvs的nat模式,但也不是nat模式,所以并发量没有lvs的DR模式大。但也不算小(访问量单台1-3000万pv)也是没问题的。
2.haproxy支持两种主要代理模式
1)基于4层的tcp应用代理(如:可用于邮件服务、内部协议通信服务器、mysql、https服务等)。
2)基于7层的http代理。在4层tcp代理模式下,haproxy仅仅在客户端和服务器之间进行流量转发。但是在7层http代理模式下,haproxy会分析应用层协议,并且通过允许、拒绝、交换、增加或者删除请求或者回应里指定内容来控制协议。
3.关于安装haproxy后配置文件的详细说明
1)基于listen集群的配置文件配置方案:(有listen,但没有frontend和backend)
[root@localhost haproxy]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1:514 local0 warning //记录请求haproxy的信息,local0为接收设备,级别不要用info
log 127.0.0.1 local1 notice
chroot /usr/local/haproxy/var/chroot //安全参数,当软件出现漏洞时候,这里会来保护。
pidfile /usr/local/haproxy/var/run/haproxy.pid //存放进程号pid
maxconn 20480 //定义每个haproxy进程的最大连接数,默认:4096
nbproc 8 //设定启动几个进程,一般跟cpu的核数相当就可,太大易崩溃
daemon //以守护进程方式允许。
group haproxy //设置允许haproxy的用户和组
user haproxy
spread-checks 3
defaults
log global
mode http //模式,或tcp是4层、health是健康检查,listen里优先
option httplog
option dontlognull
retries 3
redispatch
maxconn 2000
contimeout 5000 //成功连接到一台服务器的最长等待时间,默认毫秒,默认:5000
clitimeout 50000 //连接客户端发送数据时的成功连接最长等待时间,默认毫秒,默认:50000
srvtimeout 50000 //服务器回应客户端数据发送最长等待时间,默认毫秒,默认:50000
listen test 172.10.10.5:80 //listen 监听的名字(随意) 监听的vip:端口 下面的前两行可以用这一行代替。
listen test //每个listen就是一个集群,test为名字
bind 172.10.10.5:80 //绑定的集群的vip:端口
mode http //模式,里面优先
stats enable //激活web界面的状态信息
stats uri /admin?Stats //web界面的uri,访问时格式:http://调度IP或域名/admin?stats
stats hide-version //隐藏haproxy的版本号
stats auth admin:123456 //访问web页面状态信息时的用户名和密码:admin,123456
balance roundrobin //负载均衡的策略:轮询,也可根据需要上帮助文档里用其它算法
option forwardfor //把用户请求的ip转给后面的server,让server能记录用户真实IP
option httpchk HEAD /check.html HTTP/1.0 //http基于网页健康检查,检查网页是否正常,若无check.html,即使服务开启也认为不正常。
option httpchk GET /check.html HTTP/1.0 //http基于网页健康检查,检查网页是否正常,和上面一样,可以选择一种用即可。
option httpchk GET /check.html HTTP/1.1\r\nHOST:www.etiantian.org //对后面服务器网站的域名健康检查,不太理解
timeout server 15s
timeout connect 15s
option httpclose
cookie SERVERID rewrite
option allbackups
server web1 192.168.4.100:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
server web2 192.168.4.200:80 cookie B maxconn 4096 weight 10 check port 80 inter 2000 rise 2 fall 5
server web3 192.168.4.201:80 cookie C maxconn 4096 weight 10 check port 80 inter 2000 rise 2 fall 5 backup
server web4 192.168.4.202:80 cookie D maxconn 4096 weight 10 check port 80 inter 2000 rise 2 fall 5 backup
详解:
格式:server 服务器名字(随便) 服务器IP/域名:端口,cookie A/B/C/D,往服务器的客户端写cookie,也可去掉。
maxconn 2048/4096 控制节点并发量,weight 8/10 控制节点权重,check port 80检查端口,如果只写check默认就是检查冒号后面端口,inter 2000检查间隔2s(2000是毫秒),fall 5如果5次失败就剔除,rise 2,若2次恢复好了就加入,check.html的健康检查优先级大于端口健康检查,如果网页正常,则认为服务器正常,如果网页不正常,则即使服务正常,也认为不正常。
backup参数:
1)如果不加上面的“option allbackups ”,只有一个backup的服务器时(这是其中一种情况而已,不绝对),在最后那个服务器最后面加个backup表示当前面所有节点全部都挂了,最后那个机器才接管。
2)如果加上上面的“option allbackups”,后面有多个backup的服务器时(这是其中一种情况而已,不绝对),在服务器最后面加上backup表示当前面所有节点全部都挂了,后面所有的有backup的服务器同时启动来接管服务。
option forwardfor参数: 表示haproxy支持后端服务器记录真实IP,但后端web服务器也要在配置文件中修改才行,
如下:vim /etc/httpd/conf/httpd.conf
#LogFormat "%h %l %u %t \"%r\" %>s %b" common //默认是这个,把%h修改为:\"%{X-Forwarded-For}i\"
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b" common //修改为这个,下面日志也要common
如果listen中bind绑定的IP在本机不存在,则无法启动haproxy,解决方法如下:
解决不用bind绑定IP也能启动haproxy服务:echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
多业务需要绑定多个VIP做调度器时情况:把多做几个listen,多绑定几个VIP即可,listen里面名字不要重复。
2)基于acl域名规则控制的集群的配置文件配置方案:(没有listen,但有frontend和backend)
[root@localhost haproxy]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1:514 local0 warning
log 127.0.0.1 local1 notice
chroot /usr/local/haproxy/var/chroot
pidfile /usr/local/haproxy/var/run/haproxy.pid
maxconn 20480
nbproc 8
daemon
group haproxy
user haproxy
spread-checks 3
defaults
log global
option httplog
option dontlognull
retries 3
redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
mode http
stats enable
stats uri /admin?stats
stats hide-version
stats auth admin:123456
balance roundrobin
frontend zdyname1 #名字随便(可多个) // 1)基于定义域名规则,然后根据不同域名抛给后面对应服务器池中或跳转。
stats enable
stats hide-version
stats auth admin:123456
bind 172.10.10.5:80 //绑定VIP,客户端访问IP
acl bd_zdyname hdr(host) -i www.etiantian.org //hdr(host):从主机名里取,-i:不分大小写,用后面域名访问时…
acl bbs_zdyname hdr(host) -i bbs.etiantian.org //hdr(host):从主机名里取,-i:不分大小写,用后面域名访问时…
redirect prefix http://www.baidu.com code 301 if bd_zdyname //符合bd_zdyname中(www.etiantian.org)时跳到百度
use_backend bbs if bbs_zdyname //符合bbs_zdyname中(bbs.etiantian.org)访问时抛给后端的bbs池
default_backend www //默认情况下,无论用域名还是IP访问都抛给后面的的www池
backend www #名字随便,但要和上面对应。
balance leastconn
option httpclose
option forwardfor
server web1 192.168.4.101:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
server web2 192.168.4.201:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
backend bbs #名字随便,但要和上面对应。
balance leastconn
option httpclose
option forwardfor
server web3 192.168.4.102:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
server web4 192.168.4.202:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
frontend zdyname2 #名字随便(可多个) // 2)基于访问站点下的不同目录时,到后面对应池中找服务器的对应站点目录
stats enable
stats hide-version
stats auth admin:123456
bind 172.10.10.55:80 //绑定的另一个VIP,客户端访问IP
acl zdy_php path_beg /php/ //path_beg固定,匹配访问站点目录下的php目录时……
acl zdy_java path_beg /java/ //path_beg固定,匹配访问站点目录下的java目录时……
use_backend php if zdy_php //访问站点目录下的php目录时到后面的php池找服务器站点目录中的php目录
use_backend java if zdy_java //访问站点目录下的java目录时到后面的java池找服务器站点目录中的java目录
backend php #名字随便,但要和上面对应。
balance leastconn
option httpclose
option forwardfor
server web3 192.168.4.103:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
server web4 192.168.4.203:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
backend java #名字随便,但要和上面对应。
balance leastconn
option httpclose
option forwardfor
server web3 192.168.4.104:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
server web4 192.168.4.204:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
frontend zdyname3 #名字随便(可多个) // 3)基于访问站点目录下的扩展名访问资源时,抛给对应后端池服务器访问
stats enable
stats hide-version
stats auth admin:123456
bind 172.10.10.55:80 //绑定的另一个VIP,客户端访问IP
acl zdy_pic path_end .gif .png .jpg .css .js //path_end固定,访问站点目录下的扩展名如下资源时……
acl zdy_static path_end .gif .png .jpg .css //path_end固定,访问站点目录下的扩展名如下资源时……
use_backend suibian_static if zdy_pic or zdy_static //访问站点目录下的扩展名如下资源时,抛给后端池服务器访问
backend suibian_static #名字随便,但要和上面对应。
balance leastconn
option httpclose
option forwardfor
server web3 192.168.4.105:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
server web4 192.168.4.205:80 cookie A maxconn 2048 weight 8 check port 80 inter 2000 rise 2 fall 5
frontend zdyname4 #名字随便(可多个) // 4)基于不同手机访问类似或相同网站时,解析到相对应的服务器 //无环境
stats enable
stats hide-version
stats auth admin:123456
bind 172.10.10.55:80 //绑定的另一个VIP,客户端访问IP
acl iphone_users hdr_sub(user-agent) -i iphone //-i前面固定,后面的不好判断,需访问看看是啥或看日志
redirect prefix http://blog.51cto.com if iphone_users //如果是苹果手机访问就转到后面苹果手机服务器上
acl android_users hdr_sub(user-agent) -i android //-i前面固定,后面的不好判断,需访问看看是啥或看日志
redirect prefix http://www.51cto.com if android_users //如果是安卓手机访问就转到后面安卓手机服务器上
frontend zdyname5 #名字随便(可多个), // 5)基于端口和IP访问限制做控制
stats enable
stats hide-version
stats auth admin:123456
bind 172.10.10.55:80 //绑定的另一个VIP,客户端访问IP
acl zdy_valid_ip src 192.168.4.0/24 //仅仅帮助192.168.4.0网段的IP实现haproxy代理
block if !zdy_valid_ip //不是上面网段的规定的IP不给代理,block等于drop
解释:frontend设置匹配规则,backend是后端地址池,前面规则匹配好后,到后面相应的池里找去。
3)基于haproxy错误页面跳转优雅显示的配置案例(可放到:defaults/listen/fronend/backend里)
不支持404,支持:503、502、504 //没有试验成功
[root@localhost haproxy]# vim /etc/haproxy/haproxy.cfg
errorfile 400 /etc/haproxy/errorfiles/400badreq.http //上面根据需要添加,errorfile也可换为:errorloc
errorfile 403 /etc/haproxy/errorfiles/403forbid.http //上面根据需要添加,errorfile也可换为:errorloc
errorfile 503 /etc/haproxy/errorfiles/503sorry.http //上面根据需要添加,errorfile也可换为:errorloc
errorfile 504 http://www.360buy.com/ //京东做法,错误页面时候返回到首页。
…………
[root@localhost haproxy]# mkdir -p /etc/haproxy/errorfiles
[root@localhost haproxy]# echo 400 > /etc/haproxy/errorfiles/400badreq.http
[root@localhost haproxy]# echo 403 > /etc/haproxy/errorfiles/403forbid.http
[root@localhost haproxy]# echo 503 > /etc/haproxy/errorfiles/503sorry.http
经过上述配置后,当后台服务器页面找不到时候,就会返回相应的400,403,503等,通过浏览器测试,curl不行。
4)haproxy配置文件补充说明:
注意:
global:全局配置参数段,主要控制haproxy启动前的进程及系统相关设置。
defaults:配置一些默认参数。如果frontend、backend、listen等段未设置则使用defaults段配置。
listen:每个listen就是一个集群。
frontend:用来匹配接收客户端所请求的域名,uri等,并针对不同的匹配,做不同的请求处理。(服务员)
backend:定义后端服务器集群,以及对后端服务器的一些权重,队列,连接数等选项的设置。(厨师)
日志级别不要用info,用info会打访问日志,特别大,影响磁盘IO读写能力。默认是info,应改为:warning或err