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,一经查实,立即删除!

相关文章

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

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

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…

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…

HBuilder X 中Vue.js基础使用2(三)

一、条件渲染 1、条件判断 v-if : 表达式返回真值时才被渲染 v-else :表达式返回为假时不被渲染 2、 分支条件判断 v-else-if :使用v-if , v-else-if 和 v-else 来表示其他的条件分支 3、显示隐藏 v-show v-show true 把节点显示 …

PortQry下载安装使用教程(超详细),Windows测试UDP端口

《网络安全自学教程》 PortQry是微软官方提供的一款TCP/IP连接「排障工具」,用来「检查」TCP/UDP「端口状态」。 平时检查端口状态,最常用的是telnet,但它是基于TCP协议的,无法检测「UDP端口」,这篇文章教大家如何在W…

Axure随机验证码高级交互

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:字母数字随机验证码高级交互 主要内容:4位字母数字随机验证码生成、错误提示与State状态同步 应用场景:登录验证码、其他类…

面试宝典(五):用三个线程按顺序循环打印123三个数字,比如123123123

要使用三个线程按顺序循环打印123三个数字,势必要控制线程的执行顺序,可以使用java.util.concurrent包中的Semaphore类来控制线程的执行顺序。 代码示例 import java.util.concurrent.Semaphore;public class SequentialPrinting123 {private static Se…

leetcode:34. 在排序数组中查找元素的第一个和最后一个位置(python3解法)

#1024程序员节 | 征文# 难度:中等 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(lo…

初识算法 · 前缀和(1)

目录 前言: 一维数组的前缀和 题目解析 算法原理 算法编写 二维数组的前缀和 题目解析 算法原理 算法编写 前言: ​本文的主题是前缀和,通过两道题目讲解,一道是一维数组的模板,一道是二维数组的模板。 链接…

【WebGIS实例】(18)MapboxGL 绘制矢量——线、面

前言 Mapbox GL JS 版本:3.6.0 该博客仅供学习参考,如果您是计划在实际项目中实现该功能,也推荐您直接使用已有的功能库: 官方案例:Draw a polygon and calculate its areamapbox-gl-draw:mapbox/mapbox-g…

基于Django+python的酒店客房入侵检测系统设计与实现

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

HTTPS讲解

前瞻 HTTP与HTTPS的关系 HTTPS也是一个在应用层的协议,是在HTTP协议基础上的一个加密解密层 明文 密文 秘钥 明文->秘钥 加密 秘钥->明文 解密 例如:明文为7 秘钥为2 7^21015; 5就是密文例子: 因为http的内容是明文传输的,明文…

危险物品图像分割系统:一键训练

危险物品图像分割系统源码&数据集分享 [yolov8-seg-GFPN&yolov8-seg-CSwinTransformer等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global…

LabVIEW共享变量通信故障

问题概述: 在LabVIEW项目中,使用IO服务器创建共享变量,并通过LabVIEW作为从站进行数据通信。通讯在最初运行时正常,但在经过一段时间或几个小时后,VI前面板出现错误输出,导致数据传输失败。虽然“分布式系统…

折扣影票接口对接渠道如何选择?

选择折扣影票接口对接渠道需要综合多方面因素考虑,以下是一些建议: 1.合法性和合规性: 确认供应商资质:优先选择具有相关票务经营资质的渠道。比如一些大型的在线票务平台,它们通常经过官方认证和监管,在…

[JAVAEE] 多线程的案例(二) - 阻塞队列 生产者消费者模型

目录 一. 什么是阻塞队列 二. java中的阻塞队列 三. 生产者消费者模型 3.1 生产者消费者模型与阻塞队列密不可分的关系 3.2 阻塞队列在生产者消费者模型的作用 a. 解耦合 b. 削峰填谷 四. 模拟实现阻塞队列 4.1 实现put方法 4.2 实现take方法 4.3 生产者消费者模型​…

了解C# 程序结构

本节我们将学习 C# 编程语言的结构,为了让大家能够对 C# 程序结构有个更好的理解,我们会先演示一个最小的、最简单的 C# 程序结构,以便作为接下来的章节的参考。 C# Hello World 实例 一个 C# 程序主要包括以下部分: 命名空间声明…

08 实战:色彩空间展示(本程序以视频为主)

程序效果如下: 我在这里讲解RGB和YCbCr的原理: 一、RGB颜色空间 1.1 基本概念 RGB颜色空间是一种最基础和常用的颜色表示方式,它基于人眼感知色彩的三原色原理。RGB分别代表: R(Red):红色G(Green):绿色B(Blue):蓝色通过这三种基本颜色的不同组合,可以产生人眼…