目录
1:案例前置知识点
1.1:HTTP请求
1.2:负载均衡常用调用算法
1.3:常见的web群集调度器
2:案例环境
2.1:本案例环境
2.2:案例需求
二:案例实施
1:安装web服务器
(1)搭建web1
(2)搭建web2
2:编译安装Haproxy
3:Haproxy服务器配置
(1)建立Haproxy的配置文件
(2)修改haproxy.conf配置文件
4:测试web群集
(1)测试高性能
(2)测试高可用
5:Haproxy的日志
6:Haproxy的参数优化
HTTP(HyperText Transfer Protocol)是Web应用的基础协议,采用请求-响应模型。
常见HTTP请求方法:
GET
(获取资源)、POST
(提交数据)、PUT
(更新资源)、DELETE
(删除资源)等。HTTP是无状态协议,依赖Cookie/Session保持会话。
长连接(Keep-Alive):复用TCP连接,减少建立/关闭连接的开销,适用于高并发场景。
消息 |
描述 |
200 OK |
请求成功(其后是对GET和POST请求的应答文档) |
301 Moved Permanently |
请求的永久页面跳转 |
302 |
临时重定向 |
304 Not Modified |
未修改,比如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码,告诉浏览器,你不用请求该资源,直接使用本地的资源即可。 |
403 Forbidden |
禁止访问该页面,服务器拒绝请求 |
404 Not Found |
服务器无法找到被请求的页面 |
500 Internal Server Error |
内部服务器错误 |
502 Bad Gateway |
无效网关 |
503 Service Unavailable |
当前服务不可用 |
504 Gateway Timeout |
网关请求超时 |
调度算法 | 说明 | 适用场景 |
---|---|---|
轮询(Round Robin) | 按顺序分配请求,均匀分发流量。 | 各服务器性能相近时使用 |
加权轮询(Weighted RR) | 根据服务器权重分配请求,权重越高,分配的请求越多。 | 服务器性能不均衡时优化负载 |
最小连接(Least Connections) | 优先将请求分配给当前连接数最少的服务器。 | 长连接或会话时间差异大的场景 |
IP哈希(IP Hash) | 根据客户端IP计算哈希值,固定分配到某台服务器。 | 需要会话保持(如登录状态) |
URL哈希(URL Hash) | 根据请求的URL分配服务器,相同URL始终访问同一台服务器。 | 缓存优化(如CDN) |
调度器 | 特点 | 适用场景 |
---|---|---|
Nginx | 高性能反向代理,支持HTTP/HTTPS负载均衡,基于事件驱动,适合高并发。 | Web服务器、API网关、静态资源 |
HAProxy | 专业级负载均衡,支持TCP/HTTP,丰富的调度算法,适合复杂业务场景。 | 微服务、数据库负载均衡 |
LVS | 基于Linux内核的四层(L4)负载均衡,性能极高,但不支持应用层(L7)解析。 | 高吞吐量场景(如视频流) |
主机 | 操作系统 | IP 地址 | 应用 |
---|---|---|---|
nginx1 | openEuler 24.03 | 192.168.10.101 | nginx |
nginx2 | openEuler 24.03 | 192.168.10.102 | nginx |
haproxy | openEuler 24.03 | 192.168.10.103 | haproxy |
① 测试安装 nginx、haproxy;
② Haproxy、nginx 配置。
#安装web网站
dnf -y install httpd #安装网站
#测试网页
vim /var/www/html/index.html
test202.com
#开启服务
systemctl start httpd
systemctl enable httpd
#安装web网站
dnf -y install httpd #安装网站
#测试网页
vim /var/www/html/index.html
test203.com
#开启服务
systemctl start httpd
systemctl enable httpd
测试网页
curl 192.168.10.202
curl 192.168.10.203
安装haproxy软件包
dnf -y install haproxy
vim /etc/haproxy/haproxy.cfg
Haproxy 配置文件通常分为三个部分,即 global、defaults 和 listen。global 为全局配置,defaults 为默认配置,listen 为应用组件配置。
global 配置项通常有下面配置参数,以示例参数说明如下。
global
log 127.0.0.1 local2 //配置日志记录,local2 为日志设备,默认存放到系统日志
maxconn 4000 //最大连接数
user haproxy //用户
group haproxy //用户组
defaults 配置项配置默认参数,一般会被应用组件继承,如果在应用组件中没有特别声明,将按照默认配置参数设置。
defaults
log global //定义日志为 global 配置中的日志定义
mode http //模式为 http
option httplog //采用 http 日志格式记录日志
retries 3 //检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
maxconn 3000 //最大连接数
timeout connect 5s //连接超时时间
timeout client 1m //客户端超时时间
timeout server 1m //服务器超时时间
listen 配置项一般配置应用模块参数。
listen webcluster //定义一个 appli4-backup 的应用
bind 0.0.0.0:80 //监听所有网卡的 80 端口
option httpchk GET /index.html //通过 GET /index.html 检查服务器健康状态
balance roundrobin //负载均衡调度算法使用轮询算法
server inst1 192.168.10.101:80 check inter 2000 fall 3 //后端服务器 1,每 2 秒检查一次,3 次失败后下线
server inst2 192.168.10.102:80 check inter 2000 fall 3
vim /etc/haproxy/haproxy.cfg
(删除defaults模块下的内容,添加listen模块)
listen myweb
bind 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.10.103:80 check inter 2000 fall 3
server inst2 192.168.10.102:80 check inter 2000 fall 3
#启动服务
systemctl start haproxy
浏览器访问101:
http://192.168.10.101
浏览器访问101:
http://192.168.10.101
添加设备绑定日志文件:
vim /etc/haproxy/haproxy.cfg
在global模块下添加一个日志记录
log 127.0.0.1 local3
vim /etc/rsyslog.d/haproxy.cfg
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
&~ #标注参数的结束
添加权限:
touch /var/log/haproxy.log
chmod 640 /var/log/haproxy.log
chown root:adm /var/log/haproxy.log
启动服务并测试日志信息
#启动服务
systemctl restart rsyslog
systemctl restart haproxy
#测试日志信息
tail -f /var/log/haproxy.log
关于 Haproxy 的参数优化,以下列举了几个关键的参数,并对各参数的生产环境的优化建议做了说明。
Haproxy 参数优化:
参数 | 参数说明 | 优化建议 |
---|---|---|
maxconn | 最大连接数 | 根据应用实际使用情况调整,推荐 10240。"defaults"中的值不能超过"global"段定义 |
daemon | 守护进程模式 | 生产环境建议使用守护进程模式启动 |
nbproc | 负载均衡的并发进程数 | 建议设置为服务器CPU核数相等或2倍 |
retries | 重试次数 | 节点多且并发量大时设为2-3次;服务器节点不多时可设为5-6次 |
option http-server-close | 主动关闭http请求选项 | 生产环境建议启用,避免因timeout设置过长导致http连接堆积 |
timeout http-keep-alive | 长连接超时时间 | 根据应用特点设置,建议10s |
timeout http-request | http请求超时时间 | 建议5~10s,加快http连接释放速度 |
timeout client | 客户端超时时间 | 访问量大或节点响应慢时可设置较短,建议1min左右 |