Nginx负载均衡策略 一、引言为什么需要多种负载均衡策略当你的应用从单机走向集群Nginx 的upstream模块就成了流量调度的核心。但“一刀切”的分发方式并不总是最优解。你的服务器硬件配置参差不齐你的应用需要会话保持Session Sticky你的请求处理时间长短不一你希望在增减节点时对现有连接的影响最小面对这些不同的场景Nginx 提供了多种负载均衡策略。选择合适的策略能让集群资源利用更充分、用户体验更流畅、系统架构更健壮。本文将为你逐一拆解这五大核心策略。核心价值理解并善用不同策略是区分普通使用者和高级架构师的关键一步二、基石upstream模块与server参数在深入策略之前先回顾upstream的基本构成。upstream backend { server 192.168.1.10:8080 [parameters]; server 192.168.1.11:8080 [parameters]; }server指令常用参数参数作用weightnumber服务器权重默认为1。权重越高接收请求越多。max_failsnumber在fail_timeout时间内允许请求失败的最大次数。默认为1。fail_timeouttime服务器被判定为不可用后的暂停服务时间。默认为10秒。backup标记为备份服务器仅在其他服务器都宕机时启用。down手动标记服务器为永久不可用用于维护。三、五大核心负载均衡策略详解策略一轮询Round Robin -默认策略原理最简单的公平调度。Nginx 按照顺序将每个新请求依次分配给服务器列表中的下一台服务器。配置upstream myapp { server 192.168.1.10:8080; server 192.168.1.11:8080; server 192.168.1.12:8080; }适用场景所有后端服务器性能相近且无状态Stateless的应用。这是最通用、开销最小的策略。策略二加权轮询Weighted Round Robin原理轮询的升级版。通过weight参数让性能更强的服务器承担更多流量。配置upstream myapp { server 192.168.1.10:8080 weight5; # 高配服务器 server 192.168.1.11:8080 weight2; # 中配服务器 server 192.168.1.12:8080 weight1; # 低配或旧服务器 }效果每8个请求中5个去Server12个去Server21个去Server3。适用场景后端服务器硬件配置不均或你想逐步灰度上线新版本服务器。策略三IP哈希IP Hash原理根据客户端的 IP 地址进行哈希计算确保同一个 IP 的请求始终被转发到同一台后端服务器。配置upstream myapp { ip_hash; # 启用IP哈希 server 192.168.1.10:8080; server 192.168.1.11:8080; }优点天然实现会话保持无需共享 Session 存储。缺点如果客户端都在同一个 NAT 网关后如公司网络Nginx 看到的都是同一个公网 IP会导致所有流量都打到一台服务器上失去负载均衡意义。当后端服务器数量发生变化时几乎所有客户端的 IP 映射关系都会改变导致会话丢失。适用场景无法使用 Redis 等集中式 Session 存储且客户端 IP 分布较广的内部系统。策略四最少连接Least Connections原理Nginx 会将新请求分配给当前活跃连接数最少的服务器。它假设连接数少的服务器当前负载更低。配置upstream myapp { least_conn; # 启用最少连接 server 192.168.1.10:8080; server 192.168.1.11:8080; }适用场景后端请求处理时间差异很大例如有些请求是简单的读操作有些是复杂的报表生成。此策略能更公平地分配负载。策略五通用哈希 / 一致性哈希Hash / Consistent Hash注意此策略在开源版 Nginx 中需要ngx_http_upstream_hash_module模块支持通常已编译进主流发行版。原理通用哈希 (hash)基于指定的键如$request_uri,$cookie_jsessionid进行哈希将相同键的请求固定到同一台服务器。一致性哈希 (hash ... consistent)在通用哈希基础上采用一致性哈希算法。当增减节点时能最大程度地减少已有键的重新映射对缓存系统尤其友好。配置# 基于请求URI的通用哈希 upstream myapp { hash $request_uri; server 192.168.1.10:8080; server 192.168.1.11:8080; } # 基于Cookie的一致性哈希推荐用于缓存 upstream cache_backend { hash $cookie_user_id consistent; server 192.168.1.10:11211; # Memcached server 192.168.1.11:11211; }适用场景通用哈希需要基于特定业务键如用户ID、文件名做路由。一致性哈希后端是缓存集群如 Memcached, Redis希望在扩容/缩容时缓存失效的比例最小化。四、生产级配置最佳实践一个完整的、可用于生产的负载均衡配置除了选择策略还需考虑健康检查和超时。upstream production_backend { # 选用加权轮询 server app-server-01:8080 weight3 max_fails2 fail_timeout30s; server app-server-02:8080 weight3 max_fails2 fail_timeout30s; server app-server-03:8080 weight1 max_fails2 fail_timeout30s backup; # 如果是缓存可选用一致性哈希 # hash $request_uri consistent; } server { listen 80; server_name api.yourcompany.com; location / { proxy_pass http://production_backend; # 必须传递的请求头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 超时设置 proxy_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 10s; } }五、如何选择正确的策略你的需求推荐策略通用场景服务器同质轮询 (Round Robin)服务器性能不同加权轮询 (Weighted Round Robin)需要会话保持且无集中式SessionIP哈希 (IP Hash)或通用哈希 (Hash)请求处理时间差异大最少连接 (Least Connections)后端是缓存集群需平滑扩缩容一致性哈希 (Consistent Hash)六、结语感谢您的阅读如果你有任何疑问或想要分享的经验请在评论区留言交流