原文地址:入坑系列之HAProxy负载均衡
在大型系统设计中用代理在负载均衡是最常见的一种方式,而相对靠谱的解决方案中Nginx、HAProxy、LVS、F5在各大场中用得比较普遍,各有各的优势和使用场景,由于本次要使用到TCP,因此Nginx只能在HTTP层负载,因此用HAProxy来负载,为什么不用LVS?因为配置太麻烦。
HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。HAProxy还可以将后端的服务器与网络隔离,起到保护后端服务器的作用。HAProxy的负载均衡能力虽不如LVS,但也是相当不错,而且由于其工作在7层,可以对http请求报文做深入分析,按照自己的需要将报文转发至后端不同的服务器(例如动静分离),这一点工作在4层的LVS无法完成。
环境
CentOS6.X
HAProxy 1.7.3
用root用户安装
下载
若在线安装不用下载,可直接通过yum命令安装(建议),不过需要联网。
去官网下载 :http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz
下载后放进CentOS中的/usr/local/ 文件夹中(至于怎么放,你不会 这个锅我不背,去学学Linux 操作基础)
关闭SElinux、配置防火墙
vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled #增加 :wq! #保存退出 setenforce 0 #使配置立即生效
vi /etc/sysconfig/iptables #编辑 -A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址通信(在做keepalived时用得到) -A RH-Firewall-1-INPUT -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允许80端口通过防火墙 :wq! #保存退出 service iptables restart #重启防火墙使配置生效
创建HAProxy运行账户和组
[root@H32 local]# groupadd haproxy #添加haproxy组 [root@H32 local]# useradd -g haproxy haproxy -s /bin/false #创建nginx运行账户haproxy并加入到haproxy组,不允许haproxy
安装
分两种:
1、在线装:yum install haproxy (建议)
2、安装包:
环境中要有gcc,用于编译,一般安装环境时都会有,若没有 运行 :
yum install -y gcc
进入local文件夹中
[root@H32 ~]#cd /usr/local
然后解压下载好haproxy包到当前文件夹
[root@H32 local]# tar -zxvf haproxy-1.7.3.tar.gz [root@H32 local]# cd haproxy-1.7.3
安装
[root@H32 haproxy-1.7.3]# make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haproxy-1.7.3 #编译(源码才需要) uname -r #查看系统内核版本号 [root@H32 haproxy-1.7.3]# make install PREFIX=/usr/local/haproxy-1.7.3 #安装 haproxy-1.7.3为解压后的文件路径(很重要)
设置HAProxy
mkdir -p /usr/local/haproxy-1.7.3/conf #创建配置文件目录 mkdir -p /etc/haproxy #创建配置文件目录 touch /usr/local/haproxy-1.7.3/conf/haproxy.cfg #创建配置文件 ln -s /usr/local/haproxy-1.7.3/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件软连接 cp -r /usr/local/haproxy-1.7.3/examples/errorfiles /usr/local/haproxy-1.7.3/errorfiles #拷贝错误页面 ln -s /usr/local/haproxy-1.7.3/errorfiles /etc/haproxy/errorfiles #添加软连接 mkdir -p /usr/local/haproxy-1.7.3/log #创建日志文件目录 touch /usr/local/haproxy-1.7.3/log/haproxy.log #创建日志文件 ln -s /usr/local/haproxy-1.7.3/log/haproxy.log /var/log/haproxy.log #添加软连接 cp /usr/local/haproxy-1.7.3/examples/haproxy.init /etc/rc.d/init.d/haproxy #拷贝开机启动文件 chmod +x /etc/rc.d/init.d/haproxy #添加脚本执行权限 chkconfig haproxy on #设置开机启动 ln -s /usr/local/haproxy-1.7.3/sbin/haproxy /usr/sbin #添加软连接
注意上面的文件夹,若与上面的文件夹路径一致,可以直接复制运行。
配置haproxy.cfg参数
vi /usr/local/haproxy-1.7.3/conf/haproxy.cfg #编辑
这里是最关键的设置,在此有两个相同的服务由两台服务器提供:192.168.30.33,192.168.30.34
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global log 127.0.0.1 local2 ###[err warning info debug] chroot /usr/local/haproxy-1.7.3 pidfile /var/run/haproxy.pid ###haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 maxconn 4000 ###最大连接数,默认4000 user haproxy group haproxy daemon ###创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon" #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http ###默认的模式,tcp是4层,http是7层,health只会返回OK 若是混合模式则 mode 不需要设置 log global ###采用全局定义的日志 option dontlognull ###不记录健康检查的日志信息 option httpclose ###每次请求完毕后主动关闭http通道 option httplog ###日志类别http日志格式 混合模式 此处还需要加上 tcplog #option forwardfor ###如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip option redispatch ###serverId对应的服务器挂掉后,强制定向到其他健康的服务器 timeout connect 10s #default 10 second timeout if a backend is not found timeout client 10s ###客户端连接超时 timeout server 10s ###服务器连接超时 maxconn 60000 ###最大连接数 retries 3 ###3次连接失败就认为服务不可用,也可以通过后面设置 ########统计页面配置######## listen admin_stats # 监听端口 bind 0.0.0.0:8089 # 启用状态监控 stats enable mode http log global # 统计页面URL stats uri /stats # 统计页面密码框上提示文本 stats realm Haproxy\ Statistics # 统计页面用户名和密码设置 stats auth admin:admin # 隐藏统计页面上HAProxy的版本信息 #stats hide-version #当通过认证才可管理 stats admin if TRUE #统计页面自动刷新时间 stats refresh 30s ########WEB配置################# listen web1080 bind 0.0.0.0:1080 mode http option httplog log global maxconn 3000 balance leastconn server web33 192.168.80.33:8007 weight 1 rise 2 fall 3 server web34 192.168.80.34:8007 weight 1 rise 2 fall 3 #--------------------------------------------------------------------- # main frontend which proxys to the backends 这里不需要动静分离,所以全部注释掉 #--------------------------------------------------------------------- #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 #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- #backend static # balance roundrobin # server static 127.0.0.1:4331 check #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- #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 #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- #errorloc 503 http://www.osyunwei.com/404.html 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
统一绑定的对外接口为1080, 监控页面端口为8089。
启动
:wq! #保存退出 service haproxy start #启动
#设置开机启动 chkconfig haproxy on
设置HAProxy日志
vi /etc/syslog.conf #编辑,在最下边增加 # haproxy.log local0.* /var/log/haproxy.log local1.* /var/log/haproxy.log local2.* /var/log/haproxy.log local3.* /var/log/haproxy.log :wq! #保存退出
vi /etc/sysconfig/rsyslog #编辑修改 SYSLOGD_OPTIONS="-r -m 0" #接收远程服务器日志 :wq! #保存退出 service rsyslog restart #重启syslog
监控页面
打开监控页面,用户名密码为admin,出现下面的页面就说明配置成功:
http://192.168.30.32:8089/stats
service haproxy stop #关闭 service haproxy restart #重启
扩展问题:
此处只做了简单的IP请求负载,还可以做TCP层的负载,但里面的设置需要根据自己的实际情况不停的压力测试进行调置。
此后还要做Keepalived + HAProxy 多机热备的负载实用方案。
还可做mysql的读写负载、动静态资源分离等等
ACL规则介绍
ACL控制哪些开放,往哪里转,哪些屏蔽 ,具体的内容网上也有介绍,此处只做抛砖引玉。
实例:实现动静分离功能
首先定义两个backend,分别以动态和静态进行分组
backend jingtai
balance roundrobin
server web1 10.0.10.82:80 check weight 1maxconn 2000
backend dongtai
balance roundrobin
server web2 10.0.10.83:80 check weight 1maxconn 3000
配置frontend
frontend web_server
bind *:80
default_backend webservers
acl badguy src 10.0.10.1
acl denyfile path /1.html
#http-request deny if badguy denyfile
acl static path_end .html
use_backend jingtai if static
default_backend dongtai
定义acl名称为static ,如果访问匹配是.html的文件,那么直接跳转至jingtai 这个backend
如果访问的不匹配.html 那么直接跳转至默认backend dongtai组