
第一部分负载均衡基础理论1. 四层、七层负载均衡OSI 七层模型1四层负载均衡传输层 TCP/UDPOSI 第 4 层仅识别源 IP、目标 IP、源端口、目标端口看不到 HTTP 报文内容转发依据只靠 IP 端口分发 TCP/UDP 数据包优势内核转发、性能极高局限无法区分域名、URL、Cookie适用数据库、FTP、TCP 长连接服务2七层负载均衡应用层 HTTP/HTTPSOSI 第 7 层完整解析 HTTP 请求报文转发依据IP、端口、域名、URI、请求头、Cookie、接口参数优势调度策略丰富、业务精细化分流局限性能弱于四层适用网站 Web、前后端接口业务2. 主流负载均衡产品开源免费软件Nginx原生七层 Web 负载均衡1.9 版本通过stream模块支持四层 TCP 负载LVS纯四层负载均衡内核转发吞吐性能天花板HAProxy同时完整支持四层 TCP、七层 HTTPWeb / 数据库通用商业硬件企业付费F5、Netscaler、Radware、A10 特点可视化管理、自带 WAF 防护、厂商 7*24 技术支持成本高昂3. Nginx 后端节点健康检查机制Nginxupstream仅提供被动健康检查后端节点连续请求超时 / 连接失败临时剔除故障节点不再分配流量故障节点恢复后自动重新加入集群参与调度缺陷无内置短信 / 邮件告警需搭配 Zabbix/Prometheus 监控实现故障提醒4. 五大负载均衡调度算法表格算法全称调度规则适用场景rr轮询默认请求按顺序轮流分配给所有后端所有服务器硬件性能完全一致wrr权重轮询weight数字数值越大承载流量越多服务器配置高低不均高配多分担流量ip_hash源 IP 哈希调度同一客户端 IP 固定访问同一台后端会话保持解决 Web Session 丢失问题least_conn最小连接数新请求优先分给当前并发最少的节点上传、大文件等长耗时业务fair响应时间调度后端响应越快分配流量越多后端负载波动大需第三方模块编译第二部分环境规划集群机器分工LB 负载均衡网关Nginx 七层代理192.168.233.160web01 后端业务节点192.168.233.150:80web02 后端业务节点192.168.233.162:80NFS 共享存储服务端192.168.233.200所有机器挂载目录/data/nfs需求LB 实现负载均衡分发流量至 web01、web02日志格式区分 LB 本机 IP、真实访客客户端 IP完整动静分离架构静态资源直读 NFS、动态业务转发 web 集群上传文件区分 POST 写入、GET 读取两种逻辑支付接口独立分流第三部分LB 网关完整 Nginx 配置带逐行注释nginx# 全局工作进程建议设为CPU核心数 worker_processes 1; # 事件模块控制单个进程最大并发连接数量 events { worker_connections 1024; } # HTTP七层核心模块实现反向代理、负载均衡、动静分离 http { # 引入mime文件识别html/css/js/png/mp4等资源类型 include mime.types; default_type application/octet-stream; # 自定义日志格式打印LB网关IP 真实访客IP log_format access_show_ip $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent 【LB网关本机IP:$remote_addr】 【真实访客客户端IP:$http_x_forwarded_for】; # 指定日志存储路径启用自定义日志模板 access_log logs/lb_access.log access_show_ip; sendfile on; # 开启零拷贝优化静态文件磁盘IO keepalive_timeout 65; # HTTP长连接超时65秒 gzip on; # 开启资源压缩减小网络传输体积 # 指定需要压缩的静态文件类型 gzip_types text/css text/javascript image/png image/jpeg image/mp4; # 定义后端业务地址池包含web01、web02两台节点 upstream dynamic_server_group { # ip_hash; # 取消注释开启会话保持 # least_conn; # 取消注释开启最小连接调度 server 192.168.233.150:80 weight1; # web01 权重1 server 192.168.233.162:80 weight1; # web02 权重1 # server 192.168.233.163:80 backup; # 备用节点主节点全故障才启用 } # 对外访问虚拟主机绑定业务域名 server { listen 80; server_name www.web-test.com; # 统一向后端传递客户端原始信息web01/web02日志可拿到真实访客IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 分支1/static 纯静态资源js/css/字体/图标直接读取NFS不走后端 location /static/ { root /data/nfs; # NFS共享挂载目录 expires 7d; # 浏览器本地缓存7天减少重复请求 add_header Cache-Control public; } # 分支2-1GET请求拉取/upload下图片/视频LB直读NFS返回无需后端处理 location ~* ^/upload/.*\.(png|jpg|jpeg|mp4|mp3)$ { root /data/nfs; expires 3d; # 图片视频缓存3天 } # 分支2-2POST上传文件请求转发web集群写入NFS并更新数据库 location /upload/ { proxy_pass http://dynamic_server_group; client_max_body_size 50M; # 限制单文件最大50MB防止大文件攻击 } # 分支3/pay 支付专属接口独立转发后端业务解耦可单独限流防护 location /pay/ { proxy_pass http://dynamic_server_group; } # 分支4首页、商品列表等通用动态页面全部转发web集群 location / { proxy_pass http://dynamic_server_group; } } }第四部分web01、web02 后端节点统一配置两台配置完全一致两台后端仅处理动态业务Java/PHP静态资源统一由 LB 直读 NFS后端无需存放图片、js、cssnginxworker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; # 后端日志打印经过LB传递的真实客户端IP log_format web_real_ip $http_x_forwarded_for - $remote_user [$time_local] $request $status; access_log logs/web_access.log web_real_ip; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.web-test.com; # 处理首页、上传、支付动态逻辑Java/PHP程序目录 root html; index index.html index.htm index.php; # 动态程序转发示例PHP-FPMJava替换为proxy_pass tomcat地址 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }第五部分全链路动静分离业务架构解读1. 完整请求流程客户端访问域名 → 请求抵达 LB 网关 → Nginx 按 URL 路径分流/static/ 图片 GET 请求LB 直接读取 NFS 静态文件返回浏览器不经过 web01/web02/uploadPOST 上传 //pay/ 首页转发至 web01/web02 动态集群处理业务逻辑2. 四大流量分支业务逻辑1/upload文件上传分支POST 上传web 后端接收文件 → 写入共享 NFS/data/nfs/upload→ 数据库资源表记录文件名、存储路径、用户 IDGET 图片访问LB 直接读取 NFS 图片返回不消耗后端程序资源2/首页 / 列表动态读分支请求转发 web 后端后端查询「用户表」「资源表」拿到图片路径页面拼接图片 URL前端再次发起静态资源请求由 LB 直接返回图片3/static纯静态资源分支 无需后端、无需数据库LB 直接响应开启浏览器长期缓存大幅降低集群压力4/pay支付接口分支 独立转发 web 集群和普通页面业务隔离可单独配置限流、WAF 安全策略3. 数据库两张核心业务表用户表存储用户名、密码、头像、个人资料等基础用户数据资源表存储上传文件名、NFS 文件存储路径页面渲染时读取路径展示图片4. NFS 共享存储作用LB、web01、web02 全部统一挂载同一 NFS 目录/data/nfs任意一台机器上传的文件全集群均可访问解决多后端服务器本地文件不同步问题5. 动静分离架构四大优势性能隔离静态资源全部由 LB 处理Java/PHP 后端只负责数据库交互并发承载能力翻倍提升业务解耦支付、上传、首页流量拆分支付业务可单独扩容、限流、安全防护互不干扰文件统一管理NFS 集中存储所有图片视频后端无需同步本地文件数据库仅记录路径即可缓存降载静态资源开启浏览器缓存大量重复静态请求在客户端直接命中减少网关、后端、数据库压力第六部分配套运维操作命令1. 所有机器统一挂载 NFS 共享存储bash运行# NFS服务端IP192.168.233.200共享目录/nfs_share本机挂载点/data/nfs mount 192.168.233.200:/nfs_share /data/nfs2. Nginx 配置校验 平滑重载源码安装通用bash运行# 校验配置语法报错直接提示错误行数 /usr/local/nginx/sbin/nginx -t # 平滑重载不中断在线用户访问 /usr/local/nginx/sbin/nginx -s reload3. 流量访问验证区分curl www.web-test.com/static/js/main.js仅 LB 生成日志web01/web02 无访问记录纯静态直读 NFScurl -X POST www.web-test.com/upload流量转发 web01/web02后端执行写入 NFS、更新数据库curl www.web-test.com/upload/1.pngLB 直接读取 NFS 图片后端无日志curl www.web-test.com/pay/order转发后端支付业务操作订单数据库4. 循环测试负载均衡分发bash运行# 连续10次访问观察日志流量交替打到web01、web02 for i in seq 1 10;do curl www.web-test.com;echo ;sleep 0.5;done