HAProxy简介

HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。HAProxy还可以将后端的服务器与网络隔离,起到保护后端服务器的作用。HAProxy的负载均衡能力虽不如LVS,但也是相当不错,而且由于其工作在7层,可以对http请求报文做深入分析,按照自己的需要将报文转发至后端不同的服务器(例如动静分离),这一点工作在4层的LVS无法完成。

1、安装

# Haproxy版本为1.7.5
wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gz 
tar -zxvf haproxy-1.7.5.tar.gz 
mv haproxy-1.7.5 haproxy

# 编译安装

# ”TARGET”指定编译对应的os对应的内核版本,通过”uname -r”查询内核版本呢,README文件可查询对应关系

uname -r
2.6.32-504.el6.x86_64

cd haproxy
make TARGET=linux2632 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy

ls /usr/local/haproxy/
doc  sbin  share

2、编辑配置文件haproxy.cfg

# 存放haproxy配置文件
mkdir -p /usr/local/haproxy/conf

cat >> /usr/local/haproxy/conf/haproxy.cfg <<EOF
#---------------------------------------------------------------------
# Global settings 全局设置
#---------------------------------------------------------------------
global
        # 定义全局日志,配置在本地,通过local0输出,默认是info级别,可配置两条
	log         127.0.0.1 local0 info
	# 运行路径 
	chroot      /usr/local/haproxy
	# PID文件存放路径
	pidfile /usr/local/haproxy/log/haproxy.pid
	# 设置每haproxy进程的最大并发连接数,其等同于命令行选项“-n”
        # “ulimit -n”自动计算的结果参照此参数设定.	
	maxconn 51200
	# 后台运行haproxy
	daemon
	# 定义统计信息保存位置
	stats socket /usr/local/haproxy/stats
#---------------------------------------------------------------------
# Defaults settings 默认设置
#---------------------------------------------------------------------    
defaults
# 默认的模式【tcp:4层;http:7层;health:只返回OK】
	mode http
	# 继承全局的日志定义输出
	log  global
        # 日志类别
	option httplog
      # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
	option forwardfor
        # 开启http协议中服务器端关闭功能,每个请求完毕后主动关闭http通道,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录.
   	option httpclose
   	# 如果产生了一个空连接,那这个空连接的日志将不会记录.
	option dontlognull
	# 当与后端服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上;当故障服务器恢复时,会话又被定向到已恢复的服务器上;
	option redispatch
	# 还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数
	retries 3
	# 当haproxy负载很高时,自动结束掉当前队列处理比较久的链接.
	option abortonclose
	# 默认http请求超时时间
	timeout http-request    10s
# 默认队列超时时间,后端服务器在高负载时,会将haproxy发来的请求放进一个队列中.
	timeout queue           1m
	# haproxy与后端服务器连接超时时间.
	timeout connect         10s
	# 客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间.
	timeout client          10m
	# haproxy与后端服务器非活动连接的超时时间.
	timeout server          10m
	# 默认新的http请求连接建立的超时时间,时间较短时可以尽快释放出资源,节约资源.
	timeout http-keep-alive 10s
	# 心跳检测超时时间
	timeout check           10s
	#最大并发连接数
	maxconn                 3000

#---------------------------------------------------------------------
# listen haproxy UI 监控页面配置
#---------------------------------------------------------------------
listen admin_status
# 配置监控运行模式
	mode http 
	# 配置统计页面访问端口
	bind 0.0.0.0:1080
	# 统计页面默认最大连接数
	maxconn 10
	# http日志格式
	option httplog
	# 开启统计
	stats enable
	# 监控页面自动刷新时间
	stats refresh 30s
	# 统计页面访问url,即访问http://ip:1080/stats
	stats uri /stats
	#监控页面的用户和密码:admin,可设置多个用户名
	stats auth admin:admin
	# 手工启动/禁用后端服务器,可通过web管理节点
	stats admin if TRUE
	
	# 设置haproxy错误页面
	errorfile 400 /usr/local/haproxy/errorfiles/400.http
	errorfile 403 /usr/local/haproxy/errorfiles/403.http
	errorfile 408 /usr/local/haproxy/errorfiles/408.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

#---------------------------------------------------------------------
# main frontend which proxys to the backends frontend配置
#---------------------------------------------------------------------	
frontend kube-apiserver
# 定义前端监听端口,建议采用bind *:80的形式,否则做集群高可用的时候有问题,vip切换到其余机器就不能访问.
	bind *:80
        mode http
        #如果以上规则都不匹配时,将请求转交到app组处理.
	default_backend app

#---------------------------------------------------------------------
# round robin balancing between the various backends backend配置
#---------------------------------------------------------------------
backend app
# 根据http头进行转发,无该头部则转为使用roundrobin.
	balance roundrobin
	option forwardfor except 127.0.0.0/8
	
	# 后端服务器定义, maxconn 1024表示该服务器的最大连接数, cookie 1表示serverid为1,weight代表权重(默认1,最大为265,0则表示不参与负载均衡),
	#check inter 1500是检测心跳频率, rise 2是2次正确认为服务器可用, fall 3是3次失败认为服务器不可用.
        server app1 192.168.15.160:8080 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 5 
        server app2 192.168.14.107:8080 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 5
        server app3 192.168.15.170:8080 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 5


3、拷贝所需文件

# errorfile错误文件
cp -R haproxy/examples/errorfiles/ /usr/local/haproxy/
# haproxy日志文件
mkdir -p /usr/local/haproxy/log
touch /usr/local/haproxy/log/haproxy.log
ln -s /usr/local/haproxy/log/haproxy.log /var/log/
# etc中的haproxy文件
mkdir -p /etc/haproxy
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/
# 配置开机自动启动
cp haproxy/examples/haproxy.init /etc/rc.d/init.d/haproxy
chmod +x /etc/rc.d/init.d/haproxy
chkconfig --add haproxy
chkconfig haproxy on
# 设置全局启动文件
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/

4、配置rsyslog

haproxy默认没有日志,依靠rsyslog收集日志

# 注意loacl0需要与haproxy.cfg文件中对应
echo -e '$ModLoad imudp \n $UDPServerRun 514 \n local0.* /var/log/haproxy.log' >> /etc/rsyslog.conf
# 重启rsyslog服务
service rsyslog restart