一、Haproxy介绍

Haproxy(High Availability Proxy)是一款开源、高性能的负载均衡器和代理服务器,主要用于 TCP (第四层)和 HTTP(第七层) 应用的负载均衡和高可用性。主要功能如下:

负载均衡

  • 支持多种算法:轮询(round-robin)、最少连接(leastconn)、源地址哈希(source)等。
  • 支持 TCP 和 HTTP/HTTPS 请求。

健康检查

  • 定期检查后端服务器是否存活,不可用时自动下线。
  • 可定制检查方式,如 ping、HTTP 请求、TCP 连接等。

会话保持(Session Persistence)

  • 可根据 Cookie、IP、URL 等维度做粘性会话(sticky session)。

SSL/TLS 终端

  • 可终结 SSL,进行 HTTPS 到 HTTP 的卸载。
  • 支持 SNI、多证书配置。

安全控制

  • IP 黑白名单、连接数限制、防止 DDoS 攻击。
  • 支持 ACL(访问控制列表)。

高可用

  • 通常与 Keepalived 配合,构建主备热切高可用架构。

二、Haproxy安装

1.安装

Haproxy下载地址:https://www.haproxy.org/#down,选择对应版本下载.gz包

[root@localhost ~]# tar -xf haproxy-2.8.15.tar.gz 
[root@localhost ~]# cd haproxy-2.8.15/
[root@localhost haproxy-2.8.15]# uname -r
3.10.0-1160.el7.x86_64

# TARGET参数指定linux内核版本,ARCH指定架构
[root@localhost haproxy-2.8.15]# make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64     
[root@localhost haproxy-2.8.15]# make install PREFIX=/usr/local/haproxy

[root@localhost haproxy-2.8.15]# cd /usr/local/haproxy/
[root@localhost haproxy]# ls
doc  sbin  share

mkdir -p /var/lib/haproxy

2.配置Haproxy

haproxy编译安装默认不会生成配置文件,需要手动创建配置文件

[root@localhost haproxy]# pwd
/usr/local/haproxy
[root@localhost haproxy]# cat haproxy.cfg

# 全局配置
global
    log         127.0.0.1 local2 info    # 使用系统定义的日志级别,需要在/etc/rsyslog.conf文件中更改配置内容

    chroot      /var/lib/haproxy   # 定义haproxy的数据目录,编译安装需要实现创建
    pidfile     /var/run/haproxy.pid # 定义haproxy的pid文件
    maxconn     4096       # 定义最大连接数
    user        haproxy
    group       haproxy
    daemon

    stats socket /var/lib/haproxy/stats

# 默认配置
defaults
    mode                    http       # 默认工作模式为HTTP
    log                     global    # 使用全局日志配置
    backlog                 10000     # 等待连接队列最大长度
    option                  httplog     # 启用http日志格式
    option                  dontlognull  # 不记录空连接日志
    option                  http-server-close    # 每次请求后关闭服务器端连接
    option                  forwardfor       # 将客户端ip传递给后端服务器,后端服务器需要添加X-Forward-For头,才能获取到客户端Ip
    option                  redispatch     # 当服务器宕机时能够将请求重新分配给其他服务器
    retries                 3          # 每个请求最多重试3次
    timeout http-request    10s       # 客户端发起请求的最大等待时间
    timeout queue           1m        # 请求在队列中的最大等待时间
    timeout connect         10s      # Haproxy与后端建立连接的超时时间
    timeout client          1m        # Haproxy与客户端连接的最大空闲时间
    timeout server          1m        # Haproxy与服务器连接的最大空闲时间
    timeout http-keep-alive 10s        # http长连接最大时间
    timeout check           10s       # 健康检查超时时间
    maxconn                 40960       # 最大并发连接数

listen stats
    bind 0.0.0.0:8080        # 监听所有地址的8080端口,当客户端访问8080端口时,请求走该模块
    mode http
    option httplog
    stats enable         # 启动监控页面
    stats uri /stats       # 通过/stats路径访问
    stats refresh 10s       # 监控页面10s刷新一次
    stats auth admin:admin_123456      # 访问用户名和密码
    stats hide-version             # 隐藏版本信息
    stats realm Haproxy\ Statistics    # 登录提示信息

frontend  haproxy-test    # 前端入口,监听客户端的请求    haproxy-test为自定义的名称
    bind 0.0.0.0:5000        # 当客户端的请求为5000端口时,进入该入口
    mode http
    log global
    option httplog
    option httpclose      # 每次请求后关闭连接
    acl html url_reg -i \.html$       # 定义一个ACL,名称为html,匹配以.html结尾的请求
    use_backend html-server if html     # 如果匹配到名称为html的ACL,使用名为html-server的backend
    default_backend html-server   # 如果匹配不到,默认使用名为html-server的backend

