nginx负载均衡

  1. 当客户端发送请求时,会先到Nginx,然后Nginx会将请求分发到后台不同的服务器上。
  2. 如果后台的服务器群中有一个宕机了,那么Nginx会自动忽略这台服务器,不会将请求再次分发到这台服务器上。
  3. 如果有新加入的服务器,Nginx也会将请求分发到这台服务器上。

我所理解的负载均衡,就是:

能够将客户端的请求均匀地分发到后台各个应用服务器上,从而缓解服务器压力。
并且当服务器出现宕机或者扩容时,也能正常运行。

负载均衡的方法

上面了解了什么是负载均衡,那么Nginx是怎么实现这个功能的呢?

upstream和server的使用

Nginx中负责与上游交互的模块,统称为upstream模块。

而指定上游服务地址是通过upstreamserver指令完成的,其关系为:

指定上游服务器的address时,其地址可以是域名、IP地址或者unix socket地址。

可以在域名或者IP地址后加端口,如果不加端口,那么默认使用80端口

address后面可以添加一些参数,比如:

backup:指定当前server为备份服务,仅当非备份server不可用时,请求才会转发到该server。

down:标识某台服务已经下线,不再服务。

举个例子:

复制代码
upstream upstream-service {
        server 127.0.0.1:17002;
        server 127.0.0.1:17000;
    }

round-robin

upstream这个模块中,它还提供了一个最基本的负载均衡算法round-robin

其功能是:

以加权轮询的方式访问server指令指定的上游服务。

这个算法是默认集成在Nginx的框架中,无法移除,所以后面讲解的所有算法都是基于此,所有算法在某些特殊情况下最终都会变成round-robin

涉及到的指令有:

  1. weight:服务访问的权重,默认是1。
  2. max_conns:server的最大并发连接数,仅作用于单worker进程。
  3. max_fails:在fail_timeout时间内,最大的失败次数。当达到最大失败时,会在fail_timeout时间内不允许再次被选择。
  4. fail_timeout:单位为秒,默认是10秒。指定一段时间内,最大的失败次数max_fails。到达max_fails后,该server不能访问的时间。

简单的hash模块

有的时候,正常的轮询算法并不能满足我们的需求,

比如:带有cookie请求状态的连接,如果应用服务没有设置专门的管理cookie的服务器,那么我们就希望同一个用户能被分配到同一个服务器。

再比如:我们后端应用需要针对请求当中的参数或者URL,将相同的请求放到相同的服务器上进行处理。

针对第一种情况,就可以用upstream_ip_hash。针对第二种情况,可以使用upstream_hash

upstream_ip_hash

功能:

以客户端的IP地址作为hash算法的关键字,映射到特定的上游服务器中。

  1. 对IPV4地址使用前3个字节作为关键字,对IPV6则使用完整地址。
  2. 可以使用round-robin算法的参数。
  3. 可以基于realip模块修改用于执行算法的IP地址。

upstream_hash

功能:

通过制定关键字作为hash key,基于hash算法映射到特定的上游服务器中。

  1. 关键字可以含有变量、字符串。
  2. 可以使用round-robin算法的参数。

举个例子(以请求中的参数username作为hash key):

复制代码
upstream upstream-service {
        hash user_$arg_username;
        server 127.0.0.1:17002;
        server 127.0.0.1:17000;
    }
相关推荐
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
草梅友仁4 小时前
墨梅博客 1.4.0 发布与开源动态 | 2026 年第 6 周草梅周报
开源·github·ai编程
主机哥哥5 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey9035 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
学电子她就能回来吗5 小时前
深度学习速成:损失函数与反向传播
人工智能·深度学习·学习·计算机视觉·github
xuhe29 小时前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr
宇宙帅猴9 小时前
GitHub 私有仓库认证完整指南:告别密码错误,使用 PAT 令牌
github
前端市界12 小时前
用 React 手搓一个 3D 翻页书籍组件,呼吸海浪式翻页,交互体验带感!
前端·架构·github
happyprince12 小时前
2026年02月07日热门github项目
github
全栈工程师修炼指南12 小时前
Nginx | stream content 阶段:UDP 协议四层反向代理浅析与实践
运维·网络·网络协议·nginx·udp