Nginx负载均衡原理

article/2025/10/10 11:50:57

Nginx简介

Nginx是通过反向代理实现的负载均衡。

什么是正向代理与反向代理?

正向代理就是,客户端通过一台代理服务器访问服务端。
反向代理就是,服务端通过代理服务器为客户端提供服务。

看起来似乎没有什么区别,举个例子。
正向代理:当我们访问google.com,是无法直接访问的,因为被墙,因而我们需要先访问一台代理服务器(VPN),告诉它我们要访问google.com,代理服务器会访问google.com,并将访问的结果返回给我们。
反向代理:服务器想要提供服务给客户,但是没法直接面对客户,就需要一台代理服务器。让客户直接访问代理服务器,代理服务器将请求发给自己,然后自己处理请求,返回结果给代理服务器,再返回给客户。

看似两者是一样的,但是一个是客户的需求,一个是服务端的需求。使用代理服务器的主体不同。

Nginx内核与模块划分

内核

其设计非常微小和简洁,完成的工作也非常简单。仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用例URL匹配),而在这个location中所配置的每个指令将会启动不同的模块取完成相应的工作。

从结构上划分:

  1. 核心模块:HTTP模块、EVENT模块和MAIL模块。
  2. 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块。
  3. 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

从功能上划分

  1. Core(核心模块):构建nginx基础服务、管理其他模块。
  2. Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
  3. Filters (过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
  4. Proxies (代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx模块处理流程

模块处理流程大致如下:

  1. 收到HTTP请求。
  2. Nginx基于配置文件中的位置选择一个合适的处理模块(Handlers)。
  3. Handlers模块需要把请求反向代理到后端服务器,就需要就变成另外一类的模块:load-balancers(负载均衡模块)。
  4. 负载均衡模块的配置中有一组后端服务器,当一个HTTP请求过来时,它决定哪台服务器应当获得这个请求。
  5. 处理完成后,filters(过滤模块)将被调用。每个请求都可以被压缩成块,依次经过多个filters(过滤模块)过。它们的执行顺序在编译时决定。过滤模块链以流水线的方式高效率地向客户端发送响应信息。每个filters(过滤模块)不会等上一个filters(过滤模块)全部完成,就像是流水线一样。
  6. 最后把响应发给客户端。

如下图,展示了Nginx模块常规的HTTP请求和响应过程:
在这里插入图片描述
Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。

通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。

Nginx负载均衡的几种算法

目前nginx提供3种自带的负载均衡,还有2种常用的第三方策略。

  1. 安装轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低,但缺点是:可靠性低和负载分配不均衡。
  2. 权重:指定轮询几率,weight和访问比例成正比,用于后端服务器性能不均的情况。如下图,8080和8081分别占90%和10%。
    在这里插入图片描述
  3. ip_hash:上面2种方式都有一个问题,就是下一个请求来的时候,请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用session保存数据),这个时候,就有一个很大的问题,比如把登录信息保存到了session中,那么跳转到另外一个服务器的时候就需要重新登录了,所以很多时候,我们只需要一个客户只访问一个服务器,那么就需要用到iphash。iphash的每个请求按访问ip的hash结果分配,这个每个访客访问一个后端服务器,可以解决session问题。
    在这里插入图片描述
  4. fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
  5. url_hash(第三方):按访问URL的hash结果进行分配请求,使每个URL定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用hash算法。

Nginx处理请求

Nginx在启动时会以daemon形式在后台运行,采用多进程+异步非阻塞IO事件模型来处理各种连接请求。

多进程模型

多进程模型包括一个master进程,多个worker进程,一般worker进程个数是根据服务器CPU核数来决定的。master进程负责管理Nginx本身和其他worker进程。

在这里插入图片描述
从上图中可以很明显地看到,4个worker进程的父进程都是master进程,表明worker进程都是从父进程fork出来的,并且父进程的ppid为1,表示其为daemon进程。

Master进程的作用是?

读取并验证配置文件nginx.conf;管理worker进程,包括:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

Worker进程的作用是?

处理基本的网络事件,在nginx多进程中,每个worker都是平等的,因此每个进程处理外部请求的机会权重都是一致的。

每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。

一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。

多进程模型的优点

  1. 对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销。
  2. 采用独立的进程,可以让worker互相之间不会影响,一个worker退出后,其它worker还在工作,服务不会中断,master进程则很快启动新的worker进程。

异步非阻塞IO事件模型

nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的。

Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。

和Java的NIO类似。

Nginx如何做到热部署

所谓热部署,就是配置文件nginx.conf修改后,不需要stop Nginx,不需要中断请求,就能让配置文件生效!(nginx -s reload 重新加载/nginx -t检查配置/nginx -s stop)

通过上文我们已经知道worker进程负责处理具体的请求,那么如果想达到热部署的效果,有两种方法:

  1. 方案一,修改配置文件nginx.conf后,主进程master负责推送给woker进程更新配置信息,woker进程收到信息后,更新进程内部的线程信息。
  2. 方案二,修改配置文件nginx.conf后,重新生成新的worker进程,当然会以新的配置进行处理请求,而且新的请求必须都交给新的worker进程,至于老的worker进程,等把那些以前的请求处理完毕后,kill掉即可。

Nginx采用的就是方案二来达到热部署的!

Nginx挂了怎么办?

Nginx既然作为入口网关,很重要,如果出现单点问题,显然是不可接受的。

答案是:Keepalived+Nginx实现高可用。

Keepalived是一个高可用解决方案,主要是用来防止服务器单点发生故障,可以通过和Nginx配合来实现Web服务的高可用。(其实,Keepalived不仅仅可以和Nginx配合,还可以和很多其他服务配合)

Keepalived+Nginx实现高可用的思路:

  1. 请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)。
  2. Keepalived应该能监控Nginx的生命状态,提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换。