backend html-server     # 定义一个backend,
    mode http
    balance roundrobin    # 使用轮询算法
    option httpchk GET /index.html   # 启用http健康检查
    cookie SERVERID insert indirect nocache    # 给后端服务器设置持久化cookie
    server htmlServer-1 192.168.56.109:80 weight 1 check inter 2000 rise 2 fall 5
    server htmlServer-2 192.168.56.110:80 weight 1 check inter 2000 rise 2 fall 5


通常一个fronted有对应的backend,客户端访问url通过端口匹配到对应的fronted,fronted配置了对应的后端服务器组,将请求转发给后端服务器,实现了负载均衡。

其他参数:

htmlServer-1:服务器名称,自定义
192.168.56.109:80:服务器IP和端口
weight 1:权重为1
check:启用健康检查
inter 2000:2000ms检查一次
rise 2:连接两次成功,认为服务器可用
fall 5:连接五次失败,认为服务器不可用

3.配置系统日志

根据haproxy中定义的日志级别,配置系统日志

[root@localhost haproxy]# vim /etc/rsyslog.conf 
$ModLoad imudp
$UDPServerRun 514
local2.*                                                /var/log/haproxy.log

4.启动haproxy

[root@localhost haproxy]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg

5.测试负载均衡

根据配置文件内容,创建两台服务器,IP分别为192.168.56.109和192.168.56.110,并安装httpd服务进行测试

# 109服务器
[root@k8s-master ~]# echo web1 > /var/www/html/index.html
[root@k8s-master ~]# systemctl start httpd

# 110服务器
[root@k8s-node ~]# echo web2 > /var/www/html/index.html
[root@k8s-node ~]# systemctl start httpd

访问配置的haproxy的测试端口,可以看到haproxy将流量分发到两个服务器了,访问到两个服务器的内容
在这里插入图片描述
在这里插入图片描述

6.访问监控页面

根据设定的端口及uri访问监控页面,地址为192.168.56.108:8080/stats,密码在配置文件中设定
在这里插入图片描述
可以看到真实服务器的访问次数、状态等信息

三、Haproxy集群搭建

通过keepalived+haproxy+静态服务器+动态服务器搭建haproxy的集群,集群设定两台haproxy服务器(通过keepalived做高可用),两台httpd服务器作为静态服务器,两台php服务器作为动态服务器。

1.环境准备

ip 域名解析 作用
192.168.253.31 el1 静态服务器-1
192.168.253.32 el2 静态服务器-2
192.168.253.33 el3 动态服务器-1
192.168.253.41 kafka1 动态服务器-2
192.168.253.52 haproxy-1
192.168.253.53 haproxy-2

2.后端服务器配置

静态服务器

[root@el1 ~]# echo apach1 > /var/www/html/index.html
[root@el1 ~]# systemctl start httpd


[root@el2 ~]# echo apach2 > /var/www/html/index.html
[root@el2 ~]# systemctl start httpd

动态服务器

[root@el3 ~]# yum -y install httpd php
[root@el3 ~]#vim /var/www/html/index.php

<?php
// 设置时区
date_default_timezone_set("Asia/Shanghai");

// 输出内容
echo "<h1>欢迎使用 PHP-1!</h1>";
echo "<p>当前时间是:" . date("Y-m-d H:i:s") . "</p>";
?>



[root@kafka1 ~]# yum -y install httpd php
[root@kafka1 ~]# vim /var/www/html/index.php 
<?php
// 设置时区
date_default_timezone_set("Asia/Shanghai");

// 输出内容
echo "<h1>欢迎使用 PHP-2!</h1>";
echo "<p>当前时间是:" . date("Y-m-d H:i:s") . "</p>";
?>

3.Haproxy服务器配置

3.1 haproxy配置

两台服务器安装过程相同

编译工具安装

sudo yum groupinstall "Development Tools" -y

sudo yum install -y \
    pcre pcre-devel \
    zlib zlib-devel \
    openssl openssl-devel \
    readline-devel \
    ncurses-devel \
    bzip2 bzip2-devel \
    xz xz-devel \
    sqlite sqlite-devel \
    libffi-devel \
    wget curl git cmake unzip

安装haproxy

