HAproxy

2021/01/01 03:56
阅读数 79

参考文档

官方文档: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文件获取版本对应信息
HAproxy
#查看系统版本
#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

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部
返回顶部
顶部