Nginx upstream

在这里插入图片描述

什么是Nginx upstream?

Nginx 模块一般分为三大类:handler、filter和upstream。
利用 handler、filter 这两个模块,可以使 Nginx 轻松完成任何单机工作。

upstream 模块将使 Nginx 跨越单机的限制,完成网络数据的接收、处理和转发 。

数据转发功能为 Nginx 提供了跨越单机的横向处理能力,使得 Nginx 摆脱了只能为终端节点提供单一功能的限制,而使它具备了网络应用级别的拆分、封装和整合的战略功能。

ngx_http_upstream_module 模块

ngx_http_upstream_module模块 用来定义 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass 和 grpc_pass 指令引用的一组服务器。这组服务器可以用来做负载均衡,提高服务器的高可用性
我们在配置时主要配置服务器组和调度算法

负载均衡算法

# http contextupstream backend_hosts {server host1.example.com;server host2.example.com;server host3.example.com;
}server {listen 80;server_name example.com;location /proxy-me {proxy_pass http://backend_hosts;}
}

以上,我们配置了一组名为backend_hosts的服务器组。这组服务器组名被定义后,名称将被当做常规域名在 proxy_pass 中使用。
在例子中,example.com/proxy-me 发起的请求都会被转发到上面定义的服务器组中。默认情况下,每个请求会一次从上到下路由到不同的主机。

选择合适的负载均衡算法
upstream 模块提供了四种算法可供选择:

  1. round robin:默认的负载均衡算法。如果服务器组未定义负载均衡算法,将会用轮询的方式将请求路由到服务器组中的主机。
  2. least_conn:该算法会把新请求路由到具有最少活动连接的后端主机中,同时考虑服务器的权重。如果有多个这样的服务器,则会尝试使用加权轮询平衡算法。
  3. ip_hash:根据客户端IP在服务器组中分配请求。该算法保证来自统一客户端的请求将始终传递到同一服务器,除非该服务器不可用。
  4. hash:为 client-server 映射一个基于散列值的服务器组,可以包含文本、变量或者他们的组合。如果从服务器组中新增或删除服务器,可能会导致大量 key 重新映射

例:

upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com **down**;server backend4.example.com;
}

常用参数

  • weight=number 设置服务器的权重,默认为1
  • max_conns=number 限制到代理服务器的同时活动连接的最大值。默认为0,无限制。如果服务器组不驻留在共享内存中,则该限制适用于每个工作进程。
  • max_fails=number 表示失败几次,则标记server已宕机,剔除上游服务。
  • fail_timeout=time 表示失败的重试时间。默认值是 10 秒
  • backup 表示备用服务器

健康检查

Nginx 默认判断失败节点状态以 connect refusetime out 状态为准,不以 HTTP 错误状态进行判断失败 。因为HTTP只要能返回状态说明该节点还可以正常连接,所以nginx判断其还是存活状态;

除非添加了proxy_next_upstream指令设置对404、502、503、504、500和time out等错误进行转到备机处理,在next_upstream过程中,会对fails进行累加,如果备用机处理还是错误则直接返回错误信息(但404不进行记录到错误数,如果不配置错误状态也不对其进行错误状态记录)

综述,nginx记录错误数量只记录timeout 、connect refuse、502、500、503、504这6种状态,timeout和connect refuse是永远被记录错误状态。
502、500、503、504只有在配置proxy_next_upstream后nginx才会记录这4种HTTP错误到fails中,当fails大于等于max_fails时,则该节点失效

nginx 处理节点失效和恢复的触发条件

  • 失效:nginx可以通过设置max_fails(最大尝试失败次数)和fail_timeout(失效时间,在到达最大尝试失败次数后,在fail_timeout的时间范围内节点被置为失效,除非所有节点都失效,否则该时间内,节点不进行恢复)对节点失败的尝试次数和失效时间进行设置,
  • 恢复:当超过最大尝试次数或失效时间未超过配置失效时间,则nginx会对节点状会置为失效状态,nginx不对该后端进行连接,直到超过失效时间或者所有节点都失效后,该节点重新置为有效,重新探测;

所有节点失效后nginx将重新恢复所有节点进行探测:
如果探测所有节点均失效,备机也为失效时,那么nginx会对所有节点恢复为有效,重新尝试探测有效节点,如果探测到有效节点则返回正确节点内容,如果还是全部错误,那么继续探测下去,
当没有正确信息时,节点失效时默认返回状态为502,但是下次访问节点时会继续探测正确节点,直到找到正确的为止。

被动检查

Nginx 的 upstream 模块会实现所谓的被动健康检查,也就是利用 max_fails 机制来实现:
如果请求后端 upstream peer 出现一些错误,当错误的累计次数达到 max_fails,那么该 upstream peer 会被 Nginx 摘掉 fail_timeout 时间,在这个时间内,这个 upstream peer 节点禁止对外提供服务。

