Nginx学习笔记(七)——Nginx负载均衡

⚖️ Nginx学习笔记(七)------Nginx负载均衡

📌 一、负载均衡核心概念

架构定位
分发请求 分发请求 分发请求 响应 响应 响应 聚合响应 客户端 Nginx负载均衡器 后端服务器1 后端服务器2 后端服务器3

核心价值

  • 📈 流量分发:将客户端请求均匀分配到多个后端服务器
  • 🛡️ 高可用保障:自动剔除故障节点,保障服务连续性
  • 性能扩展:通过增加后端节点提升系统吞吐量
  • 🔄 会话保持:确保用户请求路由到相同后端

⚙️ 二、基础配置语法

核心指令结构

nginx 复制代码
http {
    # 定义服务器组
    upstream backend_group {
        # 负载均衡策略
        least_conn;
        
        # 服务器配置
        server 192.168.1.101:8080 weight=5; 
        server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
        server backup.example.com:8080 backup;
    }

    server {
        location / {
            proxy_pass http://backend_group;  # 关键指令
        }
    }
}

关键参数详解

指令 默认值 作用
weight 1 服务器权重(越高分配越多请求)
max_fails 1 最大失败次数(触发熔断阈值)
fail_timeout 10s 熔断时间(故障节点暂停服务时长)
backup - 标记为备用节点(主节点全宕时启用)
down - 手动标记节点不可用

📊 三、负载均衡策略解析
1️⃣ 轮询策略(Round Robin)
nginx 复制代码
upstream backend {
    # 默认策略,无需显式声明
    server 192.168.1.101;
    server 192.168.1.102;
}

📌 运作机制
客户端 Nginx 服务器1 服务器2 请求1 转发请求1 响应1 返回响应1 请求2 转发请求2 响应2 返回响应2 客户端 Nginx 服务器1 服务器2

2️⃣ 加权轮询(Weighted Round Robin)
nginx 复制代码
upstream backend {
    server 192.168.1.101 weight=3;  # 60%流量
    server 192.168.1.102 weight=2;  # 40%流量
}

⚖️ 流量分配公式

nginx 复制代码
总权重 = 3 + 2 = 5
服务器1概率 = 3/5 = 60%
服务器2概率 = 2/5 = 40%
3️⃣ IP哈希策略(IP Hash)
nginx 复制代码
upstream backend {
    ip_hash;  # 基于客户端IP计算哈希
    server 192.168.1.101;
    server 192.168.1.102;
}

🔐 会话保持原理

复制代码
hash(客户端IP) % 服务器数量 = 固定分配的服务器索引
4️⃣ 最少连接(Least Connections)
nginx 复制代码
upstream backend {
    least_conn;
    server 192.168.1.101;
    server 192.168.1.102;
}

📈 动态调度逻辑
选择连接数最少的节点 新请求 检查当前连接数 转发请求 更新节点连接计数

5️⃣ 随机策略(Random)
nginx 复制代码
upstream backend {
    random;  # 随机选择后端节点
    server 192.168.1.101;
    server 192.168.1.102;
}

🎲 扩展加权随机

nginx 复制代码
upstream backend {
    random two;  # 随机选两个节点再选最优
    server 192.168.1.101 weight=2;
    server 192.168.1.102 weight=1;
}

🩺 四、健康检查机制

双模式检测架构
基于请求响应 定时探测 被动检查 标记故障节点 主动检查 恢复可用节点

配置示例

nginx 复制代码
upstream backend {
    zone backend_zone 64k;  # 共享内存区
    server 192.168.1.101;
    server 192.168.1.102;
    
    # 被动检查参数
    max_fails=3;
    fail_timeout=30s;
    
    # 主动检查参数(需nginx-plus)
    health_check interval=5s fails=3 passes=2 uri=/health;
}

健康状态流转

复制代码
UP -> 连续失败max_fails次 -> DOWN
DOWN -> 经过fail_timeout -> 重新探测 -> UP

🧩 五、多场景实战案例
🔄 案例1:多协议负载均衡
nginx 复制代码
# HTTP协议
http {
    upstream web {
        server 192.168.1.101:80;
        server 192.168.1.102:80;
    }
}

# TCP协议(四层负载)
stream {
    upstream db {
        server 192.168.1.201:3306;
        server 192.168.1.202:3306;
    }
}

