一、HAProxy 概述
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。因为其专注于负载均衡这一件事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
1、HAProxy的特点
HAProxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下HAProxy相对LVS,Nginx等负载均衡软件的优点。
支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
拥有一个功能出色的监控页面,实时了解系统的当前状况。
功能强大的ACL支持,给用户极大的方便。
2、HAProxy算法
-
roundrobin
- 轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.
-
static-rr
- 基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
-
leastconn
- 新的连接请求被派发至具有最少连接数目的后端服务器.
-
source
- 将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器
-
first
- 先让一台达到maxconn,然后再使用另外一台没达到的
-
uri
- 根据uri的部分或者完成uri进行哈希
二、安装HAProxy
1、yum 安装
版本较低
# yum -y install haproxy
2、源码安装
1、安装依赖
# yum -y remove haproxy
# yum -y install libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++ glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools iotop bc zip unzip zlib zlib-devel lsof ntpdate
2、升级 lua 依赖
# lua -v # 服务器自带的lua版本太低,haproxy高版本不支持
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
# curl -L -R -O https://www.lua.org/ftp/lua-5.4.6.tar.gz
# tar zxf lua-5.4.6.tar.gz
# cd lua-5.4.6
# make linux install
# lua -v
Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio
3、编译安装
1、使用默认openssl
# wget https://mirrors.huaweicloud.com/haproxy/2.8/src/haproxy-2.8.5.tar.gz
# tar zxf haproxy-2.8.5.tar.gz
# cd haproxy-2.8.5/
# make -j $(nproc) ARCH=x86_64 TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1 USE_ZLIB=1 USE_CPU_AFFINITY=1 LUA_INC=/root/lua-5.4.6/src LUA_LIB=/root/lua-5.4.6/src PREFIX=/usr/local/haproxy
# make install PREFIX=/usr/local/haproxy
# vim /etc/profile
export PATH=/usr/local/haproxy/sbin:$PATH
# source /etc/profile
# haproxy -v
HAProxy version 2.8.5-aaba8d0 2023/12/07 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2028.
Known bugs: http://www.haproxy.org/bugs/bugs-2.8.5.html
Running on: Linux 3.10.0-1160.53.1.el7.x86_64 #1 SMP Fri Jan 14 13:59:45 UTC 2022 x86_64
2、使用openssl3.0及以上版本
1、安装openssl3.2
建议使用LTS版本即3.0.8版本
# wget https://www.openssl.org/source/openssl-3.2.0.tar.gz
# tar zxf openssl-3.2.0.tar.gz
# cd openssl-3.2.0
# ./config --prefix=/usr/local/openssl-3.0 --openssldir=/usr/local/openssl-3.0 static zlib
# make -j $(nproc) && make install
# ldconfig
# tee /etc/profile.d/openssl.sh<<EOF
export PATH=/usr/local/openssl/bin:\$PATH
export LD_LIBRARY_PATH=/usr/local/openssl-3.0/lib:/usr/local/openssl-3.0/lib64:\$LD_LIBRARY_PATH
EOF
# source /etc/profile.d/openssl.sh
# openssl version -a
OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2023)
built on: Wed Jan 3 08:21:00 2024 UTC
platform: linux-x86_64
options: bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DZLIB -DNDEBUG
OPENSSLDIR: "/usr/local/openssl-3.0"
ENGINESDIR: "/usr/local/openssl-3.0/lib64/engines-3"
MODULESDIR: "/usr/local/openssl-3.0/lib64/ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xfefa320b5f8bffff:0x800d19e4fbb
安装haproxy
# wget http://www.haproxy.org/download/2.8/src/haproxy-2.8.5.tar.gz
# tar zxf haproxy-2.8.5.tar.gz
# cd haproxy-2.8.5
# make clean
# make TARGET=linux-glibc USE_PCRE=1 USE_SYSTEMD=1 USE_PCRE_JIT=1 USE_CPU_AFFINITY=1 USE_OPENSSL=1 USE_ZLIB=1 USE_LINUX_TPROXY=1 USE_REGPARM=1 USE_LUA=1 USE_THREAD=1 USE_TFO=1 SSL_INC=/usr/local/openssl-3.0/include SSL_LIB=/usr/local/openssl-3.0/lib64 PREFIX=/usr/local/haproxy
# make install PREFIX=/usr/local/haproxy
# haproxy -vvv | grep 'OpenSSL version'
Built with OpenSSL version : OpenSSL 3.2.0 23 Nov 2023
Running on OpenSSL version : OpenSSL 3.2.0 23 Nov 2023
4、配置systemd
# vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy
After=network.target
[Service]
User=root
Type=forking
ExecStart=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
ExecStop=/usr/bin/kill `/usr/bin/cat /usr/local/haproxy/haproxy.pid`
[Install]
WantedBy=multi-user.target
三、HAProxy配置文件
########################[全局配置]##########################
global
# 日志输出配置,所有日志都记录在本机,通过local3输出
log 127.0.0.1 local3 info
# 设定每个haproxy进程所接受的最大并发连接数,需要参考ulimit -n
maxconn 4096
# 运行haproxy用户
user nobody
# 运行haproxy用户组
group nobody
# 以守护进程运行运行haproxy
daemon
# 设置haproxy进程数量
nbproc 1
# 将所有进程写入pid文件
pidfile /usr/local/haproxy/run/haproxy.pid
####################[默认配置]################################
defaults
# 日志使用全局配置
log global
# haproxy工作模式{tcp|http|health},tcp4层,http7层,health只返回OK
mode http
# 默认日志格式非常简陋,仅包括源地址、目标地址和实例名称,而“option httplog参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。
option httplog
# 不记录请求报文包体数据为空的请求到日志,比如健康检查,减少写磁盘IO
option dontlognull
# 健康检查。3次连接失败就认为服务不可用
retries 3
# 允许在发往服务器的请求首部中插入“X-Forwarded-For”首部,用于后端主机记录真实请求的客户端ip
option forwardfor except 127.0.0.0/8
# 每次请求完毕后,关闭http通道,haproxy不支持keep-alive,只能通过模拟实现
option httpclose
# 服务不可用后的操作,重定向到其他健康服务器
option redispatch
# 当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
option abortonclose
# 最大连接数(优先级中)
maxconn 2048
# 默认的最大连接数
maxconn 4096
# 连接超时
timeout connect 5000ms
# 客户端请求超时
timeout client 30000ms
# 服务端响应超时
timeout server 30000ms
# 心跳检测超时
timeout check 2000
# 持久连接超时时间
timeout http-keep-alive 10s
# http请求超时时间
timeout http-request 10s
# 默认队列超时时间
timeout queue 1m
# 设置默认负载均衡算法{roundrobin|source|leastconn…}
balance roundrobin
###########################[统计页面]############################
listen admin_stats
# 设置统计页面监听的套接字,listen虚拟节点为frontend和backend的专有通道
bind 0.0.0.0:10800
# 设置统计页面工作模式
mode http
# 启用状态页面功能
stats enable
# 采用http日志格式
option httplog
# 是否开启错误日志并记录
#log 127.0.0.1 local err
# 设置访问统计页面的最大连接数
maxconn 10
# 设置统计页面的自动刷新时间
stats refresh 30s
# 访问统计页面的url
stats uri /stats
# 登录统计页面时的提示信息
stats realm DongPing\ Haproxy
# 设置统计页面的用户认证,可以设置多个用户名
stats auth admin:admin
# 隐藏统计页面上Haproxy的版本信息
stats hide-version
# 设置haproxy管理页面可以执行一些特权动作,比如下线后端主机
stats admin if TRUE
##########################[设置haproxy 错误页面]##########################
errorfile 403 /usr/local/haproxy/errorfiles/403.http
errorfile 500 /usr/local/haproxy/errorfiles/500.http
errorfile 502 /usr/local/haproxy/errorfiles/502.http
errorfile 503 /usr/local/haproxy/errorfiles/503.http
errorfile 504 /usr/local/haproxy/errorfiles/504.http
#########################[Frontend 前端配置]##############################
frontend http-proxy
# 定义使用的套接字
bind *:80
# 抓取请求报文首部字段为Host,Referer的值到haproxy日志中
capture request header Host len 20
capture request header Referer len 60
capture request header User-agent len 60
capture request header X-Forward-For len 60
# 定义一个acl规则,匹配以/{static|images|javascript|stylesheets}开头的静态资源
acl url_static path_beg -i /static /images /javascript /stylesheets
# 定义一个acl规则,匹配以.{jpg|jpeg|gif|png|css|js}结尾的静态资源
acl url_static path_end -i .jpg .jpeg .gif .png .css .js
# 如果被url_static这条acl规则匹配由后端集群static_servers进行分发
use_backend static_servers if url_static
# 定义请求不匹配所有规则时默认转发到的后端主机
default_backend dynamic_servers
##################[backend 后端配置]##################
#定义一组动态资源主机
backend dynamic_servers
# 定义haproxy工作模式
mode http
# 定义负载均衡算法
balance roundrobin
# 健康检查
option httpchk /check.jsp HTTP/1.0
# 使用基于cookie粘性的负载均衡算法
cookie SERVERID insert indirect nocache
# 定义连接后端主机的一些策略
# server name ip:port /表示后端一台主机,name必须给出
# cookie name /设置插入的cookie信息
# check inter 2000 /使用check关键字表示对后端主机检测,inter 2000表示检测时间间隔为2s
# weight /表示权重
# rise /表示检测两次正确,则认为服务器可用(服务从故障到正常)
# fall /表示检测三次失败,则认为服务器不可用(服务器从正常到故障)
# backup /表示备用主机
server webapp_01 192.168.3.84:8080 cookie srv1 weight 2 check inter 2000 rise 2 fall 3
server webapp_02 192.168.3.84:8081 cookie srv2 weight 2 check inter 2000 rise 2 fall 3
# 定义一个sorryserver,当所有后端主机不可访问时,请求调度到此主机上
server webapp_3 192.168.3.83:8080 backup check inter 2000 rise 2 fall 3
# 定义一组静态资源主机
backend static_servers
mode http
option httpchk /check.html
balance roundrobin
server static_01 192.168.3.84:80 check inter 2000 fall 3
server static_02 192.168.3.84:81 check inter 2000 fall 3
#######################[tcp配置]#########################################
listen mysql
bind 0.0.0.0:3306
balance leastconn
mode tcp
log global
option tcplog
maxconn 4096
#log 127.0.0.1 local0 debug
server dbsrv_01 192.168.3.84:3306 weight 1 check port 3306 inter 2000 rise 1 fall 2 maxconn 300
server dbsrv_02 192.168.3.84:3307 weight 1 check port 3307 inter 2000 rise 1 fall 2 maxconn 300
四、HAProxy 负载均衡
1、四层负载均衡示例
# cat /etc/haproxy/haproxy.cfg
# 全局配置
global
daemon
maxconn 50000 # 连接数限制为50000
# 默认配置
defaults
log global
mode http
option tcplog
retries 3
timeout client 50s
timeout connect 5s
timeout server 50s
# 负载均衡配置
listen my_service
bind 0.0.0.0:80
mode tcp
balance roundrobin
server webserver1 10.0.0.1:80 check
server webserver2 10.0.0.2:80 check
......
测试
# curl http://HAProxy服务器ip/index.html
web1
# curl http://HAProxy服务器ip/index.html
web2
2、七层负载均衡示例
请求域名www1.example.com的访问调度到web1
请求域名www2.example.com的访问调度到web2
# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local3
maxconn 50000
user nobody
# uid 99
group nobody
# gid 99
daemon
nbproc 1
pidfile /var/run/haproxy-private.pid
chroot /var/empty # chroot增加系统安全性
frontend public
bind 0.0.0.0:80
mode http
log global
timeout http-request 3s
timeout http-keep-alive 3s
timeout client 10s
option httplog
option forwardfor
option dontlognull
option http-keep-alive
capture request header Host len 30
capture request header Referer len 60
acl www1_example_com hdr_beg(host) -i www1.example.com # 对于www1.example.com,请求会路由到backend_www1_example_com后端
use_backend backend_www1_example_com if www1_example_com
acl www2_example_com hdr_beg(host) -i www2.example.com # 对于www2.example.com,请求会路由到backend_www2_example_com后端
use_backend backend_www2_example_com if www2_example_com
default_backend backend_www1_example_com
backend backend_www1_example_com
mode http
balance source
cookie appsession insert indirect preserve
timeout http-request 3s
timeout http-keep-alive 3s
timeout connect 1s
timeout server 10s
timeout check 500ms
option redispatch
option http-keep-alive
option httpchk GET /test.html HTTP/1.1\r\nHost:\ www1.example.com # 使用HTTP检查来测试后端服务器的健康状况,发送一个GET请求到/test.html,并指定Host头为www1.example.com
http-check expect string ok
retries 2
server www1_example_com_srv1 10.1.6.21:80 cookie b1 weight 8 check inter 2s rise 3 fall 5
stats enable # 启用统计功能
stats scope . # 统计范围为当前配置块
stats uri /admin?stats # 统计URI为/admin?stats
stats realm Haproxy\ Statistics # 统计认证域名为Haproxy\ Statistics
stats auth admin:6w5_xbkRGU # 设置统计认证用户名和密码
backend backend_www2_example_com
mode http
balance source
cookie appsession insert indirect preserve
timeout http-request 3s
timeout http-keep-alive 3s
timeout connect 1s
timeout server 10s
timeout check 500ms
option redispatch
option http-keep-alive
option httpchk GET /test.html HTTP/1.1\r\nHost:\ www2.example.com
http-check expect string ok
retries 2
server www2_example_com_srv1 10.1.6.44:80 cookie b2 weight 8 check inter 2s rise 3 fall 5
stats enable
stats scope .
stats uri /admin?stats
stats realm Haproxy\ Statistics
stats auth admin:6w5_xbkRGU
评论区