Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Web服务器-Nginx负载均衡

Web服务器-Nginx负载均衡

作者头像
运维小路
发布于 2025-04-07 01:44:33
发布于 2025-04-07 01:44:33
25500
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一大章介绍了Kubernetes的知识,本章节我们进入中间件的讲解,这里会包含很多不同的类型组件,中间件的第一个大类我这里定义的是Web服务器。由于目前使用最广泛的Web服务器是Nginx,所以我们这里的讲解主要以Nginx服务器为主。

上2个小节,我们介绍了Nginx的核心功能反向代理。但是他的一个规则只能对应一个后端,如果后端有多个同样服务跑在多个服务器上,我们Nginx这里应该如何来配置,让他支持多个后端,并实现负载均衡功能呢?

负载均衡实现

我们这里用一台后端服务器启动2个同样的服务,采用不同的端口来代替2台服务器,然后前端使用Nginx来代理这2个服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server {
    listen 80;
    server_name 192.168.31.120;
    location / {
        proxy_pass http://backend_servers; 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
upstream backend_servers {
    server 192.168.31.121:8080;
    server 192.168.31.121:9090;
}

这里我们把代理的后端地址从一个具体的地址换成了我们定义的一个名字,然后在server同级的upstream模块里面定义后端的地址,这里只定义2个,实际可多个。默认情况下他他会把请求轮流转发到后端的2个服务。

负载均衡算法

如果不做任何配置的情况下就是轮询(轮流),依次向后端配置的服务转发请求。当然除了默认的轮询还有多种算法。

1. 加权轮询 (Weighted Round Robin)

  • 说明:按权重分配请求,权重越高分配越多。
  • 适用场景:服务器性能不均(如 CPU/内存差异)。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
upstream backend {
    server 192.168.1.101 weight=5;  # 50% 流量
    server 192.168.1.102 weight=3;  # 30% 流量
    server 192.168.1.103 weight=2;  # 20% 流量
}

2. 最少连接数 (Least Connections)

  • 说明:优先将请求分配给当前连接数最少的服务器。
  • 适用场景:长连接服务(如 WebSocket、数据库连接池)。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
upstream backend {
    least_conn;
    server 192.168.1.101;
    server 192.168.1.102;
}

3. IP 哈希 (IP Hash)

  • 说明:基于客户端 IP 计算哈希值固定分配到某台服务器。
  • 适用场景:需要会话保持的应用(如购物车、登录状态)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
upstream backend {
    ip_hash;
    server 192.168.1.101;
    server 192.168.1.102;
}

4. URI 哈希 (URI Hash) - 需第三方模块

  • 说明:根据请求 URI 分配流量,相同 URI 始终到同一服务器。
  • 适用场景:缓存优化(如 CDN 边缘节点)。
  • 配置(需编译安装 ngx_http_upstream_hash_module):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
upstream backend {
    hash $request_uri consistent;  # consistent 表示一致性哈希
    server 192.168.1.101;
    server 192.168.1.102;
}

健康检查逻辑

前面我们介绍他通过多种负载均衡算法转发到后端,但是后端的服务也可能出现异常,如果后端服务异常以后,Nginx还会把流量转发过去吗?默认我们只要配置负载均衡,他就会自动给我们添加健康检查,剔除不健康的节点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#默认值
max_fails  1
fail_timeout=10s
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
upstream backend {
    server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
}

正常状态

两个后端服务器 101102 均处于健康状态。Nginx 使用默认的轮询策略分发请求到这两个服务器。每个请求会交替发送到101 和 102所有请求均返回

2xx3xx 等正常状态码。失败计数器(max_fails)保持为 0

故障状态

假设 192.168.1.101 发生故障,触发条件:当请求发送到 101 时,Nginx 检测到以下情况之一:连接超时(如 TCP 握手失败)。服务器返回 5xx 错误码(如 500、502)。主动拒绝连接(如服务崩溃)。

计数器递增

每次失败(如超时或错误响应),101 的失败计数器 +1。关键规则:计数器仅在 fail_timeout=30s 时间窗口内累计。(例如:30 秒内连续失败 3 次,或 30 秒内累计失败 3 次)。

标记为不可用

如果 30秒 内累计失败达到 3次,Nginx 将 101 标记为 unavailable。标记后,Nginx 停止 向 101 发送新请求,持续 30秒(fail_timeout 的第二个作用)。

流量切换

所有请求会被转发到剩余的健康节点 102。用户可能观察到部分请求失败,但服务整体仍可用(因 102 仍正常)。

故障恢复阶段

30秒后:Nginx 尝试恢复 101自动探测:当 fail_timeout=30s 超时后,Nginx 会重新将 101 加入负载均衡池。隐式检查:Nginx 不会主动发送健康检查请求,而是在下一个客户端请求触发时尝试 101。恢复逻辑:下一个请求到达时,Nginx 会尝试将请求发送到 101。如果请求成功:101 的失败计数器 重置为 0。101 重新成为健康节点,参与后续的负载均衡。

如果请求再次失败

失败计数器 +1,重新进入故障判断流程。若在 30秒 内再次累计 3次 失败,101 会再次被标记为不可用 30秒。

以上流程是我以前的理解,但是经过我测试发现目前的版本(v1.20.1), 如果把其中一个服务关闭,则请求转发会失败,但是他会把请求重新转发到另外一个正常的节点,这样前端请求就感知不到后端异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
==> access.log <==
192.168.31.120 - - [03/Apr/2025:22:30:02 +0800] "GET / HTTP/1.1" 200 42 "-" "curl/7.29.0" "-"
192.168.31.120 - - [03/Apr/2025:22:30:04 +0800] "GET / HTTP/1.1" 200 42 "-" "curl/7.29.0" "-"
==> error.log <==
2025/04/03 22:30:06 [error] 2809#2809: *1005 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.31.120, server: 192.168.31.120, request: "GET / HTTP/1.1", upstream: "http://192.168.31.121:9090/", host: "192.168.31.120"
==> access.log <==
192.168.31.120 - - [03/Apr/2025:22:30:06 +0800] "GET / HTTP/1.1" 200 42 "-" "curl/7.29.0" "-"
192.168.31.120 - - [03/Apr/2025:22:30:08 +0800] "GET / HTTP/1.1" 200 42 "-" "curl/7.29.0" "-"

正常请求是每2秒,然后轮流转发给后端2台服务器,但是我们看到06秒的时候失败,然后06秒还有一次成功的记录(这次请求是重新转发刚刚失败的请求),这样前面的请求就感知不到后端失败。

如果你想要浮现上面的逻辑,可以显示添加参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location / {
  proxy_pass http://backend_servers;
  proxy_next_upstream error timeout;  # 禁用重试
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​『学习笔记』在 Nginx 中实现负载均衡的健康检查
🎈今日推荐——https://cloud.tencent.com/developer/article/2473585
数字扫地僧
2024/12/04
4180
Nginx负载均衡配置与负载策略
负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务。
全栈程序员站长
2022/07/08
1.1K0
nginx负载均衡的健康检查
如果服务器组内有机器出现问题,nginx就不再向其转发请求了,那么nginx如何知道某台服务器是否能正常? 这就需要nginx对每台服务器进行健康检查 检查的方式有两种 (1)被动检查 向服务器转发请求失败,或者没有接收到响应,nginx就认为其不可用,会停止一段时间不再向其转发 默认规则是,如果失败了一次,就停止转发10秒钟 失败次数和停发时间是可以设定的,例如 upstream backend { server backend1.example.com;
dys
2018/04/02
1.5K0
Nginx负载均衡中后端节点服务器健康检查的操作梳理
正常情况下,nginx做反向代理,如果后端节点服务器宕掉的话,nginx默认是不能把这台realserver踢出upstream负载集群的,所以还会有请求转发到后端的这台realserver上面,这样势必造成网站访问故障。虽然nginx可以在localtion中启用proxy_next_upstream来解决返回给用户的错误页面,如下: 例如公司的网站访问的时候全部变成404页面,最后发现是后端的一台服务器不可用,直接访问那台后台的服务器的时候,返回的是404页面,因为upstream 里面设置了ip_ha
洗尽了浮华
2018/01/23
4.8K0
Nginx学习之负载均衡
负载均衡 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 负载均衡,英文名称为Load Bal
小柒2012
2018/04/16
8610
Nginx学习之负载均衡
Nginx 负载均衡配置和策略
Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡。一个最简单的 upstream 写法如下:
双面人
2019/10/23
9260
CentOS7 Nginx的安装与http负载均衡配置
安装环境:4台Linux机,系统为CentOS 7.7。 Nginx版本:1.12.0
砒霜拌辣椒
2023/08/23
6540
CentOS7 Nginx的安装与http负载均衡配置
CentOS Linux安装nginx及负载均衡的配置
centos安装nginx 一、安装nginx 1、在nginx官方网站下载一个包nginx官方下载 2、WinSCP(ftp上传工具).exe FTP 上传工具上传达到CentOS中 3、我是先建一个目录,把要用的到的安装包放到一起. #mkdir /home/ #tar zxf nginx-1.4.1.tar.gz #cd nginx-1.4.1 4、安装pcre开发包 #yum install -y pcre-devel 5、如果安装出现在下面的错误是缺少编译环境。安装编译源码所需的工具和库 ./c
天策
2018/06/22
7830
nginx负载均衡的五种算法
每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。
全栈程序员站长
2022/11/04
3.1K0
Nginx负载均衡及配置
1 负载均衡概述     负载均衡由来是因为当一台服务器单位时间内的访问量很大时,此时服务器的压力也会很大,当超过自身承受能力时,服务器就会崩溃.为避免让服务器崩溃,用户拥有更好的体验,就诞生了负载均衡来分担服务器压力.     负载均衡实质上就是用反向代理的原理实现的,是一种优化服务器资源,合理处理高并发的一种技术,能够平衡个服务器的压力,减少用户请求等待时间,并确保容错.一般采用nginx作为一种高效的HTTP负载均衡服务器,将流量分配到多个应用服务器上以提高性能,可扩展和高可用性.     原理: 内网可以建很多服务器,组成服务器集群,当用户访问该网站时,先访问公网中间服务器,中间服务器根据算法合理分配到内网服务器,分担服务器的压力,因此户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
星哥玩云
2022/07/13
2.3K0
Nginx负载均衡配置误区
之前有很多朋友问关于Nginx的upstream模块中max_fails及fail_timeout,这两个指令,分别是配置关于负载均衡过程中,对于上游(后端)服务器的失败尝试次数和不可用时间,很多人不是很理解这两个参数到底怎么用,以及具体的含义
李俊鹏
2021/03/17
1.3K0
Nginx负载均衡详解
下面将介绍Nginx开源版内置的4种负载均衡策略和2种三方负载均衡策略,他们分别是:
星哥玩云
2022/08/08
8730
Haproxy和Nginx负载均衡测试效果对比记录
为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析。 下面说下这两种负载均衡环境下抓包分析后的结果: 1)Haproxy负载均衡环境下的实验记录。后端有一台机器挂掉后,如果还没达到探测的时间点时,请求还会往挂掉的这台机器转发,请求会丢失。 Haproxy负载均衡的实验记录如下: 1--先看下Haproxy的配置。 配置inter 20000为20s检测一次,这个是为了更明显的抓下HAPr
洗尽了浮华
2018/01/23
1.6K0
Haproxy和Nginx负载均衡测试效果对比记录
Nginx设置域名转发到服务器指定的端口
创建端口代理配置文件(域名地址如:xx.baidu.com , 转发地址如:127.0.0.1:8080)
知识浅谈
2024/01/16
1.8K0
Nginx设置域名转发到服务器指定的端口
深入剖析Nginx负载均衡算法
负载均衡是Nginx的核心应用场景,本文将介绍官方提供的5种负载均衡算法及其实现细节。
陶辉
2023/10/18
9230
深入剖析Nginx负载均衡算法
学完Nginx/OpenResty详解,反向代理与负载均衡配置,能涨薪多少
接下来介绍Nginx的重要功能:反向代理+负载均衡。单体Nginx的性能虽然不错,但也是有瓶颈的。打个比方:用户请求发起一个请求,网站显示的图片量比较大,如果这个时候有大量用户同时访问,全部的工作量都集中到了一台服务器上,服务器不负重压,可能就崩溃了。高并发场景下,自然需要多台服务器进行集群,既能防止单个节点崩溃导致平台无法使用,又能提高一些效率。一般来说,Nginx完成10万多用户同时访问,程序就相对容易崩溃。
愿天堂没有BUG
2022/10/28
2.5K0
学完Nginx/OpenResty详解,反向代理与负载均衡配置,能涨薪多少
nginx实现负载均衡的原理及策略
负载均衡在服务端开发中算是一个比较重要的特性。因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就可以分发给后台服务端(backend servers, 后面简称backend)来做复杂的计算、处理和响应,并且在业务量增加的时候可以方便地扩容后台服务器。
菲宇
2019/06/12
1.9K0
nginx实现负载均衡的原理及策略
『学习笔记』Nginx 作为 API 网关的配置与使用
🎈今日推荐——https://cloud.tencent.com/developer/article/2473731
数字扫地僧
2024/12/05
7300
『学习笔记』Nginx 作为 API 网关的配置与使用
Nginx学习笔记(一)功能和负载均衡
就目前来说nginx已经是计算机系统的必备组件了。主要的作用有静态资源代理、反向服务代理,负载均衡,虚拟主机,fastcgi等。
写一点笔记
2022/08/11
2890
05 . Nginx的反向代理与负载均衡
Nginx负载均衡 客户端的访问都被代理到后端的一台服务器上,最终会出现性能瓶颈,从而导致效率降低,前端用户的访问速度急速下降,要解决这个问题就需要添加多台httpd,同时承受大量并发连接,每台服务器接收的并发连接降低了,效率就高了,nginx作为代理,在收到客户端的请求时,会分发到不同的后端服务器,但是nginx收到请求之后会分配到那个服务器之上,有什么规律和需求,就需要用调度算法来分配. upstream语法 # upstream的定义必须在server{..}外定义 upstream <组名
iginkgo18
2020/09/27
8820
相关推荐
​『学习笔记』在 Nginx 中实现负载均衡的健康检查
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验