Nginx实现负载均衡

张三开发了一个分享文学作品的网站,刚开始入驻的作者不多,可谓是人烟稀少。但入驻的作者们信念坚定,孜孜不倦地更新着自己的作品,功夫不负有心人,作品迎来了爆发式的阅读增长量,终于,大访问量使得应用服务器不堪重负,张三的网站开始频繁出现卡顿、无响应等故障。

为了分摊服务器的压力,张三扩充了服务器的数量,将压力分摊到多台服务器上,原本不堪重负的网站再次稳定,读者们又可以快乐地阅读了。

这个案例中,早期时候,网站的流量比较小,单台服务器足以满足业务需求,但随着不断地发展,网站流量越来越大,单台服务器的性能局限和单点故障的问题就凸显出来,因此需要扩展为多台服务器组成集群,既能解决单点故障,也可以提升网站的稳定性

正所谓一根筷子容易折,一把筷子难折断,这也是我们通常所说的水平扩展。与水平扩展相对应的是垂直扩展,垂直扩展意味着还是单台应用服务器,提升的是例如服务器的硬盘、内存以及CPU等的性能,一旦达到上限,性能就再与无法提升,这也是垂直扩展的局限性,同时,单点故障的问题还是存在。

因此,我们通常会采用水平扩展。

那么,在水平扩展为多台服务器之后,又怎么来进行请求的分发呢?

没错,负载均衡在这个时候登场。那么什么是负载均衡呢?

1.什么是负载均衡

负载均衡(Load Balance):这里的含义是指通过一定的算法将请求进行分发到不同的应用服务器上,以减少单台服务器的压力。

2.Nginx实现负载均衡

我们知道Nginx可以反向代理服务器,将请求代理到目标服务端,目标服务端仅仅是单台服务器,该服务器独自默默承受了所有的压力。

如下图所示:

就像我们前面的案例一样,随着业务的不断发展,单台服务器势必无法支持业务带来的负载,单台服务器水平扩展为多台服务器集群。

因此,Nginx在反向代理的基础上,添加了ngx_http_upstream_module模块,在反向代理的同时,能够根据一定的负载均衡算法就请求分发到集群中的不同服务器。

如下图所示:

言归正传,如何实现Nginx负载均衡呢?

先来看看官方给我们的示例:

文档地址:https://nginx.org/en/docs/http/ngx_http_upstream_module.html