需要重点注意的是 fails 是一个区间内失败的累加值,也就是在 fail_timeout 的这个时间区间内,两个错误之间即使有成功的请求,fails 也依然会进行累加计算

  • 如果在 T0 时刻出现了一个错误,那么 fails = 1;
  • 在 T0 ~ T0 + fail_timeout 的时间区间内:
    • 如果没有出现错误,那么 fails 会重置为 0;
    • 如果出现了一个新错误,比如在 T1 时刻出现一个新的错误,那么 fails 会继续累加,fails = 2
  • 接着会重新以新的时间区间 T1 ~ T1 + fail_timeout 开始统计但是 fails 值却是继续累加,如果这个时间区间又有一个新的错误,那么 fails = 3
  • 直到 T2 时刻,出现了新的错误并 fails >= max_fails,那么 peer 节点会被摘除,在 T2 ~ T2 + fail_timeout 这个时间内,节点就无法对外提供服务,并且重置 fails 为 0,然后开启新的一轮检测
主动检查(未测试)
nginx_upstream_check_module模块(淘宝技术团队开发)

检测后方realserver的健康状态,如果后端服务器不可用,则会将其踢出upstream,所有的请求不转发到这台服务器;当恢复正常时,将其加入upstream

upstream test1 {server 192.168.134.154:80;server 192.168.134.153:80;server 192.168.134.152:80;#每隔5秒检测一次,请求2次正常则标记 realserver状态为up,如果检测5次都失败,则标记 realserver的状态为down,超时时间为1秒,使用http协议。check interval=5000 rise=2 fall=5 timeout=1000 type=http;check_http_send"HEAD / HTTP/1.0\r\n\r\n";check_http_expect_alive http_2xx http_3xx;
}

配置示例

