参考文档
官方文档:https://cbonte.github.io/haproxy-dconv/1.7/configuration.html
文档:http://www.ttlsa.com/linux/haproxy-study-tutorial/
HAproxy
HAproxy(基于ISO七层)
HAProxy是工作在网络7层之上,性能稳定,
能够补充Nginx的一些缺点,比如Session的保持,Cookie的引导等工作
HAproxy简介
(1)HAProxy 是一款提供高可用性、负载均衡以及基于TCP(三层)和HTTP(七层)应用的代理软件。
(2)HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。
(3)HAProxy 通过ACL实现连接拒绝,从而可以防范小型的DDos***。
负载均衡算法
算法 | 功能 | |
---|---|---|
roundrobin算法 | 基于动态权重的轮询负载均衡 | |
static-rr算法 | 基于静态权重的轮询负载均衡 | |
leastconn算法 | 基于最小连接优先的负载均衡 | |
first算法 | 第一个最小ID的可用服务器优先的负载均衡 | |
source算法 | 基于<源IP地址散列值÷服务器总权重>的负载均衡 | |
uri算法 | 基于<uri地址散列值÷服务器总权重>的负载均衡 | |
url_param算法 | 基于<HTTP GET请求>中的<uri参数值÷服务器总权重>的负载均衡 | |
hdr(<name>)算法 | 基于<HTTP请求>中的<HTTP头部参数值÷服务器总权重>的负载均衡 | |
rdp-cookie/rdp-cookie(<name>)算法 | 基于RDP用户的<RDP_COOKIE>的负载均衡 |
HAproxy的mode工作模式
由于HAproxy可以工作在ISO第七层,因此HAproxy支持三种模式:
TCP三层模式、
HTTP七层模式、
health健康检查模式(只会返回OK)(已弃用)
mode tcp | TCP三层模式,这是默认模式,支持:SSL, SSH, SMTP, ...第三层数据可见的应用环境中 |
---|---|
mode http | HTTP七层模式,支持http(注意:不是https,因为https对第七层数据进行了加密) |
mode health | 通过monitor关键字来实现健康检测 |
HAproxy的配置文件
配置段 | 作用 | 详情 |
---|---|---|
global | 全局配置段 | 全局配置 |
defaults | 默认配置段 | 针对于<frontend配置段>、<backend配置段>、<listen配置段>的公共参数 |
frontend | 前段配置段 | 用于接收客户端请求,然后根据规则,代理转发给backend(后端),从而实现请求分发。 |
backend | 后端配置段 | 指定代理转发的目标服务器(群),一个backend对应着一个或者多个服务器,从而实现负载均衡。 |
listen | 侦听配置段 | 直接将指定的客户端与后端特定服务器绑定到一起 |
安装
yum安装
yum install -y haproxy
主要文件
文件名 | 文件作用 |
---|---|
/etc/haproxy/haproxy.cfg | 主配置文件 |
/etc/rc.d/init.d/haproxy | 管理脚本 |
/etc/logrotate.d/haproxy | 日志管理 |
/usr/sbin/haproxy | 主命令 |
修改主配置文件(普通http)
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
#"日志管理,端口514"
log 127.0.0.1 local2
#"修改haproxy工作目录"
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
option abortonclose
#---------------------------------------------------------------------
#listen
#---------------------------------------------------------------------
listen status
mode http
bind *:1097# 自定义监听端口
stats enable# 启用基于程序编译时默认设置的统计报告
stats hide-version# 隐藏统计页面上HAProxy的版本信息
stats uri /haproxyadmin?stats# 自定义统计页面的URL,默认为/haproxy?stats
stats realm Haproxy\ Statistics
stats auth admin:admin# 统计页面用户名和密码设置
stats refresh 30s # 统计页面自动刷新时间
stats admin if TRUE#如果认证通过就做管理功能,可以管理后端的服务器
stats realm Hapadmin # 统计页面密码框上提示文本,默认为Haproxy\ Statistics
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:1098
option logasap #不等待响应结束就记录日志,表示提前记录日志,一般日志会记录响应时长,此不记录
响应时长
option dontlognull #不记录空信息
capture request header Host len 20 #记录请求首部的前20个字符
capture request header Referer len 60 #referer跳转引用,就是上一级
default_backend servers#默认backend为servers
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend servers#"servers为名称"
balance roundrobin#"使用轮询算法"
server websrv1 192.168.3.58:80 check maxconn 2000
server websrv2 192.168.3.58:8001 check maxconn 2000
更多信息请看官方文档
编译安装haproxy
下载haproxy源码包并上传到服务器
安装编译需要的包
yum install -y make cmake gcc gcc-c++
编译安装
tar axf haproxy-1.6.9.tar.gz
cd haproxy-1.6.9
#查看README文件获取版本对应信息
#查看系统版本
#uname -a
Linux test152 3.10.0-693.11.1.el7.x86_64 #1 SMP Mon Dec 4 23:52:40 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
#3.10.0-693.11.1.el7.x86_64,所以用linux2628
make TARGET=linux2628 PREFIX=/usr/local/haproxy && echo $?
make install PREFIX=/usr/local/haproxy && echo $?
#创建目录/usr/local/sbin
install -d /usr/local/sbin
#生成haproxy命令
install haproxy /usr/local/sbin
#生成文档(不是必须)
install -d /usr/local/share/man/man1
install -m 644 doc/haproxy.1 /usr/local/share/man/man1
install -d /usr/local/doc/haproxy
for x in configuration architecture; \
do \
install -m 644 doc/$x.txt /usr/local/doc/haproxy ; \
done
#添加用户
groupadd -r haproxy
useradd -g haproxy haproxy -s /sbin/nologin
配置主配置文件
mkdir -pv /etc/haproxy
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
#"日志管理,端口514"
log 127.0.0.1 local2
#"修改haproxy工作目录"
chroot /usr/local/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
# stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
option abortonclose#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
#---------------------------------------------------------------------
#listen
#---------------------------------------------------------------------
listen status
mode http
bind *:1097# 自定义监听端口
stats enable# 启用基于程序编译时默认设置的统计报告
stats hide-version# 隐藏统计页面上HAProxy的版本信息
stats uri /haproxyadmin?stats# 自定义统计页面的URL,默认为/haproxy?stats
stats realm Haproxy\ Statistics
stats auth admin:admin# 统计页面用户名和密码设置
stats refresh 30s # 统计页面自动刷新时间
stats admin if TRUE#如果认证通过就做管理功能,可以管理后端的服务器
stats realm Hapadmin # 统计页面密码框上提示文本,默认为Haproxy\ Statistics
listen webserver
#监听端口
bind 0.0.0.0:1098
#负载均衡策略
balance roundrobin
stick-table type ip size 5000k expire 5m
stick store-response cookie(JSESSIONID)
stick match cookie(JSESSIONID)
#cookie设置,使同一连接始终连接到一个后端服务
cookie SERVERID insert indirect
#后端服务,check健康检查,inter检查间隔,rise判断为可用的检查次数,fall判断为不可用的检查次数,weight权重
server web1 10.72.60.151:80 cookie web1 check inter 1s rise 2 fall 3 weight 1
server web2 10.72.60.152:80 cookie web2 check inter 1s rise 2 fall 3 weight 1
#启动服务
haproxy -f /etc/haproxy/haproxy.cfg
启动脚本
vim /etc/init.d/haproxyd
#!/bin/sh
# chkconfig: 2345 99 10
# description: HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments.
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
config="/etc/haproxy/haproxy.cfg"
exec="/usr/local/sbin/haproxy"
PID="/var/run/haproxy.pid"
[ -f $config ] || exit 1
RETVAL=0
start() {
daemon $exec -c -q -f $config
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
echo -n "Starting HAproxy: "
$exec -D -f $config -p $PID
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/haproxy
return $RETVAL
}
stop() {
echo -n "Shutting down HAproxy: "
killproc haproxy -USR1
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/haproxy
[ $RETVAL -eq 0 ] && rm -f $PID
return $RETVAL
}
restart() {
$exec -c -q -f $config
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with 'haproxy check'."
return 1
fi
stop
start
}
rhstatus() {
status haproxy
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
rhstatus
;;
*)
echo $"Usage: haproxy {start|stop|restart|status}"
RETVAL=1
esac
exit $RETVAL
#设置开机启动
systemctl enable haproxyd