Nginx 的原理解析 worker 配置及相关问题 -细节狂魔

文章目录

  • 前言
  • Nginx 的最基本的执行过程(master & worker)
    • worker 是如何进行工作的
  • 一个 master 和 多个 woker 有哪些好处
      • 1、可以使用 nginx 热部署
      • 2、节省资源 && worker 进程之间互不影响 && nginx 服务不会中断
  • woker 设置多少才最好
    • 设置 worker 数量
  • worker 的连接数 worker_connection
    • 延伸问题
      • 1、当发送一个请求,占用了 worker 几个连接数
      • 2、1个 master,4个 worker的情况下,1个 nginx 能建立的最大连接数(最大并发量)是多少?

前言

本专栏文章的内容均来自于B站up主“尚硅谷”的教程视频。
博主的博客,你可以理解为是博主在做笔记,方便复习。
希望也可以帮到你们。


Nginx 的最基本的执行过程(master & worker)

在这里插入图片描述
通常我们对于 master 这个单词的理解是:雇主(管理员),表示 ““主” 的意思。
worker 这单词的理解:工作这,劳动者

我们可以这么去理解 Nginx :
   Nginx 在 linux 系统中,其实是有两个进程(master,worker)的。
我们可以通过查询nginx进程来验证我们的结论.
输入指令:ps -ef | grep nginx
在这里插入图片描述
我们可以发现:当 Nginx 运行的时候,nginx 有两个进程在运行,其就是 masterworker 进程。

通俗一点来说:
master 就相当于老板(雇主),worker 就是员工
雇主当然不会亲力亲为,要不然雇员工干什么?
master 起着 分配工作 的作用。
worker 起着 落实(完成)工作 的作用。
总结:master 给 worker 分配工作。
另外,worker是可以有多个的!只是现在是一个。


worker 是如何进行工作的

在这里插入图片描述

当 client(客户端)发送请求 到 Nginx 时,请求会先进入 master 中,由 master分配这个请求给其中的一个 worker 来执行
但是,我们知道:
  通常一个老板是有多个员工的。
那么这些 “员工” 又是这样拿到 “工作” 的呢?
这里运用的是 “争抢” 的机制。
简单来说:
  当 master 收到请求之后,会通知 worker 们,有活了!
worker们就会过来,谁抢到来做

这里提醒一下:Nginx 本身是不支持 Java 进行直接操作的!
所以,需要借助 Tomcat 来操作Java项目,完成请求任务。
因此,worker 也是需要配置请求转发 / 反向代理 的。


一个 master 和 多个 woker 有哪些好处

1、可以使用 nginx 热部署

指令:nginx -s reload
作用:
  与 IDEA 的热部署(热加载)的作用是一样的,当代码发生改变时,会自动重启项目。
也就是说,当使用热部署指令启动 nginx 服务之后,如果 nginx 配置发生改变,它 “ 自动重启 ” 服务。

注意!随之问题的到来:nginx 的服务能吗?
答案是不能!如果用户此时在进行对数据库操作的时,就会出现问题!

此时,多个 worker 的作用就体现出来了!
拿到任务的 worker 继续做着自己的事;
没拿到任务的 worker ,就会去加载(更新) nginx 最新配置
下一个请求的到来的时候,worker 们此时已是最新状态了。
当然,前面做任务的worker 执行完成之后,也会去加载 nginx 最新的配置文件。

这样,我们就可以在不影响用户使用的情况下,完成对 nginx 配置文件的更新


2、节省资源 && worker 进程之间互不影响 && nginx 服务不会中断

首先,对于每个 worker 进程 来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程 以及问题查找 时,也会方便很多。
其次,采用独立的进程,可以让互相之间不会影响
一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker进程,当然 worker 进程的异常退出,肯定是程序有bug了。
异常退出,会导致当前 worker 上的所有请求失败,不过不会影响所有请求,所以降低了风险


woker 设置多少才最好

Nginx 同 Redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式处理请求,即使千上万个请求也不再话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致,所以 worker 数服务器的cpu数 相等是最为适宜的,设了会浪费 cpu,设了会造成 cpu 频繁切换上下文带来的损耗

worker 数服务器的cpu数 相等
如果你的cpu是四核,那就设置4个 worker 最合适。


注意!如果你是 Windows 系统 安装 Nginx / Redis,它们就 没有 io 多路复用机制 了。
虽然功能能够正常使用,但是 无法将 cpu 的性能发挥到极致!
所以,一般都是安装在 Linux 系统上。


设置 worker 数量

1、打开 Nginx 配置文件:

2、定位到 events 块
【在 nginx.conf 文件中,找到 events 块,它位于 http 块之前】

3、设置 worker_processes 数量
在这里插入图片描述multi_accept on
  是一个事件配置指令,用于告诉 Nginx 工作进程在每次接受到一个新连接后,是否应该再次尝试接受更多的连接。
  默认情况下,当一个工作进程接受到一个连接后,它将停止接受新连接,直到当前连接被处理完毕。启用 multi_accept on 后,工作进程会在每次接受到一个连接后立即再次尝试接受其他连接,从而允许单个工作进程处理更多的并发连接
  这可以显著提高 Nginx 的并发处理能力,因为它允许单个工作进程最大化地利用其处理能力,而不需要等待当前连接处理完毕后再去接受新的连接

epoll
  是 Linux 平台上使用的一种高级事件通知机制,它是 select 和 poll 机制的增强版,主要用于处理高并发网络应用
  在 Nginx 中,use epoll 指令用于指定 Nginx 使用 epoll 作为其事件驱动模型。epoll 提供了比传统 select 和 poll 更好的性能尤其是在处理大量并发连接时。

  epoll 的工作原理是它将文件描述符(如套接字)分组到多个“兴趣列表”中,并根据文件描述符的状态来通知 Nginx 何时执行读取或写入操作。这种机制减少了系统调用的次数,从而提高了性能.


worker 的连接数 worker_connection

这个值表示每个 worker 进程所能建立连接的最大值.
所以,一个 nginx 能建立的最大连接数
worker_connections * worker_processes
【worker最大连接值   x   worker进程数量】

对于 http 请求 本地资源来说,能够支持的 最大并发数量是:worker_connections * worker_processes


如果是 支持 http1,1 的浏览器每次访问 要占两个连接,所以普通的静态访问最大并发数 是:worker_connections * worker_processes / 2

而如果是 HTTP 作为反向代理来说,最大并发量应该是:
worker_connections * worker_processes / 4
因为作为 反向代理服务器, 每个并发建立 会与 客户端的连接和后端服务器的连接,会占用两个连接


延伸问题

1、当发送一个请求,占用了 worker 几个连接数

答:不是 2个,就是 4 个

这么去理解: worker 接受请求,返回响应,这里就去了2个。
当该请求需要访问数据库,也就是借助 Tomcat 去完成请求,这里给 Tomcat 发送请求,接收 Tomcat 响应,就又会占用 2 个连接

总结:当访问静态 资源时(存储静态资源服务器上)时,占 2个 连接。
访问动态资源,借助 Tomcat(访问数据库 / 操作 Java 代码 )时,占用 4 个连接。


2、1个 master,4个 worker的情况下,1个 nginx 能建立的最大连接数(最大并发量)是多少?

假设 一个worker最大连接数是 1024 的情况下。
worker 的最大连接 数: 1024 * 4 = 4096
worker 的最大并发 数: 1024 * 4 / 2 = 2048   1024 * 4 / 4 = 1024

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

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

相关文章

简单美观易上手的 Docker Compose 可视化管理器 Dockge

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 Dockge 是 Uptime Kuma 作者的新作品,因此 UI 风格与 Uptime Kuma 基本一致,如果你正在使用 Uptime Kuma 的话,那么 Dockge 的 UI 设计应该也不会让你失望。Dockge 主打…

java人口老龄化社区服务与管理平台源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的人口老龄化社区服务与管理平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 人口老龄化…

MySql基础(一)--最详细基础入门,看完就懂啦(辛苦整理,想要宝宝的赞和关注嘻嘻)

前言 希望你向太阳一样,有起有落,不失光彩~ 一、数据库概述 1. 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改&…

Spring中的Aware接口

Spring中的Aware接口 Aware接口介绍 Aware是Spring中的接口,它的作用是可以让Bean获取到运行环境的相关信息。比如获取到上下文、Bean在容器中的名称等。 Spring中提供了很多Aware接口的子类,具体如下: 常用接口的作用如下: …

制作电子画册速成攻略,快来试试

​当今社会,数字媒体日益普及,电子画册作为一种崭新的展示方式,受到了越来越多人的青睐。它不仅形式新颖,互动性强,而且制作起来也并不复杂。想知道如何快速掌握制作电子画册的技巧吗?我来教你吧。 接下来&…

YOLO 学习和使用 (重拾机器学习)

contents a nenrons 单层神经网络 多层神经网络 CNN (Convolutional Neural Network) YOLO 5.1. YOLO(you only look once) 5.2. predict stage: 置信度 * 类别条件概率 全概率非极大值抑制,通过IOU 指数进行实现每个 grid cell 生成两个预测 bounding box 无…