upstream backend {
    server backend1.example.com      weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

上半部分upstream指令是负载均衡配置,下半部分server指令是我们熟悉的反向代理配置。因此,我们重点关注upstream指令。

是不是已经迫不及待地想要搞清楚upstream指令相关的操作啦。话不多说,走起。

2.1 upstream指令

该指令可以定义一个由多台被代理服务器组成的服务器组,作为这些服务器的统一入口,并且每台服务器都可以配置不同的端口,更加的灵活。

作用域:http

语法:upstream name { … }

并且,在默认情况下,采用加权轮询算法在服务器之间分配请求,有点雨露均沾的意思哈。😄

如果在与服务器通信的过程中发生错误,请求将会被传递到下一台服务器,依此类推,如果无法从任何一台服务器获得成功的响应,则客户端将接收到最后一台服务器返回的结果。

示例:

upstream backend {
    server backend1.example.com      weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

到这里我们已经搞清楚了upstream指令的含义,但是在其定义的块中多了像serverweightbackup这样的陌生指令。

古话说,心急吃不了热豆腐,客观别急,我们一一道来。

2.2 server指令

该指令定义被代理服务器的地址和其他的一些参数,例如weightbackup

作用域:upstream

语法:server address [parameters];

示例:

server backend1.example.com       weight=5;
server backend2.example.com:8080;

server backup1.example.com:8080   backup;
server backup2.example.com:8080   backup;

那么,我们可以定义哪些参数呢?各个参数的作用是什么?

2.2.1 weight

设置被代理服务器的权重,默认值为1。权重值越大,被访问的次数就越多。我们可以根据服务器的处理能力来设置权重值。

server backend1.example.com weight=1;

2.2.2 max_conns

限制被代理服务器的最大连接数,默认值为0,也就意味着没有限制。

server backend1.example.com  max_conns=0;

2.2.3 fail_timeout

当被代理服务器被认定为不可用时,设置其不可用时间。默认值为10s。

server backend1.example.com max_fails=3 fail_timeout=10;

2.2.4 max_fails

设置与被代理服务器通信失败后的最大重试次数,并与fail_timeout进行配合,认定服务器在该段时间内不可用。默认值为1,如果设置为0,则禁用重试。

server backend1.example.com max_fails=3 fail_timeout=10;

2.2.5 backup

将被代理服务器标记为备用服务器。当主服务器不可以用时,备用服务器才会上场。

🔔Tips:该参数不可与hash、ip_hash以及random负载均衡算法一起使用。

server backend1.example.com backup;

2.2.6 down

将指定的被代理服务器标记为不可用,不参与负载均衡过程。

server backend1.example.com backup down;

2.3 负载均衡策略

既然是负载均衡,那么肯定涉及到负载均衡的算法。

Nginx为我们支持多种负载均衡算法,例如加权轮询haship_hashleast_connleast_timerandom

下面我们来分别看看这些负载均衡算法。

2.3.1 加权轮询

这是Nginx的默认负载均衡算法。其在轮询的基础上加入了权重,前者是雨露均沾,后者是重点对象特殊照顾。

如果我们将所有被代理的服务器都设置为weight=1,也就是普通的轮询算法。

普通轮询:

upstream backend {
	server backend1.example.com weight=1;
	server backend2.example.com weight=1;
}

加权轮询:

upstream backend {
	server backend1.example.com weight=1;
	server backend2.example.com weight=5;
}

2.3.2 hash

语法:hash key [consistent];

hash算法,我们可以指定文本或者变量,如果指定文本,则意味着请求都会被传递到同一个服务器,因此,通常我们使用变量来进行hash。例如:

upstream backend {
	hash $request_uri;
	server backend1.example.com;
	server backend2.example.com;
}

这样就可以将同一个URI传递到同一个服务器。

🔔Tips:使用hash算法时,权重将失效。

2.3.3 ip_hash

该算法根据客户端的IP地址在被代理服务器之间分配请求,同时考虑权重。该算法会将同一客户端的请求始终传递到同一服务器。

upstream backend {
	ip_hash;
	server backend1.example.com weight=5;
	server backend2.example.com;
}

🔔Tips:在1.2.2和1.3.1版本之前,不支持指定权重。

2.3.4 least_conn

该算法将请求传递给具有最少活动连接数的服务器,同时考虑权重。

upstream backend {
	least_conn;
	server backend1.example.com weight=1;
	server backend2.example.com weight=5;
}

2.3.5 least_time

该算法将请求传递到平均响应时间和活动连接数最少的服务器,同时考虑权重。

语法:least_time header | last_byte [inflight];

  • header:意味着使用接收响应标头的时间。
  • last_byte:意味着使用接收完整响应的时间。
upstream backend {
	least_time last_byte;
	server backend1.example.com weight=1;
	server backend2.example.com weight=5;
}

🔔Tips:该算法目前只在商业订阅版提供。

2.3.6 random

该算法将请求传递给随机选择的服务器,同时考虑权重。

语法:random [two [method]];

two:可选参数,如果启用则随机选择两个被代理服务器,并使用least_conn的方法来选择其中一个。

method:指定选择方法,可选值为least_connleast_timeleast_time仅商业订阅版可用。

示例:

upstream backend {
	random two least_conn;
	server backend1.example.com weight=1;
	server backend2.example.com weight=5;
}

以上就是Nginx实现负载均衡的全部内容,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YooAsset | Unity资源管理方案

跳转官方仓库地址 一、说明 可空包、可首包DLC、可满足限制包体的需求、可玩家自己制作MOD上传到服务器、可分工程构建;支持内置渲染管线、可编程渲染管线;支持完整路径、可寻址资源定位;基于标签打包,自动分析冗余,基…

有效和无效的帮助中心区别在哪?如何设计有效的帮助中心?

帮助中心就是一个丰富的知识库,可以对企业的潜在客户进行引导。不仅能够提升用户的使用体验还能为企业塑造更加专业的品牌形象,在使用过程中为用户提供帮助。帮助中心的目的就是为了解决用户在使用过程中遇到的困难,同时为用户的使用提供引导…

《操作系统》——计算机系统概述

前言: 在之前的【Linux】学习中,我们已经对常见指令已经开发工具等进行了详细的了解。紧接着,我们将要学习的便是关于【Linux进程】的基本知识。但是为了帮助大家更好的理解相关的知识概念,我先带领大家来学习关于《操作系统》这…

Kali工具集简介

Kali Linux提供了数种经过定制的专门为渗透测试设计的工具。工具都会按下图中下拉选单所示的方式按组分类聚合。了解工具是做渗透测试第一个认知。 口Information Gathering(信息收集) 这些都是侦察工具,用来收集目标网络和设备的数据。在这类工具中,从找出设备的工具到查看使…

李薇:大模型时代的数据变革

Datawhale干货 作者:李薇,上海人工智能实验室 前言 今天,我将向那些希望深入了解大模型的同学们,分享一些关于大模型时代的数据变革的知识。作为上海人工智能实验室OpenDataLab的产品主管,我会介绍我们在开放数据和大…

Android9.0 Charles 模拟器抓包

目录 只想做条安静的咸鱼,混吃等死又一天 一、下载并安装配置Charles 二、下载安装Postern 三、测试抓包 一、下载并安装配置Charles 1.Charles下载网址👇 Charles Web Debugging Proxy • HTTP Monitor / HTTP Proxy / HTTPS & SSL Proxy / Rev…

Python命名空间和作用域

命名空间定义了在某个作用域内变量名和绑定值之间的对应关系,命名空间是键值对的集合,变量名与值是一一对应关系。作用域定义了命名空间中的变量能够在多大范围内起作用。 命名空间在python解释器中是以字典的形式存在的,是以一种可以看得见…

vue项目打包成桌面应用并修改图标

目录 1. 打包为桌面应用 2.修改图标 1. 打包为桌面应用 1.在vux项目的终端执行打包 npm run build 2.会在项目文件夹里面出现一个dist文件夹 里面有这几个文件组成 3.在这里需要添加一个 package.json 文件 package.json 内容 {"name": "鼠标放图标上面的提…

【Linux】进程控制(文件操作符收尾+重定向)

上一回进程与文件系统我们主要看了很多文件描述符的知识 1.如何理解一切皆文件? 每个设备被打开时,OS给每个文件创建一个自己的struct file 里面填充自己的属性以及自己的缓冲区,其中还有函数指针,里面保存函数地址,通…

股票量价关系基础知识3

成交量变化的表现形式 成交量变化的表现形式主要有以下几种 一、缩量 一般界定当日成交量低于前一交易日成交量10%以上为缩量。 缩量往往发生在上升途中的回调末期、上涨末期以及股价下跌的中后期。一般下跌趋势中的缩量阶段,往往意味着股价仍未见底,不能…

DOM事件模型与事件委托

事件 JS与HTML之间的交互通过事件实现。 事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。 可以使用监听器来预定事件,以便事件发生时执行相应的代码。这种在传统软件工程中被称为观察者模式 事件流 事件流描述的是从页面中接受事件的顺序 事件冒泡 微软…

程序员的下一个风口

面对近一年的裁员潮,以及 GPT 出现带来的 AI 颠覆潮流,各种话题出现:「前端已死」、「后端已死」、「Copy/Paste 程序员将被 AI 取代」。程序员行业是否还有发展空间? 这一两年的就业机会是因为经济衰落周期内造成的,不…

MATLAB 常用数学函数和数组和字符串、元胞数组和结构体,MATLAB 编程,关系运算符和逻辑变量

目录 MATLAB 零基础学习 简介 使用平台 一、MATLAB 界面 二、基础操作 使用方法 常用数学函数 初等函数 三角函数 指数和对数 复数 标点符号 常用操作 三、文件类型 数组 一、数组基础知识 二、数组创建与操作 创建 数组操作 字符串数组 字符串、元胞数组…

移动互联网市场是不需要Android 开发了吗?

就近有不少朋友在吐槽:如今Android工作真的难找!从年初找到了现在,是市场不需要Android 开发人才了,人都迷茫了,是不是应该考虑转行了? 其实这种情况往年也是有的,但是今年显得的更严重一些。我…

在数据化知识经济的时代,你该学会如何经营好自己的知识管理

在当今的数据化知识经济时代,知识管理已经越来越成为了一个必备的技能。在这个竞争激烈的时代,拥有良好的知识管理能力,可以帮助我们更好地应对各种挑战和机遇。 如何经营好自己的知识管理 一、认识知识管理的重要性 知识管理是指通过系统…

回溯法--N皇后问题

N皇后问题 一、问题描述二、示例2.1 四皇后的2个可行解2.2 过程图示 三、问题分析3.1涉及到的概念递归回溯 3.2 分析 四、 代码实现4.1 实现思路宏观:微观: 4.2 递归函数NS图4.3 代码 一、问题描述 1、按照国际象棋的规则,皇后可以攻击与之处…

腾讯面试经验,岗位是C++后端

分享一篇腾讯面经,岗位是C后端,考察的内容是C、Redis、网络。 c shared_ptr的原理 答:内部的共享数据和引用计数实现 补充: shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都…

OpenResty(Nginx)示例

Nginx Nginx概念: 聊到Nginx,先简单讲一下Nginx的基本概念 Nginx是一个高性能的、开源的 Web 服务器和反向代理服务器软件,由 Igor Sysoev 开发。它可以作为 HTTP 服务器使用,也可以作为负载均衡器、HTTP 缓存、反向代理和邮件代理等其他功…

公有云云硬盘(EBS)有效范围内扩容/存储规格变更指导手册

一、背景 某公有云环境中,云主机直连的云硬盘存储某数据库数据,随着数据的积累,大约10亿多条数据,云硬盘急需扩容,但前期规划云硬盘未开启lvm卷,且当前存储容量未达EBS容量限制,最大可达32T,因此决定采用EBS规格变更的方式来实现主机存储的扩容; 二、注意点: 1)过…

WebGIS支持国内各地方坐标系数据展示的方案

在我们的实际项目开发过程中,会存在着很多的客户提供的数据是地方坐标系的数据,这些数据通常是一些类似于地块数据,点位数据等等的矢量数据。如何加载这些数据可能会让大家有些头疼。我们这篇文章来给大家提供几种解决方案。 首先要清楚一个基础的地理学知识,那就是地理坐…