# http contextupstream backend_hosts {server host1.example.com;server host2.example.com;server host3.example.com;
}server {listen 80;server_name example.com;location /proxy-me {proxy_pass http://backend_hosts;}
}

也可以参考192.168.0.135服务器上Nginx的配置

参考

Module ngx_http_upstream_module (nginx.org)
upstream模块 — Nginx开发从入门到精通 (taobao.org)
NGINX — Upstream Module (Part 01) | by Nethmini Romina | FAUN Publication
Understanding Nginx HTTP Proxying, Load Balancing, Buffering, and Caching | DigitalOcean
Nginx 实战系列之四:upstream 的 max_fails 和 fail_timeout 指标和实战经验 - 知乎 (zhihu.com)
Nginx–upstream健康检查 - 心恩惠动 - 博客园 (cnblogs.com)
nginx安装nginx_upstream_check_module模块实现业务平滑转移_三颗草丶的博客-CSDN博客
Nginx之负载均衡upstream模块简介和使用_nginx upstream_普通网友的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数学二】常微分方程-一阶微分方程

考试要求 1、了解微分方程及其阶、解、通解、初始条件和特解等概念. 2、掌握变量可分离的微分方程及一-阶线性微分方程的解法,会解齐次微分方程. 3、会用降阶法解下列形式的微分方程: y ( n ) f ( x ) , y ′ ′ f ( x , y ′ ) y^{(n)}f(x),y^{}f(x,y^{}) y(n)f(x),y′′f(…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23目录1. Advancements in Visual Language Models for Remote Sensing: Datasets, Capabilities, and Enhancement Techniques摘…

git restore恢复删除文件

新版本 在 Git 2.23 版本之后,Git 引入了一个新的命令 git restore,用于简化文件恢复操作。可以用 git restore 来恢复误删除的文件。下面是详细的使用方法: 1. 恢复工作区中删除的文件(未提交) 如果文件已被删除&a…

对角双差速轮AGV平移、直行、转弯、原地旋转案例

在对角两对双差速轮 AGV(自动导引车)中,车辆配置了两对差速轮,分别安装在左前(Front Left,FL)和右后(Rear Right,RR)。这种配置使得 AGV 具有较高的机动性,可以实现平移、直行、转弯和原地旋转等复杂运动 2. 运动学模型 2.1 定义变量 车辆参数: r:车轮半径(米…

flask服务通过gunicorn启动

使用 Gunicorn 启动 Flask 服务通常可以提升 Flask 应用的性能。以下是通过 Gunicorn 启动 Flask 服务的步骤: 1. 安装依赖 首先,确保已安装 Flask 和 Gunicorn: pip install flask gunicorn2. 创建 Flask 应用 创建一个简单的 Flask 应用…

IPV6扩展头部

IPv6扩展头部(Extension Header)是一种用于在IPv6数据包中添加额外信息和功能的结构。与IPv4相比,IPv6的头部设计简化了基本头部,使其更灵活。扩展头部用于提供各种功能,如路由、分片、流量控制等。扩展头部的使用使得…

安全知识见闻-网络安全热门证书

一、OSCP(Offensive Security Certified Professional) 1. 证书介绍 2.考点 3.部分考试要求 4.练习方法 二、OSEP(Offensive Security Exploit Developer) 1.证书介绍 2.考点 3.练习方法 三、CISSP(Certified lnformation Systems Security Professional&a…

技术成神之路:二十三种设计模式(导航页)

设计原则/模式链接面向对象的六大设计原则技术成神之路:面向对象的六大设计原则创建型模式单例模式建造者模式原型模式工厂方法模式抽象工厂模式行为型模式策略模式状态模式责任链模式观察者模式备忘录模式迭代器模式模板方法模式访问者模式中介者模式命令模式解释器…

【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)

配置Python环境 没有root权限服务器上有多个python环境但没有自己想要的怎么办 之前跑别的实验的时候改过指定的python3.7版本,但是居然我过了一段时间之后,再次打开,python版本居然又回到2.7(服务器/usr/下的默认python版本&am…

什么是AI神经网络?

文章目录 神经网络的基本概念如何工作?训练过程应用实例未来展望推荐阅读文章 在当今的科技时代,人工智能(AI)已经深入到我们生活的各个方面,而神经网络则是推动这一发展的重要技术之一。无论是在图像识别、自然语言处…

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二 Zig 语言是一种新的系统编程语言,其生态位类同与 C,是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust,尤其是在开发过程中无穷无尽抛错的过程&#x…

高等数学-宋浩版2.0-映射

映射:X,Y为非空集合,存在法则F,对X(原像)中每个元素X,按法则F,在Y中有唯一元素与之对应,F为x到Y(镜像)的映射。f:X->Y X原像,Y像,x定义域,Df,Rf &#x…

Mac book英特尔系列?M系列?两者有什么区别呢

众所周知,Mac book有M系列,搭载的是苹果自研的M芯片,也有着英特尔系列,搭载的是英特尔的处理器,虽然从 2020 年开始,苹果公司逐步推出了自家研发的 M 系列芯片,并逐渐将 MacBook 产品线过渡到 M…

python之多任务爬虫——线程、进程、协程的介绍与使用(16)

文章目录 1、什么是多任务?1.1 进程和线程的概念1.2 多线程与多进程的区别1.3 并发和并行2、python中的全局解释器锁3、多线程执行机制4、python中实现多线程(threading模块)4.1 模块介绍4.2 模块的使用5、python实现多进行程(Multiprocessing模块)5.1 导入模块5.2 模块的…

Caffeine本地缓存框架

Caffeine本地缓存框架 hi,我是阿昌,今天记录一下Java最强本地缓存Caffeine 1、缓存介绍 缓存(Cache),在软件无处不在。从底层CPU多级缓存,再到客户页面缓存,和服务器数据缓存,导出都存在着缓存的身影&am…

【Nas】X-DOC:Mac mini 安装 ZeroTier 并替换 planet 实现内网穿透

【Nas】X-DOC:Mac mini 安装 ZeroTier 并替换 planet 实现内网穿透 1、下载客户端 ZeroTier One2、安装过程3、更换planet备份原planet4、重启服务5、加入网络6、NAT内网穿透 1、下载客户端 ZeroTier One https://www.zerotier.com/download/ 选择 MacOS 适用版本&…

设计模式: Pimpl(Pointer to Implementation)

这种设计模式通常被称为 Pimpl(Pointer to Implementation)惯用法,有时也被称为 Cheshire Cat 惯用法。它主要用于隐藏实现细节和减少编译依赖。 例子: DatabaseConnection.h #ifndef DATABASE_CONNECTION_H #define DATABASE_…

Next.js + Prisma + Auth.js 实现完整的认证方案

前言 在现代 Web 应用中,用户认证是一个基础且重要的功能。本文将介绍如何使用 Next.js Prisma Auth.js 实现一个完整的认证方案。这个方案既安全又灵活,能满足大多数项目需求。 技术栈选择 • Next.js: React 全栈框架,提供了服务端渲染和 API 路由• Prisma: 现代数据库…

SQL Server动态列转行

SQL Server 2017及以上版本 STRING_AGG 确实,STRING_AGG 是 SQL Server 2017 (版本 14.x) 及更高版本中引入的一个聚合函数,它允许你将多个行的值组合成一个字符串,并且你可以指定一个分隔符来分隔这些值。由于你正在使用 SQL Server 2014&…

岭回归的MATLAB步骤

MATLAB 实现框架,它涵盖了从数据导入到岭回归的步骤,包括计算共线性、使用 MAE、MSE、R、MAPE 进行评价,以及绘制相应的可视化图表。 1. 数据导入 首先,导入你的 Excel 文件 data.xlsx。假设前面的列是因变量(特征&a…