HAProxy安装
Ubuntu包安装
打开链接: https://haproxy.debian.net/ ,选择合适的版本,会自动出现下面安装提示
apt-get install --no-install-recommends software-properties-common
add-apt-repository ppa:vbernat/haproxy-2.6
apt-get install haproxy
RHEL系统安装
官方没有提供rpm相关的包,可以通过第三方仓库的rpm包
从第三方网站下载rpm包:https://pkgs.org/download/haproxy
编译安装HAProxy
编译安装HAProxy 2.0 LTS版本,更多源码包下载地址:http://www.haproxy.org/download/
解决 lua 环境
Lua 官网:www.lua.org
第一步下载所需的安装包
HAProxy的安装包下载 http://www.haproxy.org/
[root@ubuntu2004 ~]#wget http://www.haproxy.org/download/2.6/src/haproxy-2.6.6.tar.gz
Lua的安装包下载
[root@ubuntu2004 ~]#curl -R -O http://www.lua.org/ftp/lua-5.4.4.tar.gz
[root@ubuntu2004 ~]#ls
haproxy-2.6.6.tar.gz lua-5.4.4.tar.gz
脚本安装
[root@ubuntu2004 ~]#cat install_haproxy.sh
#!/bin/bash
HAPROXY_VERSION=2.6.6
HAPROXY_FILE=haproxy-${HAPROXY_VERSION}.tar.gz
#HAPROXY_FILE=haproxy-2.2.12.tar.gz
LUA_VERSION=5.4.4
LUA_FILE=lua-${LUA_VERSION}.tar.gz
#LUA_FILE=lua-5.4.3.tar.gz
HAPROXY_INSTALL_DIR=/apps/haproxy
SRC_DIR=/usr/local/src
CWD=`pwd`
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`
LOCAL_IP=$(hostname -I|awk '{print $1}')
STATS_AUTH_USER=admin
STATS_AUTH_PASSWORD=123456
VIP=192.168.10.100
MASTER1=192.168.10.101
MASTER2=192.168.10.102
MASTER3=192.168.10.103
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
check_file (){
if [ ! -e ${LUA_FILE} ];then
color "缺少${LUA_FILE}文件!" 1
exit
elif [ ! -e ${HAPROXY_FILE} ];then
color "缺少${HAPROXY_FILE}文件!" 1
exit
else
color "相关文件已准备!" 0
fi
}
install_packs () {
if [ $ID = "centos" -o $ID = "rocky" ];then
yum -y install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel libtermcap-devel ncurses-devel libevent-devel readline-devel
elif [ $ID = "ubuntu" ];then
apt update
apt -y install gcc make openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev libreadline-dev libsystemd-dev
else
color "不支持此操作系统!" 1
fi
[ $? -eq 0 ] || { color '安装软件包失败,退出!' 1; exit; }
}
install_lua () {
tar xf ${LUA_FILE} -C ${SRC_DIR}
LUA_DIR=${LUA_FILE%.tar*}
cd ${SRC_DIR}/${LUA_DIR}
make all test
}
install_haproxy(){
cd ${CWD}
tar xf ${HAPROXY_FILE} -C ${SRC_DIR}
HAPROXY_DIR=${HAPROXY_FILE%.tar*}
cd ${SRC_DIR}/${HAPROXY_DIR}
make -j ${CPUS} ARCH=x86_64 TARGET=linux-glibc USE_PROMEX=1 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=${SRC_DIR}/${LUA_DIR}/src/ LUA_LIB=${SRC_DIR}/${LUA_DIR}/src/ PREFIX=${HAPROXY_INSTALL_DIR}
make install PREFIX=${HAPROXY_INSTALL_DIR}
[ $? -eq 0 ] && color "HAPROXY编译安装成功" 0 || { color "HAPROXY编译安装失败,退出!" 1;exit; }
[ -L /usr/sbin/haproxy ] || ln -s ${HAPROXY_INSTALL_DIR}/sbin/haproxy /usr/sbin/
[ -d /etc/haproxy ] || mkdir /etc/haproxy
[ -d /var/lib/haproxy/ ] || mkdir -p /var/lib/haproxy/
cat > /etc/haproxy/haproxy.cfg <<-EOF
global
maxconn 100000
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth ${STATS_AUTH_USER}:${STATS_AUTH_PASSWORD}
#listen kubernetes-6443
# bind ${VIP}:6443
# mode tcp
# log global
# server ${MASTER1} ${MASTER1}:6443 check inter 3000 fall 2 rise 5
# server ${MASTER2} ${MASTER2}:6443 check inter 3000 fall 2 rise 5
# server ${MASTER3} ${MASTER2}:6443 check inter 3000 fall 2 rise 5
EOF
groupadd -g 99 haproxy
useradd -u 99 -g haproxy -d /var/lib/haproxy -M -r -s /sbin/nologin haproxy
}
start_haproxy () {
cat > /lib/systemd/system/haproxy.service <<-EOF
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now haproxy
systemctl is-active haproxy &> /dev/null && color 'HAPROXY安装完成!' 0 || { color 'HAPROXY 启动失败,退出!' 1; exit; }
echo "-------------------------------------------------------------------"
echo -e "请访问链接: \E[32;1mhttp://${LOCAL_IP}:9999/haproxy-status\E[0m"
echo -e "用户和密码: \E[32;1m${STATS_AUTH_USER}/${STATS_AUTH_PASSWORD}\E[0m"
}
check_file
install_packs
install_lua
install_haproxy
start_haproxy
HAPROXY安装完成! [ OK ]
-------------------------------------------------------------------
请访问链接: http://10.0.0.105:9999/haproxy-status
用户和密码: admin/123456
基于Docker部署HAProxy(生产中可以不用容器方式)
第一步:
安装docker
apt install docker.io
第二步:准备配置文件
mkdir /data/haproxy/ -p
cat > /data/haproxy/haproxy.cfg
global
maxconn 100000
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth admin:123456
跑容器
docker run -d --name myhaproxy -v /data/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro -p 9999:9999 --sysctl net.ipv4.ip_unprivileged_port_start=0 haproxy:2.6.6-alpine3.16
HAProxy基础配置(做此次实验需先准备实验环境,实验环境在本文最下面)
包安装基础配置只有两部分global defaults
vim /etc/haoroxy/haproxy.cfg
global
defaults
HAProxy日志配置(本地存放和远程存放)
HAproxy本身不记录客户端的访问日志.此外为减少服务器负载,一般生产中HAProxy不记录日志. 也可以配置HAProxy利用rsyslog服务记录日志到指定日志文件中
在global配置项定义:
[root@ubuntu2004 ~]#vim /etc/haproxy/haproxy.cfg
log 127.0.0.1 local{1-7} info #基于syslog记录日志到指定设备,级别有(err,warning, info,debug)
listen web_port
bind 127.0.0.1:80
mode http
log global #开启当前web_port的日志功能,默认不记录日志,需要在Rsyslog开启
server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
Rsyslog配置:
[root@ubuntu2004 ~]#vim /etc/rsyslog.conf
module(load="imtcp")
input(type="imtcp" port="514")
$IncludeConfig /etc/rsyslog.d/*.conf #数据可以放在这个目录下面,要求conf结尾
[root@ubuntu2004 ~]#vim /etc/rsyslog.d/haproxy.conf
local3.info /var/log/haproxy.log #此文件不存在,会自动生成
[root@ubuntu2004 ~]#systemctl restart rsyslog
日志文件在有访问的情况下自动生成
[root@ubuntu2004 ~]#ll /var/log/haproxy.log
ls: 无法访问 '/var/log/haproxy.log': 没有那个文件或目录
在网页访问 http://10.0.0.105:9999/haproxy-status
[root@ubuntu2004 ~]#ll /var/log/haproxy.log
-rw-r----- 1 syslog adm 101 10月 24 22:37 /var/log/haproxy.log
[root@ubuntu2004 ~]#tail -f /var/log/haproxy.log
Oct 24 22:37:38 localhost haproxy[9271]: Connect from 10.0.0.1:54937 to 10.0.0.100:9999 (stats/HTTP)
想把日志记录到远程主机上
在本机修改配置文件
[root@ubuntu2004 ~]#vim /etc/haproxy/haproxy.cfg
log 10.0.0.8 local3 info
[root@ubuntu2004 ~]#systemctl restart haproxy.service
在远程主机修改Rsyslog配置:
[root@ubuntu2004 ~]#vim /etc/rsyslog.conf
module(load="imtcp")
input(type="imtcp" port="514")
$IncludeConfig /etc/rsyslog.d/*.conf #数据可以放在这个目录下面,要求conf结尾
[root@ubuntu2004 ~]#vim /etc/rsyslog.d/haproxy.conf
local3.info /var/log/haproxy.log #此文件不存在,会自动生成
[root@ubuntu2004 ~]#systemctl restart rsyslog
访问触发生成日志,本机就生成日志了。
Proxies配置
官方文档:http://cbonte.github.io/haproxy-dconv/2.6/configuration.html#4
defaults[<name>]#默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontend<name> #前端servername,类似于Nginx的一个虚拟主机,server和LVS服务集群。
backend<name> #后端服务器组,等于nginx的upstream和LVS中的RS服务器
listen<name> #将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用
defaults配置
option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose #当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务情 况选择开启 option http-keep-alive #开启与客户端的会话保持
option forwardfor #透传客户端真实IP至后端web服务器
mode http|tcp #设置默认工作类型,使用TCP服务器性能更好,减少压力
timeout http-keep-alive 120s #session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout connect 120s #客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前), 默认单位ms timeout server 600s #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后), 默认单位ms,如果超时,会出现502错误,此值建议设置较大些,防止出现502错误
timeout client 600s #设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同 timeout check 5s #对后端服务器的默认检测超时时间 default-server inter 1000 weight 3 #指定后端服务器的默认设置
Listen配置(主用)
使用listen替换 frontend和backend的配置方式,可以简化设置,常用于TCP协议的应用
#官网业务访问入口
listen WEB_PORT_80 #WEB_PORT_80名称可自己定义
bind 192.168.10.100:80 #对外发布的访问接口。
mode http #defaults默认有,可以不写
option forwardfor #defaults默认有,可以不写
server web1 10.0.0.101:80 check inter 3000 fall rise5
server web2 10.0.0.102:80 check inter 3000 fall rise5
检查语法
[root@ubuntu2004 ~]#haproxy -c -f /etc/haproxy/haproxy.cfg
Configuration file is valid
例如:
修改haproxy配置,设置对外发布访问的接口
[root@ubuntu2004 ~]#vim /etc/haproxy/haproxy.cfg
listen WEB_PORT_80
bind 192.168.10.100:80
server web1 10.0.0.101:80
server web2 10.0.0.102:80
windows客户端访问 192.168.10.100
显示结果:web1.meng.org 10.0.0.101 web2.meng.org 10.0.0.102
Frontend配置和bachend配置使用(相比listen更灵活,但代码量需要的更多,后端服务器多了不合适)
bind: #指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
#格式: bind [<address>]:<port_range> [, ...] [param*]
#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
backlog <backlog> #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意不支持backend
例如:把listen注释掉,填写以下内容
[root@ubuntu2004 ~]#vim /etc/haproxy/haproxy.cfg
frontend WEB_PORT_80
bind 192.168.10.100:80
use_backend WEB_PORT_80_servers
backend WEB_PORT_80_servers
server web01 10.0.0.101:80
server web02 10.0.0.102:80
重启服务
[root@ubuntu2004 ~]#systemctl restart haproxy.service
测试访问受不受影响
[root@ubuntu2004 ~]#curl www.meng.org
web1.meng.org 10.0.0.101
[root@ubuntu2004 ~]#curl www.meng.org
web2.meng.org 10.0.0.102
但是状态页不一样了
http://10.0.0.100:9999/haproxy-status
也可以多个frontend对一个backend,例如:
[root@ubuntu2004 ~]#vim /etc/haproxy/haproxy.cfg
frontend WEB_PORT_80
bind 192.168.10.100:80
use_backend WEB_PORT_80_servers
frontend WEB_PORT_81
bind 192.168.10.100:81
use_backend WEB_PORT_80_servers
backend WEB_PORT_80_servers
server web01 10.0.0.101:80
server web02 10.0.0.102:80
重启服务
[root@ubuntu2004 ~]#curl www.meng.org:81
web1.meng.org 10.0.0.101
[root@ubuntu2004 ~]#curl www.meng.org:81
web2.meng.org 10.0.0.102
多个backend对应一个frontend 例如:
[root@ubuntu2004 ~]#vim /etc/haproxy/haproxy.cfg
frontend WEB_PORT_80
bind 192.168.10.100:80
use_backend WEB_PORT_80_servers1 #写1往1上调度,写2往2上调度
backend WEB_PORT_80_servers1
server web01 10.0.0.101:80
backend WEB_PORT_80_servers2
server web02 10.0.0.102:80
[root@ubuntu2004 ~]#systemctl restart haproxy.service
[root@ubuntu2004 ~]#curl www.meng.org 只能调度上1上
web1.meng.org 10.0.0.101
server配置
针对一个server配置
check#对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没有其它配置也可以启用检查功能
#默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定 端口才能实现健康性检查
addr <IP> #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num> #指定的健康状态监测端口
inter <num> #健康状态检查间隔时间,默认2000 ms
fall <num> #后端服务器从线上转为线下的检查的连续失效次数,默认为3
rise <num> #后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight> #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
backup #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似 Sorry Server disabled #将后端服务器标记为不可用状态,即维护状态,除了持久模式,将不再接受连接, 状态为深黄色,优雅下线,不再接受新用户的请求
maxconn <maxconn> #当前后端server的最大并发连接数,放在server指令后面
redir http://www.baidu.com #将请求临时(302)重定向至其它URL,只适用于http模式,放在server指令后面
全局的、defautls放在主配置文件,把listen、frontend和bachend代理放在子配置文件
使用子配置文件保存配置(推荐使用)
当业务众多时,将所有配置都放在一个配置文件中,会造成维护困难.可以考虑按业务分类,将配置信 息拆分,放在不同的子配置文件中,从而达到方便维护的目的
注意: 子配置文件的文件后缀必须为.cfg
#创建子配置目录
[root@ubuntu2004 ~]#mkdir /etc/haproxy/conf.d/
#添加子配置目录到unit文件中
[root@ubuntu2004 ~]#vim /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
#修改下面两行
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -c -q ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -p /var/lib/haproxy/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
#创建子配置文件,注意:必须为cfg后缀非.开头的配置文件,主配置关于listen、frontend和bachend切到子配置文件
[root@ubuntu2004 ~]#vim /etc/haproxy/conf.d/test.cfg (两个业务可以分别创建子配置文件)
#listen WEB_PORT_80
# bind 192.168.10.100:80
# server web1 10.0.0.101:80 weight 1 check addr 10.0.0.101 port 80
# server web2 10.0.0.102:80 weight 1 check addr 10.0.0.102 port 80
frontend WEB_PORT_80
bind 192.168.10.100:80
use_backend WEB_PORT_80_servers1
backend WEB_PORT_80_servers1
server web01 10.0.0.101:80
backend WEB_PORT_80_servers2
server web02 10.0.0.102:80
[root@ubuntu2004 ~]#systemctl daemon-reload
[root@ubuntu2004 ~]#systemctl restart haproxy.service
去访问还没影响
实验环境准备
准备工作
按图配置外部网络机器 192.168.10.0/24
按图配置内部网络机器 10.0.0.0/24
10.0.0.100安装haproxy (使用脚本安装)
后台web1、web2安装nginx (测试用包安装 apt -y install nginx)
192.168.10.123为访问主机
192.168.10.200为访问主机的DNS (使用脚本安装DNS)
192.168.10.200设置DNS
[root@ubuntu2004 ~]#vim /etc/bind/meng.org.zone
$TTL 1D
@ IN SOA master admin (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS master
master A 10.0.0.104
www A 192.168.10.100
[root@ubuntu2004 ~]#rndc reload
server reload successful
访问机器192.168.10.123DNS指向192.168.10.200
[root@ubuntu2004 ~]#vim /etc/netplan/01-netcfg.yaml
addresses: [192.168.10.200]
[root@ubuntu2004 ~]#netplan apply
[root@ubuntu2004 ~]#ping www.meng.org
PING www.wang.org (192.168.10.100) 56(84) bytes of data.
64 字节,来自 192.168.10.100 (192.168.10.100): icmp_seq=1 ttl=64 时间=0.944 毫秒
[root@ubuntu2004 ~]#curl www.wang.org
web1.meng.org 10.0.0.101
[root@ubuntu2004 ~]#curl www.wang.org
web2.meng.org 10.0.0.102
更改后台web服务器页面
web1
[root@ubuntu2004 ~]#vim /var/www/html/index.html
web1.meng.org 10.0.0.101
web2
[root@ubuntu2004 ~]#vim /var/www/html/index.html
web2.meng.org 10.0.0.102
在10.0.0.100机器测试访问web
[root@ubuntu2004 ~]#curl 10.0.0.101
web1.meng.org 10.0.0.101
[root@ubuntu2004 ~]#curl 10.0.0.102
web2.meng.org 10.0.0.102
修改haproxy配置,设置对外发布访问的接口
[root@ubuntu2004 ~]#vim /etc/haproxy/haproxy.cfg
listen WEB_PORT_80
bind 192.168.10.100:80
server web1 10.0.0.101:80
server web2 10.0.0.102:80
windows客户端访问 192.168.10.100
显示结果:web1.meng.org 10.0.0.101 web2.meng.org 10.0.0.102