Haproxy负载均衡
Haproxy(High Availability Proxy)是一款开源、高性能的负载均衡器和代理服务器,主要用于 TCP (第四层)和 HTTP(第七层) 应用的负载均衡和高可用性。负载均衡支持多种算法:轮询(round-robin)、最少连接(leastconn)、源地址哈希(source)等。支持 TCP 和 HTTP/HTTPS 请求。健康检查定期检查后端服务器是否存活,不可用时自动下线
一、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:权重为1check:启用健康检查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
更多推荐

所有评论(0)