在这里插入图片描述

链接:https://www.jianshu.com/p/6215e5d24553
https://www.cnblogs.com/fancy-yeah/p/9120240.html


http://chatgpt.dhexx.cn/article/l3GYKGOG.shtml

相关文章

负载均衡原理及算法

目录 背景概述原理分类按照软硬件分类硬件负载均衡软件负载均衡 按照地理结构分类本地负载均衡全局负载均衡 按照实现技术DNS负载均衡IP负载均衡链路层负载均衡混合型负载均衡 按照OSI层次二层负载均衡(数据链路层)三层负载均衡(网络层&#…

Ribbon负载均衡原理

Ribbon restTemplate相结合实现负载均衡,具体原理图详见以下截图: LoadBalancerClient 类执行具体的负载均衡,其继承于 LoadBalancerBase。LoadBalancerInterceptor 中注入了 LoadBalancerClient 对象,LoadBalancerClient执行具…

什么是负载均衡,负载均衡的原理解析是怎么样的

负载均衡对于很多大型企业来说,不管网游,商城,金融等业务,他的重要性无需多说,今天带来负载均衡的原理解析。 开头先理解一下所谓的“均衡”。 不能狭义地理解为分配给所有实际服务器一样多的工作量,因为…

负载均衡工作原理详解

负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。 均衡负…

负载均衡原理及实现

什么是负载均衡? 负载均衡( LoadBalance ),顾名思义就是把任务压力进行平衡的分摊到集群中各个操作单元(或机器)上,使得避免集群中部分机器压力过大而部分机器过于空闲。经过负载均衡,使得每个机器获取适合自己的处理能力负载。 …

Android 获取手机已安装的应用列表(适配)

权限 <uses-permissionandroid:name"android.permission.QUERY_ALL_PACKAGES"tools:ignore"QueryAllPackagesPermission" /> 加上权限才能获取到所有的应用 获取代码 public static boolean hasApplication(Context context, String packageName) …

如何在没有微软商店的情况下在Windows 10上安装应用程序

如何在没有微软商店的情况下在Windows 10上安装应用程序 通过微软商店&#xff0c;你可以轻松地在Windows 10设备上安装应用程序&#xff0c;就像使用Google Play或AppleStore一样。IT部门经常从设备上删除微软商店&#xff0c;或设置组策略禁用Windows更新&#xff0c;以防止…

“打开文件所在位置“失败,提示“该文件没有与之关联的应用来执行操作。请安装应用,若已经安装应用...““

问题点:装了某个软件,卸载后出现"打开文件所在位置"失败,出现以下提示: 该文件没有与之关联的应用来执行操作。请安装应用&#xff0c;若已经安装应用&#xff0c;请在“默认应用设置"页面中创建关联 解决办法: 打开注册表,找到HKEY_CLASSES_ROOT\Folder\shell,…

Win 11 打开未知文件/打开方式 该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置”页面中创建关联。

问题 鼠标右键选中文件 - 打开方式&#xff0c;或者选择其他应用 弹窗提示&#xff1a; 该文件没有与之关联的应用来执行该操作。请安装应用&#xff0c;若已经安装应用&#xff0c;请在“默认应用设置”页面中创建关联。 打开注册表&#xff0c;查看是否存在以下路径 HKEY_C…

该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置“页面中创建关联

在任意文件上鼠标右键&#xff0c;选择打开方式或者选择其他应用时报错“该文件没有与之关联的应用来执行该操作。请安装应用&#xff0c;若已经安装应用&#xff0c;请在"默认应用设置"页面中创建关联”&#xff0c;错误现象如下&#xff1a; 打开注册表&#xf…

安装软件程序

包管理基础 在深入了解Linux软件包管理之前&#xff0c;本章将先介绍一些基础知识。各种主流Linux发行版都采用了某种形式的包管理系统来控制软件和库的安装。 PMS利用一个数据库来记录各种相关内容&#xff1a;  Linux系统上已安装了什么软件包&#xff1b;  每个包安装了…

android 获取已安装应用(App)列表

效果图 获取手机上已安装应用列表&#xff0c;将获取到的信息用集合返回&#xff0c;可以自己定义是否过滤系统应用&#xff0c;Appinfo是一个实体类&#xff0c;包含应用的名称 包名 图标icon等等 /*** 获取手机已安装应用列表* param ctx* param isFilterSystem 是否过滤系统…

应用程序安装流程

https://maoao530.github.io/2017/01/18/package-install/ 本文介绍APK的安装流程。 一、安装流程图 APK安装流程&#xff0c;总体可以下图流程&#xff0c;用ProcessOn画的&#xff0c;凑合看&#xff1a; 从上图我们可以看到apk安装到最后都会调用到这个flow&#xff1a; PM…

app 安装方式

APK的安装方式主要有以下几种&#xff1a; 通过adb命令安装&#xff1a;adb 命令包括adb push/install用户下载的Apk&#xff0c;通过系统安装器PackageInstaller安装该Apk。PackageInstaller是系统内置的应用程序&#xff0c;用于安装和卸载应用程序。系统开机时安装系统应用…

安卓手机怎样安装apk应用

以华为手机为例 首先手机要关闭纯净模式&#xff0c;方法&#xff1a; 设置–系统和更新–纯净模式–关闭 然后下载/接收apk文件 &#xff08;如果是从浏览器下载的&#xff0c;可以直接安装&#xff0c;如果是从其他渠道下载&#xff0c;则安装方法如下&#xff09; 打开手机…

大体了解Android应用安装过程及原理

Android应用安装的流程及路径&#xff1a; 应用安装涉及到如下几个目录&#xff1a; system/app 系统自带的应用程序&#xff0c;无法删除 data/app 用户程序安装的目录&#xff0c;有删除权限。安装时把apk文件复制到此目录 data/data …

[笔记] 应用安装过程梳理

一、概述 1、四种应用安装场景 (1)系统自安装:每次开机启动时,都会预安装系统自带的APK文件,没有安装界面; (2)应用市场安装:从小米应用商店(com.xiaomi.market)、Google Play(com.android.vending)等,下载 APK 后,自动安装; (3)adb命令安装:使用 adb 工具…

如何在win10+VS2017环境下新建一个简单的WDF示例程序

上一课我们在win10系统VS2017开发环境下搭建了WDK驱动程序开发环境的搭建&#xff0c;详见我的博客【如何在win10VS2017环境下安装USB驱动开发套件WDK】&#xff0c;今天我们来尝试建立一个最简单的KDM示例工程。 提前说明&#xff1a;本博客所建立的示例工程的源码&#xff0…

WDF驱动安装方法

WDF驱动的安装方法: 编译好的SYS文件、INF文件、另外还需要一个WdfCoInstaller01009.dll文件&#xff0c;对应的WDK版本是7600.16385.1这个版本&#xff0c;其中WdfCoInstaller01009.dll文件位于“WDK安装目录” \redist\wdf\x86下,这个动态链接库文件是WDF驱动框架在安装时所必…

WRF模式

随着生态文明建设和“碳中和”战略的持续推进&#xff0c;我国及全球气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域&#xff08;生态、水资源、风资源及碳中和等问题&#xff09;的主要驱动因素&#xff0c;合理认知气候变化有利于解释生态环境变化机理及过…