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

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

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

相关文章

【知识图谱】探索攻略:基础、构建、高级应用与相关论文方向

【知识图谱】相关文章汇总 写在最前面一、什么是知识图谱?二、相关历史文章代码实现:简单的知识图谱可视化知识图谱前身:信息抽取知识图谱应用1:社交网络分析知识图谱应用2:威胁情报挖掘知识图谱应用3:Code…

Python小游戏——俄罗斯方块

文章目录 项目介绍环境配置代码设计思路1.初始化和导入库:2.定义颜色和屏幕尺寸:3.定义游戏逻辑:4.游戏循环: 源代码效果图 项目介绍 俄罗斯方块游戏是一款经典的益智游戏,玩家通过旋转和移动各种形状的方块&#xff…

【NumPy】关于numpy.clip()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

Gradle筑基——Gradle Maven仓库管理

基础概念: 1.POM pom:全名Project Object Model 项目对象模型,用来描述当前maven项目发布模块的基础信息 pom主要节点信息如下: 配置描述举例(com.android.tools.build:gradle:4.1.1)groupId组织 / 公司的名称com.…

初学Echart

创建一个html文件 1.引入 点击链接----快速上手网址&#xff1a;快速上手 - 使用手册 - Apache ECharts 复制这一串【这个是引入echart路径】 引入到这里 2.使用 我们在上一步---点击返回--往下翻---找到完整代码--复制黏贴 复制粘贴后--总体长这样 <!DOCTYPE html> &…

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型 前言 整了一个在C# Winform中调用文生图Stable Diffusion XL的小程序&#xff0c;基于百度智能云千帆平台 步骤 如何注册百度智能云和创建应用&#xff0c;获取API 密钥等和在之前的博客中基本相同&#…

[C++]debug介绍+debug时如何查看指针指向内存处的值

一、简介 预备工具和知识&#xff1a;使用使用VSCode使用Debug。 本文简介&#xff1a;本文将简要介绍debug中Continue&#xff0c;Step Over&#xff0c;Step Into和Restart的功能。并介绍如何在debug时查看动态内存地址&#xff08;指针&#xff09;的值&#xff1b; 二、D…

连公司WiFi后,无法访问外网,怎么回事,如何解决?

文章目录 封面问题描述问题探究什么是DNS&#xff1f;分布式&#xff0c;层次数据库如何理解分布式&#xff1f;如何理解层次&#xff1f; 本地DNS服务器迭代查询&#xff0c;递归查询DNS缓存参考资料 封面 问题描述 从甲方项目组返回公司后&#xff0c;我习惯性连上公司WiFi&…

视频号小店去哪里找货源?最全货源渠道分享!

大家好&#xff0c;我是电商糖果 视频号小店因为是这两年电商行业新出来的黑马&#xff0c;吸引着不少商家入驻。 入驻了商家中很多都没有自己的货源渠道。 他们基本都是从无货源开始起步&#xff0c;后期通过积累资源&#xff0c;慢慢搭建属于自己的货源渠道。 可是渐渐的…

算法的时间与空间复杂度

算法是指用来操作数据、解决程序问题的一种方法。对于同一问题&#xff0c;使用不同的算法&#xff0c;也许最终结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别。 那我们该如何去衡量不同算法之间的优劣呢&#xff1f;主要还是从算法所占用的【时间】和…

5.26机器人基础-空间描述和变换-总结

非目录 方便我找 重点 逆解 位姿矩阵的几何意义 实际坐标需要除以比例因子才能得到 比例因子的好处&#xff1a;在计算机的储存更加简单方便&#xff0c;例如x,y,x原先很大时&#xff0c;等比例改变 位姿坐标的齐次变换&#xff1a;左乘齐次坐标 从端点到末端&#xff0c…

集合竞价选股策略实战测试

2.3.2版本发布的集合竞价选股策略是网友吴PSYP提供的&#xff0c;团队按照策略实现的选股算法&#xff0c;最近半个月对策略进行的实战测试&#xff0c;从集合竞价选股开始&#xff0c;到股票收盘&#xff0c;收盘价格大于集合竞价价格&#xff0c;算作盈利&#xff0c;测试结果…

Vision Mamba论文阅读(主干网络)

这几天被Mamba刷屏了&#xff0c;又由于本人是做视觉方面任务的&#xff0c;固来看看mamba在视觉上的应用。 今天分享的是Vision Mamba: Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 论文网址&#xff1a;https://arxiv.or…

火山引擎“奇袭”阿里云

图片&#xff5c;电影《美国队长3》剧照 ©自象限原创 作者丨程心 编辑丨罗辑 大模型价格战&#xff0c;已经不是什么新闻。 从OpenAI发布GPT-4o&#xff0c;将API价格下调50%&#xff0c;并宣布面向普通用户免费开始&#xff0c;就标志着大模型的竞争从性能进入到了成本…

【机器学习】期望最大化(EM)算法

文章目录 一、极大似然估计1.1 基本原理1.2 举例说明 二、Jensen不等式三、EM算法3.1 隐变量 与 观测变量3.2 为什么要用EM3.3 引入Jensen不等式3.4 EM算法步骤3.5 EM算法总结 参考资料 EM是一种解决 存在隐含变量优化问题 的有效方法。EM的意思是“期望最大化&#xff08;Exp…

Aloha机械臂的mujoco仿真问题记录

今天在测试ACT代码时&#xff0c;遇到了仿真中的机械臂无法摆放正确的姿势来抓去红色方块。 后来经过测试&#xff0c;发现应该是python包的版本问题有误&#xff0c;下面记录下正确的包版本&#xff1a; 官方给出的包&#xff1a; conda create -n aloha python3.8.10 conda…

vue3 ts问题 找不到模块“@/views/home/index.vue”或其相应的类型声明。

1. 找不到模块“/views/HomeView.vue”或其相应的类型声明 今天帮同事看了一个问题&#xff0c;他尝试用vitevue3tspinia创建项目&#xff0c;结果刚上来就遇到这么一个问题 2. 解决办法 出现这个问题的原因就是&#xff1a;ts只支持导出导入模块&#xff0c;但是vue不是模块…

leetcode 1631. 最小体力消耗路径 二分+BFS、并查集、Dijkstra算法

最小体力消耗路径 题目与水位上升的泳池中游泳类似 二分查找BFS 首先&#xff0c;采用二分查找&#xff0c;确定一个体力值&#xff0c;再从左上角&#xff0c;进行BFS&#xff0c;查看能否到达右下角&#xff0c;如果不行&#xff0c;二分查找就往大的数字进行查找&#xff…

web及网络基础图文详解

目录 1.1TCP/IP 协议族 1.2TCP/IP 的分层管理 1.3TCP/IP通信传输流 1.4 与 HTTP 关系密切的协议 : IP、TCP 和 DNS &#xff08;1&#xff09;负责传输的 IP协议&#xff08;网络层&#xff09; &#xff08;2&#xff09;确保可靠的 TCP协议&#xff08;传输层&#xff…

一行代码实现UI拖拽的效果

演示 先来看效果吧&#xff01; 实现方式 1.首先创建一个你想拖动的UI图片 2.创建一个C#的脚本 3.编写控制脚本&#xff08;代码按我的敲就行&#xff09; 付上代码片段 public void OnDrag(PointerEventData eventData){transform.position eventData.position;} 4.添加脚…