# UDP协议
stream {
    upstream dns {
        server 192.168.1.211:53;
        server 192.168.1.212:53;
    }
}
🌐 案例2:跨数据中心部署
nginx 复制代码
upstream global {
    # 欧洲集群
    server eu1.example.com weight=3;
    server eu2.example.com weight=3;
    
    # 北美集群
    server us1.example.com weight=2;
    server us2.example.com weight=2;
    
    # 故障转移设置
    server backup.aws.com backup;
}
🧪 案例3:金丝雀发布
nginx 复制代码
upstream backend {
    # 正式环境(95%流量)
    server prod-v1:8080 weight=95;
    
    # 金丝雀环境(5%流量)
    server canary-v2:8080 weight=5;
    
    # 会话保持(确保测试用户一致性)
    sticky cookie srv_id expires=1h domain=.example.com;
}
🔐 案例4:会话持久化
nginx 复制代码
# 基于Cookie的会话保持
upstream checkout {
    sticky cookie srv_id expires=1h domain=.shop.com path=/;
    server 192.168.1.101;
    server 192.168.1.102;
}

# 基于路由的会话保持
upstream user_service {
    hash $request_uri consistent;  # 相同URI路由到相同节点
    server 192.168.1.101;
    server 192.168.1.102;
}

⚠️ 六、常见陷阱与解决方案
❌ 陷阱1:节点雪崩

现象

某节点故障导致大量请求重试到其他节点,引发连环宕机

解决方案

nginx 复制代码
# 限制重试次数
proxy_next_upstream_tries 3; 

# 熔断机制
upstream backend {
    server 192.168.1.101 max_conns=100;  # 单节点最大并发
    queue 100 timeout=60s;               # 排队队列设置
}
❌ 陷阱2:会话不一致

现象

用户多次请求被分发到不同节点导致状态丢失

解决方案

nginx 复制代码
# 启用会话保持
upstream backend {
    ip_hash; 
    # 或使用 sticky 指令
}
❌ 陷阱3:健康检查失效

现象

节点实际已故障但未触发熔断

解决方案

nginx 复制代码
# 调整健康检查敏感度
upstream backend {
    server 192.168.1.101 max_fails=2 fail_timeout=10s;
    
    # 主动检查(nginx-plus)
    health_check interval=2s fails=1 passes=1;
}

📊 七、监控与调优

关键监控指标

nginx 复制代码
# 状态接口配置
location /upstream_status {
    stub_status;
    allow 127.0.0.1;
    deny all;
}

监控数据示例

nginx 复制代码
Active connections: 291 
server accepts handled requests
 119789 119789 119387 
Reading: 6 Writing: 179 Waiting: 106 
Upstream: 2 active, 0 backup
 101.3.3.3:8080 weight=1 fail_timeout=10s max_fails=3 
   active:0 requests:12834 responses:12834 fail:0
 102.4.4.4:8080 weight=1 fail_timeout=10s max_fails=3
   active:1 requests:23912 responses:23912 fail:3

性能调优参数

nginx 复制代码
events {
    worker_connections 10240;  # 单进程连接数上限
}

http {
    # 连接复用优化
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    
    # 缓冲区优化
    proxy_buffers 16 8k;
    proxy_buffer_size 4k;
}

📚 总结图谱

负载均衡核心 策略体系 健康检查 会话管理 性能调优 轮询/加权/哈希
最少连接/随机 被动检查
主动探测 Cookie保持
URI哈希 连接复用
缓冲区优化

🔗 扩展阅读

相关推荐
I'm a winner12 分钟前
FPGA+护理:跨学科发展的探索(四)
笔记·fpga开发
HXR_plume19 分钟前
【计算机网络】王道考研笔记整理(4)网络层
笔记·计算机网络·考研
月盈缺25 分钟前
学习嵌入式的第十九天——Linux——文件编程
学习
求知若渴,虚心若愚。1 小时前
高可用实战之Nginx + Apache篇
运维·nginx·apache
梦幻精灵_cq2 小时前
《书写范式》——代码如诗,诗娟代码(Python)(附精巧“九九表”生成代码)
学习
Laplaces Demon3 小时前
Spring 源码学习(十)—— DispatcherServlet
java·后端·学习·spring
哈基米喜欢哈哈哈3 小时前
进程和线程
java·linux·windows·笔记
丰锋ff3 小时前
2021 年全国硕士研究生招生考试真题笔记
笔记
栈溢出了3 小时前
go学习笔记-结构体
笔记·学习