1.HAProxy安装、日志及listen代理
  IS4yhiOomKTv 2023年11月02日 48 0
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
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: 2.HAProxy调度算法 下一篇: AirNet使用笔记8
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  vxoexqgjyiCS   2023年11月19日   24   0   0 linuxvim数据
  YKMEHzdP8aoh   2023年11月30日   33   0   0 vimUDP
  xIUntf9oR6GI   2023年11月28日   31   0   0 sedvim基础命令
  mjtHZIki74si   2023年12月06日   32   0   0 ubuntubash
  vxoexqgjyiCS   2023年11月22日   23   0   0 linuxvimbash