云计算百科
云计算领域专业知识百科平台

Linux负载均衡实战|Nginx+HAProxy四层七层负载均衡完整实操

Linux负载均衡实战|Nginx+HAProxy四层七层负载均衡完整实操

引言

本篇适合CentOS7运维入门同学,读完本文你可以学会:

  • 理解负载均衡核心思想,分清反向代理与负载均衡的关系,认识Nginx多个主流版本差异;
  • Nginx的upstream模块实操,掌握轮询、权重、ip_hash、least_conn等调度算法,后端节点backup、down、健康检查参数用法;
  • HAProxy基础原理,分清四层TCP代理与七层HTTP代理的区别,理解X‑Forwarded‑For获取真实客户端IP;
  • HAProxy配置frontend/backend/listen三种配置写法,ACL访问规则、Web状态监控面板;
  • 完整多机实验复现,从后端Web服务部署、负载均衡配置、客户端验证整套流程。
  • 全部来自课堂多机环境实操,需要多台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模块)

    实验拓扑

    主机名IP角色
    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监控页面打不开

    ✅确认监听端口、防火墙放行;账号密码配置正确;服务已重载。

  • 总结

  • 负载均衡原理:反向代理作为流量入口,把请求分发多台后端服务器,实现扩容与故障隔离;分清Nginx各个版本的区别。
  • Nginx upstream模块:支持轮询、加权轮询、ip_hash会话保持、least_conn最少连接;掌握weight、backup、down、max_fails参数;开源版无least_time。
  • HAProxy:同时支持四层TCP代理、七层HTTP代理;frontend/backend分离配置,也可以用listen一体化;acl实现按URL后缀等条件路由;内置web监控面板;支持roundrobin、leastconn、source等多种调度算法。
  • 四层只转发TCP报文,适合SSH、MySQL等TCP业务;七层解析HTTP,可以做URL、header复杂逻辑分发;四层七层后端默认看到的是代理IP,七层需要X‑Forwarded‑For传递真实客户端IP。
  • 思考题&互动

  • Nginx中ip_hash作用是什么?什么场景不适合使用ip_hash?
  • HAProxy四层代理mode tcp与七层http模式,核心区别是什么,分别适合什么业务?
  • upstream里面backup参数的作用是什么?
  • HAProxy的acl规则是在哪一层生效,四层TCP模式能不能使用url_reg匹配URL?
  • 欢迎评论区分享踩坑,多机环境完整复现实验,理解会更加深刻!

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Linux负载均衡实战|Nginx+HAProxy四层七层负载均衡完整实操
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!