一、HAProxy简介
HAProxy是免费、高效、可靠的高可用及负载均衡解决方案。该软件非常适合处理高负载站点的七层数据请求。HAProxy工作模式使其可以非常容易且安全地集成到我们现有的站点架构中。使用类似的代理软件还可以对外屏蔽内部真实的web服务器,防止内部服务器遭到外部攻击。

如图:终端用户通过访问HAProxy代理服务器获得站点页面,而代理服务器在收到客户端请求后会根据自身规则将数据请求转发给后端真实服务器。为了让同一客户端访问服务器时可以保持会话(同一客户端第二次访问网站时可以转发至相同的后端真实服务器),HAProxy有三种解决方案:客户单IP、Cookie、以及Session。第一种方式中,HAProxy将客户端IP进行Hash计算并保存,以此确保当相同的IP访问代理服务器时可以转发到固定的真实服务器上。第二种方式中,HAProxy依靠真实服务器发送给客户端的Cookie信息进行会话保持。第三种方式中,HAProxy将保存真实服务器的Session及服务器标识,实现会话保持功能。
二、HAProxy应用案例

系统环境
# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # uname -r 3.10.0-327.el7.x86_64
两台web服务器采用相同的配置,我们将web1、web2设置不同的页面以示区别

web1、web2配置一样
#cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
HAProxy代理服务器设置
①内核调优,在文件中插入以下两行,并重启系统生效
vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535
②安装HAProxy
yum install -y gcc gcc-c++ tar zxf haproxy-1.5.3.tar.gz cd haproxy-1.5.3 make TARGET=linux31 PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy cp examples/haproxy.init /etc/init.d/haproxy
③编辑配置文件
HAProxy安装后没有默认的配置文件,需要手动创建。本例将创建/etc/haproxy.cfg配置文件,当启动HAProxy服务时需要使用-f选项指定配置文件路径。
配置文件主要包含全局段与代理段,global代表全局段,default、 listen、frontend、backend为代理段。
frontend:用来匹配客户端请求的域名或URI等
backend:定义后端服务器集群
listen:是frontend与backend的集合,有时仅使用listen即可替代frontend与backend
vim /usr/local/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 40960 #支持每个进程的最大并发数
chroot /usr/local/haproxy #将目录切换至/usr/local/haproxy并执行chroot,增强安全性
uid 99 #配置进程的账户ID,建议设置为HAProxy专用账户
gid 99 #配置进程的组ID,建议设置为HAProxy专用组
daemon #配置HAProxy以后台进程模式工作
nbproc 1 #指定后台进程的数量
#debug
#quiet
defaults
log global
mode http #HAProxy工作模式,可选项为:tcp、http、health
option httplog #使用http日志
option dontlognull #不记录空日志
option forwardfor #允许插入X-Forwarded-For数据包头给后端真是服务器,可以让后端服务器获取真实客户端的IP
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
retries 3 #重试次数
maxconn 40960
timeout connect 5000 #设置连接最大超时时间,默认单位为毫秒(ms)
timeout client 50000 #设置客户端最大超时时间,默认单位为毫秒(ms)
timeout server 50000 #设置服务器端最大超时时间,默认单位为毫秒(ms)
frontend http-in #定义终端用户访问的前端服务器
bind 0.0.0.0:80 #定义一个或多个监听地址及端口
mode http
log global
acl heboan hdr_beg(host) -i www.heboan.com #定义ACL控制请求包头信息通过正则匹配,-i代表不许分大小写
acl heboan hdr_beg(host) -i heboan.com
use_backend heboan_server if heboan #当用户请求触发名为heboan的ACL规则时,代理会将请求转发为heboan_server后端服务器组
stats enable #开启HAProxy监控页面
stats hide-version #隐藏HAProxy版本信息
stats uri /admin-status #设置监控页面的URI
stats auth admin:heboan123 #设置监控页面的用户名及密码
stats admin if TRUE
backend heboan_server #定义后端服务器组
mode http
balance roundrobin #轮询真实服务器
cookie SESSION_COOKIE insert indirect nocache
option httpchk GET /index.html #检查真实服务器的index.html,以此判断服务器的健康状态
server web1 192.168.88.3:80 minconn 100 maxconn 1000 cookie web1 weight 6 check inter 2000 rise 2 fall 4
server web2 192.168.88.4:80 minconn 100 maxconn 1000 cookie web2 weight 6 check inter 2000 rise 2 fall 4
#健康检查,健康检查的时间间隔为2000ms,连续2次健康检查成功则认为服务器是有效开启的,连续4次检查检查失败后,认为服务器已经宕机,权重为6
④启动并检查端口
# haproxy -f /usr/local/haproxy/haproxy.cfg # lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME haproxy 11958 nobody 3u IPv4 31947 0t0 TCP *:http (LISTEN)
⑤开机启动
echo "haproxy -f /usr/local/haproxy/haproxy.cfg">>/etc/rc.local
三、客户端测试
hosts绑定(192.168.11.139 www.heboan.com heboan.com)
打开两个浏览器访问www.heboan.com,会轮询到后端不同的服务器

查看haproxy状态,访问www.heboan.com/admin-status,账号:admin,密码:heboan123