[root@localhost haproxy-2.8.15]# groupadd haproxy 
[root@localhost haproxy-2.8.15]# useradd -r -g haproxy haproxy

[root@localhost ~]# tar -xf haproxy-2.8.15.tar.gz 
[root@localhost ~]# cd haproxy-2.8.15

[root@localhost haproxy-2.8.15]# make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64 -j 8

[root@localhost haproxy-2.8.15]# make install PREFIX=/usr/local/haproxy

[root@localhost haproxy]# mkdir -p /var/lib/haproxy

[root@localhost haproxy-2.8.15]# cd /usr/local/haproxy/

创建配置文件

global
    log         127.0.0.1 local2 info

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4096
    user        haproxy
    group       haproxy
    daemon

    stats socket /var/lib/haproxy/stats


defaults
    mode                    http
    log                     global
    backlog                 10000
    option                  httplog
    option                  dontlognull
    option                  http-server-close
    option                  forwardfor       
    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                 40960       

listen stats
    bind 0.0.0.0:8080        
    mode http
    option httplog
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:admin_123456
    stats hide-version
    stats realm Haproxy\ Statistics

frontend  web
    bind 0.0.0.0:80
    mode http
    log global
    option httplog
    option httpclose
    acl static url_reg -i \.(html|css|jpg|png|gif)$
    acl php url_reg -i \.php$
    use_backend httpd-server if static
    use_backend php-server if php
    default_backend httpd-server
# 定义静态服务器地址池
backend httpd-server
    mode http
    balance roundrobin
    option httpchk GET /index.html
    cookie SERVERID insert indirect nocache
    server httpdServer-1 192.168.253.31:80 weight 1 check inter 2000 rise 2 fall 5
    server httpdServer-2 192.168.253.32:80 weight 1 check inter 2000 rise 2 fall 5
# 定义动态服务器地址池
backend php-server
    mode http
    balance roundrobin
    option httpchk GET /index.php
    cookie SERVERID insert indirect nocache
    server phpServer-1 192.168.253.33:80 weight 1 check inter 2000 rise 2 fall 5
    server phpServer-2 192.168.253.41:80 weight 1 check inter 2000 rise 2 fall 5

定义日志级别

[root@localhost haproxy-2.8.15]# vim /etc/rsyslog.conf 
local2.*                                                /var/log/haproxy.log

[root@localhost ~]# systemctl restart rsyslog

启动haproxy

[root@localhost ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
[root@localhost ~]# ss -antlp | grep 8080
LISTEN     0      128          *:8080                     *:*                   users:(("haproxy",pid=1428,fd=3))

访问haproxy的监控页面,可以看到单个haproxy的负载集群搭建完成

在这里插入图片描述

配置haproxy为服务

[root@localhost ~]# vim /etc/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network.target

[Service]
ExecStart=/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -D -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
PIDFile=/var/run/haproxy.pid
Restart=always

[Install]
WantedBy=multi-user.target

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start haproxy.service
[root@localhost ~]# systemctl enable haproxy
3.2 keepalived配置

安装keepalived

两台haproxy相同操作

[root@localhost ~]# yum -y install keepalived
systemctl start  keepalived
systemctl enable  keepalived

更改配置文件

haproxy1

[root@localhost ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id haproxy1
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/chk_haproxy.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.253.155
    }
    track_script {
        chk_haproxy
    }

}

haproxy2

[root@localhost ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id haproxy2
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/chk_haproxy.sh"
    interval 2
    weight -2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.253.155
    }
    track_script {
        chk_haproxy
    }

}

设置健康检查脚本

[root@localhost ~]# vim /etc/keepalived/chk_haproxy.sh

#!/bin/bash
HAPROXY_PID_FILE="/var/run/haproxy.pid"
HAPROXY_PORT=8080

# 判断PID文件是否存在且不为空
if [ ! -s "${HAPROXY_PID_FILE}" ];then
    echo " haproxy 未存活"
    exit 1
fi

# 判断PID对应的进程是否存在
HAPROXY_PID=$(cat $HAPROXY_PID_FILE)
kill -0 ${HAPROXY_PID} &> /dev/null
if [ $? -ne 0 ];then
    echo " haproxy 未存活"
    exit 1
fi

# 判断haproxy的监控端口是否可用
ss -antpl | grep "${HAPROXY_PORT}" > /dev/null
if [ $? -ne 0 ];then
    echo " haproxy 未存活"
    exit 1
fi


echo " haproxy 存活"
 
 
[root@localhost ~]# chmod +x /etc/keepalived/chk_haproxy.sh
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