Linux负载均衡实战|Nginx+HAProxy四层七层负载均衡完整实操
引言
本篇适合CentOS7运维入门同学,读完本文你可以学会:
全部来自课堂多机环境实操,需要多台CentOS虚拟机搭建集群环境,适合学习Web集群入门。
前置说明
✅ 环境:多台CentOS7虚拟机;建议准备:1台负载均衡器,3台后端Web节点,1台客户端,可选路由器主机;关闭SELinux、防火墙; ✅ 前置知识:熟悉Nginx虚拟主机、网络IP/网关基础,了解HTTP基础; ✅ 新手友好:概念搭配通俗比喻,配置带注释,跟着步骤可以复现实验。
💡代码块#后面为注释,不要复制到终端执行。 ⚠️实验环境关闭防火墙与SELinux;生产环境需要合理配置防火墙放行端口。
一、负载均衡基础概念
比喻:负载均衡就像公司前台接待,大量用户请求过来,前台把请求分发到后面多个业务员工处理,避免单个人干活累死,提升整体处理能力,同时一台员工挂掉,其他员工可以继续干活,实现高可用。
反向代理服务器处在真实Web服务器的前面,用户只访问代理,代理把请求转发给后端多台Web机器,这就是负载均衡。
- 用户看不到后端真实服务器IP;
- 代理接收用户请求,转发后端,拿到结果再返回给用户;
- 后端Web服务器不需要公网IP,全部流量经过负载均衡代理。
Nginx常见版本对比
| 官方Nginx | 开源免费,基础负载均衡、反向代理 | 绝大多数中小企业,学习实验首选 |
| Nginx Plus | 商业付费,高级健康检查、会话粘性、动态配置 | 企业商业生产环境 |
| OpenResty | Nginx + LuaJIT,支持Lua二次开发 | 需要高度自定义业务逻辑 |
| Tengine | 阿里维护的Nginx分支,性能优化、动态模块 | 国内大型互联网业务 |
二、Nginx负载均衡实操(upstream模块)
实验拓扑
| nginx.user.cloud | 10.1.8.10 | Nginx负载均衡器 |
| web1.user.cloud | 10.1.8.11 | 后端Web节点1 |
| web2.user.cloud | 10.1.8.12 | 后端Web节点2 |
| web3.user.cloud | 10.1.8.13 | 后端Web节点3 |
| client1.user.cloud | 10.1.8.21 | 测试客户端 |
实验前提:全部机器关闭selinux、关闭firewalld;网络互通。
2.1 部署后端Web节点(web1‑web3三台机器)
三台web服务器执行相同操作,页面输出自己主机名,方便观察负载分发效果。
yum install -y nginx
# 页面标记本机主机名,用来观察请求落到哪台机器
echo "Welcome to $(hostname)" > /usr/share/nginx/html/index.html
systemctl enable nginx –now
客户端测试访问后端单机是否正常:
curl 10.1.8.11
curl 10.1.8.12
curl 10.1.8.13
2.2 Nginx负载均衡器配置
安装nginx,新建代理配置:
yum install -y nginx
# 创建负载均衡配置文件
vim /etc/nginx/conf.d/proxy.conf
写入配置:
# upstream:定义后端服务器组,自定义组名叫web
upstream web {
server 10.1.8.11:80;
server 10.1.8.12:80;
server 10.1.8.13:80;
}
server {
listen 80;
server_name www.user.cloud;
location / {
# 把请求转发到上面定义的web后端组
proxy_pass http://web;
}
}
校验配置、启动nginx
nginx -t
systemctl enable nginx –now
客户端配置hosts解析域名做测试
echo "10.1.8.10 www.user.cloud" >> /etc/hosts
# 循环90次请求,统计每台后端被访问次数
for i in {1..90};do curl -s www.user.cloud;done|sort|uniq -c
默认轮询算法,三台机器各分配30次请求。
2.3 upstream常用参数详解
upstream web {
keepalive 32; # worker进程保持后端连接缓存数量
server 10.1.8.11:80 weight=2 max_fails=3 fail_timeout=30s;
server 10.1.8.12:80 backup; # backup:备用机器,全部主服务器故障才启用
server 10.1.8.13:80 down; # down:手动下线,不接收业务请求
}
- weight:权重,数值越大分配请求越多;
- max_fails:最大失败尝试次数;
- fail_timeout:失败超时时间,达到失败次数临时隔离故障节点;
- backup:备用节点,主节点全部挂掉才接管流量;
- down:手动标记下线维护。
2.4 Nginx主流调度算法
1)轮询 round‑robin(Nginx默认)
请求按顺序轮流分给每一台后端服务器,节点故障自动剔除。
upstream web {
server 10.1.8.11:80;
server 10.1.8.12:80;
server 10.1.8.13:80;
}
加权轮询,硬件性能不一样的时候用,权重越高分到请求越多
upstream web {
server 10.1.8.11:80 weight=10;
server 10.1.8.12:80 weight=20;
server 10.1.8.13:80 weight=30;
}
2)ip_hash 会话保持
根据客户端源IP做hash,同一个客户端IP永远落到同一台后端服务器,解决session会话丢失问题。
缺点:内网NAT环境大量用户共用同一个公网IP,会造成流量集中到一台机器,负载不均衡。
upstream web {
ip_hash;
server 10.1.8.11:80;
server 10.1.8.12:80;
server 10.1.8.13:80;
}
3)least_conn 最少连接
请求分配给当前活跃连接数最少的后端节点,适合请求处理时间差异大的业务。
upstream web {
least_conn;
server 10.1.8.11:80;
server 10.1.8.12:80;
server 10.1.8.13:80;
}
4)hash 通用哈希(url_hash)
根据URL、自定义变量哈希分发,适合缓存服务器场景;官方nginx需要额外模块支持。
upstream web {
hash $request_uri;
server 10.1.8.11:80;
server 10.1.8.12:80;
server 10.1.8.13:80;
}
least_time最少响应时间算法,只有Nginx Plus商业版提供,开源版本不支持。
三、HAProxy负载均衡
HAProxy是一款高性能代理软件,同时支持四层TCP负载均衡和七层HTTP负载均衡,开源、高并发,大量互联网项目使用。
3.1 四层代理 vs 七层代理
- 七层(HTTP):解析HTTP协议,可以读取header、cookie、url;可以按域名、URL路径做复杂分发;后端看到的源IP是HAProxy,需要X‑Forwarded‑For拿到真实客户端IP。
- 四层(TCP):不解析应用层内容,只转发TCP数据包,只识别IP和端口;转发效率极高,支持MySQL、SSH等非HTTP业务。
两条TCP链路:客户端 ↔ HAProxy;HAProxy ↔ 后端服务器,两条连接互相独立。后端服务器不能被用户直接访问,全部流量经过代理。
3.2 HAProxy常用调度算法
| roundrobin | 加权轮询,动态,支持权重调整 |
| static‑rr | 静态轮询,权重运行中不能动态修改 |
| leastconn | 最少连接优先,长连接业务首选 |
| source | 源IP哈希,会话保持,类似nginx ip_hash |
| uri | 根据请求URI哈希,缓存场景 |
| hdr(name) | 根据HTTP请求头哈希 |
3.3 HAProxy七层HTTP代理实操
实验环境沿用上面三台web后端:10.1.8.11‑13。 haproxy机器安装软件:
yum install -y haproxy
cp /etc/haproxy/haproxy.cfg{,.ori} #备份原始配置
vim /etc/haproxy/haproxy.cfg
在配置文件末尾追加七层HTTP配置,使用frontend‑backend写法,搭配ACL规则实现按后缀分流:
# frontend:接收用户请求前端入口
frontend front_web
bind *:80
default_backend back_web
# acl 自定义匹配规则,匹配访问路径以.txt结尾
acl is_txt url_reg -i \\.txt$
# 如果匹配is_txt规则,就交给back_test后端组
use_backend back_test if is_txt
# 默认web后端组
backend back_web
balance roundrobin
server web1 10.1.8.11:80 check
server web2 10.1.8.12:80 check
server web3 10.1.8.13:80 check
# txt请求专用后端,后端web开启81端口
backend back_test
balance roundrobin
server test1 10.1.8.11:81 check
server test2 10.1.8.12:81 check
server test3 10.1.8.13:81 check
参数说明:check开启后端健康检查,节点故障自动剔除。
后端web机器额外开启81端口服务:
# web1‑web3全部执行
mkdir /test
echo "hello html from $(hostname)" > /test/index.html
echo "hello txt from $(hostname)" > /test/index.txt
cat > /etc/nginx/conf.d/vhost-test.conf <<'EOF'
server {
listen 81;
root /test;
}
EOF
systemctl restart nginx
启动haproxy服务
systemctl enable haproxy –now
客户端测试验证:
# 普通80请求,落到back_web组
for n in {1..90}; do curl [http://10.1.8.10](http://10.1.8.10) -s; done |sort|uniq -c
# 访问txt后缀,触发acl规则,落到back_test 81端口组
curl [http://10.1.8.10/index.txt](http://10.1.8.10/index.txt)
3.4 HAProxy四层TCP代理示例(代理SSH)
使用listen一体化配置,直接转发TCP流量,代理SSH 22端口,对外监听1022端口:
listen ssh_proxy
mode tcp # mode tcp 开启四层模式
bind *:1022
balance roundrobin
server web1 10.1.8.11:22 check
server web2 10.1.8.12:22 check
server web3 10.1.8.13:22 check
重启haproxy,客户端测试:
# 通过1022端口代理ssh登录后端机器
for n in {1..90}; do ssh root@10.1.8.10 -p 1022 hostname 2>/dev/null;done|sort|uniq -c
3.5 HAProxy监控统计面板
增加监控页面配置,可以浏览器查看后端节点状态、连接数、请求统计:
listen haproxy_stats
bind *:8404
stats enable
stats uri /stats
stats auth admin:123456
重启haproxy,浏览器访问 http://IP:8404/stats,输入账号密码查看集群状态。
🚨新手常见坑合集
❌Nginx upstream配置完访问报错502 Bad Gateway
✅排查:后端web服务是否正常;网络是否通;防火墙/selinux;proxy_pass后面的名字与upstream组名保持一致。
❌ip_hash模式,大量内网用户请求全部打到同一台后端
✅NAT内网环境,多用户共享同一个公网出口IP,ip_hash不适合该场景;改用加权轮询/least_conn。
❌Nginx配置backup备用节点,一直不接收流量
✅backup节点只有全部主server故障下线之后,才会接管业务流量,正常情况不会分配请求。
❌HAProxy七层代理,后端拿不到用户真实访问IP
✅HAProxy默认源IP是代理服务器自身;七层模式配置X‑Forwarded‑For请求头,后端web读取该http头拿到真实客户端IP。
❌HAProxy四层代理配置完ssh连接失败
✅确认mode tcp;后端sshd服务正常;check健康检查是否失败,看haproxy日志排查。
❌acl规则不生效,txt后缀没有转发到指定后端
✅acl语法;url_reg正则表达式写法;配置修改后必须重载haproxy。
❌Nginx的least_time算法配置报错
✅开源免费Nginx不支持least_time,该特性仅Nginx Plus商业版可用。
❌haproxy监控页面打不开
✅确认监听端口、防火墙放行;账号密码配置正确;服务已重载。
总结
思考题&互动
欢迎评论区分享踩坑,多机环境完整复现实验,理解会更加深刻!
网硕互联帮助中心





评论前必须登录!
注册