呆马科技----构建智能可信的踏勘云平台

近年来,随着信息技术的快速发展,各个行业都在积极探索信息化的路径,以提升工作效率和服务质量。智慧踏勘云平台是基于区块链和大数据技术构建的全流程智慧可信踏勘解决平台。平台集远程视频、数据显示、工作调度、过程记录为一体,…

【图解IO与Netty系列】IO多路复用

IO多路复用 为什么要使用IO多路复用Linux的IO多路复用接口selectpollepoll 为什么要使用IO多路复用 我们常用的IO模型是BIO,我们Java里的IO流大多数都是BIO,也就是同步阻塞式IO,这种IO操作的好处是简单方便,但是缺点也很明显——…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【00】补充 WindowsCMD插件IDEAVsCode MavenvagrantDocker解决MySQL连接慢问题启动(自动)Docker注意切换到root用户远程访问MySQL MyBatisPlus代码地址参考 WindowsC…

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist(语言家)步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言,得到.ts后缀的翻译文件 3.创建.pro文件,并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件,按图所示…

YOLOv10 | 手把手教你利用yolov10训练自己数据集(含环境搭建 + 参数解析 + 数据集查找 + 模型训练、推理、导出)

一、前言 本文内含YOLOv10网络结构图 各个创新模块手撕结构图 训练教程 推理教程 参数解析 环境搭建 数据集获取等一些有关YOLOv10的内容! 目录 一、 前言 二、整体网络结构图 三、空间-通道分离下采样 3.1 SCDown介绍 3.2 C2fUIB介绍 3.3 PSA介绍 …

Java核心: 脚本引擎和动态编译

静态语言和动态语言的在相互吸收对方的优秀特性,取人之长补己之短。脚本引擎和动态编译就是其中一个关键特性,扩展了Java的能力边界。这一篇我们主要讲两个东西: ScriptEngine,执行脚本语言代码,如JavaScript、Groovy JavaCompile…

P459 包装类Wrapper

包装类的分类 1)针对八种基本数据类型相应的引用类型——包装类。 2)有了类的特点,就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…

关于数据库和数据表的基础SQL

目录 一. 数据库的基础SQL 1. 创建数据库 2. 查看当前有哪些数据库 3. 选中数据库 4. 删除数据库 5. 小结 二. 数据表的基础SQL 1. 创建数据表 2. 查看当前数据库中有哪些表 3. 查看指定表的详细情况(查看表的结构) 4. 删除表 5. 小结 一. 数据库的基础SQL 1. 创建…

Redis篇 redis基本命令和定时器原理

基本命令和定时器原理 一. exists命令二. del命令三. Expire命令四. ttl命令五. redis的过期策略六. 定时器的两种设计方式七. type命令 一. exists命令 用来判断key的值是否存在 返回值是key的个数 这样写的话,有没有什么区别呢? 效率变低,消…

用例篇

弱网测试 弱网测试的目的是尽可能保证用户体验,关注的关键点包括: 页面响应时间是否可以接受,关注包括哦热启动、冷启动时间、页面切换、前后台切换、首字时间,首屏时间等。页面呈现是否完成一致。超时文案是否符合定义&#xf…

YoloV1模型

You Only Look Once 文章目录 You Only Look Once置信度定义类别条件概率NMSnp.maxmiumnp.argsort() Yolov1直接采用网络特征输出,实现置信度预测、分类、边界框回归; 核心内容总结: 输入图像划分为 S S 网格。如果对象的中心落入网格单元中…

Java——认识Java

一、介绍 1、起源 Java 是由 Sun Microsystems 于 1995 年推出的一种面向对象的编程语言和计算平台。由詹姆斯高斯林(James Gosling,后来被称为Java之父)和他的同事们共同研发。后来,Sun 公司被 Oracle(甲骨文&#…

vue3 vite动态根据字符串加载组件

1 原理 import.meta.glob() 其实不仅能接收一个字符串,还可以接收一个字符串数组,就是匹配多个位置 let RouterModules import.meta.glob(["/src/view/*/*.vue", "/src/view/*.vue"]);这样我们就拿到了相对路劲的组件对象&#xf…

leedcode【142】. 环形链表 II——Java解法

Problem: 142. 环形链表 II 思路解题方法复杂度Code性能 思路 1.用快慢指针找到相遇的点(快指针一次走一步,慢指针一次走两步) 2.一个指针从head开始,一个指针从相遇点开始,一次一步,相遇处即为环入口 解题…