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

news2024/11/18 15:43:11

文章目录

  • 前言
  • 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.coloradmin.cn/o/1699829.html

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

相关文章

如何查看哪些组策略应用于你的电脑和用户帐户?这里有详细步骤

如果你希望在电脑上查看所有有效的组策略设置,以下是操作方法。 什么是Windows中的组策略 在Windows世界中,组策略为网络管理员提供了一种将特定设置分配给用户组或计算机组的方法。然后,无论何时组中的用户登录到联网的PC,或无论何时启动组中的PC,都会应用这些设置。 …

Linux系统之GoAccess实时Web日志分析工具的基本使用

Linux系统之GoAccess实时Web日志分析工具的基本使用 一、GoAccess介绍1.1 GoAccess简介1.2 GoAccess功能1.3 Web日志格式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统镜像源3.4 更新软件列表…

【课程作业】嵌入式系统与设计上机作业(作业三)

个人名片: 🎓作者简介:嵌入式领域优质创作者🌐个人主页:妄北y 📞个人QQ:2061314755 💌个人邮箱:[mailto:2061314755qq.com] 📱个人微信:Vir2025WB…

基于机器学习判断面部微表情发现哪些人更容易诊有帕金森病

1. 概述 帕金森病(Parkinson’s disease,PD)是一种慢性、进展性的神经退行性疾病,主要影响运动系统。该病症以大脑中黑质致密部多巴胺能神经元的逐渐丧失为特征,导致多巴胺(一种重要的神经递质&#xff09…

XX数字中台技术栈及能力

XX数字中台技术栈及能力 1 概述 XX数字中台面向数据开发者、数据管理者和数据应用者,提供数据汇聚、融合、治理、开发、挖掘、共享、可视化、智能化等能力,实现数据端到端的全生命周期管理,以共筑数字基础底座,共享数据服务能力…

插入排序(概述)

描述 插入排序为将一个数插入到以排序好的数组中 目录 描述 原理 特性 代码 原理 我们以升序为例 先将新数插入到数组的最后一位,记录下新数的值 从新数的位置开始往前遍历,如果前一位大于新数的值 则将当前位置修改为前一位的值 如果前一位小…

前端:音频可视化(H5+js版本)

一、效果展示 HTML5JS实现一个简单的音频可视化 二、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>音频可视化</title><style></style></head><body><divs…

python mp3转mp4工具

成品UI 安装moviepy库 pip install moviepy 转换demo from moviepy.editor import *# 创建一个颜色剪辑&#xff0c;时长与音频相同 audioclip AudioFileClip(r"C:\Users\Administrator\PycharmProjects\pythonProject44\test4\赵照 - 灯塔守望人.mp3") videoclip…

P6160 [Cnoi2020] 向量

[Cnoi2020] 向量 题目背景 向量(vector)&#xff0c;指具有大小(Magnitude)和方向(Direction) 的量。 与向量对应的量叫做数量(Scalar)&#xff0c;数量只有大小&#xff0c;没有方向。 对于 Cirno 来说&#xff0c;整天环绕氷屋的旋转 Sangetsusei 们是向量而不是数量。 Sun…

Spring Cloud 项目中使用 Swagger

Spring Cloud 项目中使用 Swagger 关于方案的选择 在 Spring Cloud 项目中使用 Swagger 有以下 4 种方式&#xff1a; 方式一 &#xff1a;在网关处引入 Swagger &#xff0c;去聚合各个微服务的 Swagger。未来是访问网关的 Swagger 原生界面。 方式二 &#xff1a;在网关处引…

关于C的\r回车在不同平台的问题

首先我们需要搞明白\r和\n是两回事 \r是回车&#xff0c;前者使光标到行首&#xff0c;&#xff08;carriage return&#xff09; \n是换行&#xff0c;后者使光标下移一格&#xff0c;&#xff08;line feed&#xff09; Linux平台下 #include <stdio.h> int main()…

C++的AVL树

目录 基本概念 插入的语言分析 LL右旋 RR左旋 额外结论及问题1 LR左右旋 RL右左旋 额外结论及问题2 插入结点 更新bf与判断旋转方式 旋转代码实现 准备工作一 LL右旋的实现 RR左旋的实现 准备工作二 LR左右旋的实现 RL右左旋的实现 完整代码 基本概念 1、…

机器学习算法手撕(一):KD树

import math import matplotlib.pyplot as pltclass Node:def __init__(self, data, leftNone, rightNone):self.data dataself.left leftself.right right# 创建KDTree类 class KDTree:def __init__(self, k):self.k kdef create_tree(self,dataset,depth):if not dataset…

Docker CIG使用

Docker CIG是什么 CIG为&#xff1a;CAdvisor监控收集、InfluxDB存储数据、Granfana图表展示 这个组合是一个常见的监控 Docker 容器的解决方案,它包括以下三个组件: cAdvisor (Container Advisor): cAdvisor 是一个开源的容器资源监控和性能分析工具。它能够收集有关正在运行的…

Java实现图书系统

首先实现一个图书管理系统,我们要知道有哪些元素? 1.用户分成为管理员和普通用户 2.书:书架 书 3.操作的是: 书架 目录 第一步:建包 第二步:搭建框架 首先:完成book中的方法 其次:完成BookList 然后:完成管理员界面和普通用户界面 最后:Main 第三步:细分方法 1.退…

除自身以外数组的乘积 ---- 前缀和

题目链接 题目: 分析: 计算某个区间的积, 同样可以使用前缀和算法的思想想要计算除i位置的积, 我们需要计算i位置之前[0,i-1]的前缀积 和 i位置之后[i1,n-1]的后缀积, n表示数组的长度 先求[0,i - 1]的积 用一个前缀数组f 此时f[i] 表示: 前i - 1个数的积, 那么f[i - 1] 就表…

虹科Pico汽车示波器 | 免拆诊断案例 | 2012 款雪佛兰科鲁兹车偶尔多个故障灯异常点亮

故障现象 一辆2012款雪佛兰科鲁兹车&#xff0c;搭载1.8 L 发动机&#xff0c;累计行驶里程约为9.6万km。该车组合仪表上的发动机故障灯、ABS故障灯及动力转向故障灯偶尔异常点亮&#xff0c;同时发动机转速表和发动机冷却液温度表的指针会突然归零&#xff0c;严重时发动机无…

上下文视觉提示实现zero-shot分割检测及多visual-prompt改造

文章目录 一、Closed-Set VS Open-set二、DINOv2.1 论文和代码2.2 内容2.3 安装部署2.4 使用效果 三、多visual prompt 改造3.1 获取示例图mask3.2 修改函数参数3.3 推理代码3.4 效果的提升&#xff01; 四、总结 本文主要介绍visual prompt模型DINOv&#xff0c;该模型可输入八…

Qt for Android 乱码问题

java文件乱码 导致编译失败 使用notepad等查看java文件的编码&#xff0c; 修改成utf-8&#xff0c;否则会因为乱码编译失败&#xff0c; 记住是utf8不是utf8-bom. 做如下修改确保utf8文件不被修改掉。 编译时错误显示的是乱码 如果开发其他乱码再改回&#xff0c; 原本是Sys…

【机器学习300问】99、多通道卷积神经网络在卷积操作时有哪些注意事项?

一、多通道卷积神经网络示例 还是以图像处理为例&#xff0c;如果你的目标不仅是分析灰度图像特性&#xff0c;还打算捕捉RGB彩色图像的特征。如下图&#xff0c;当面对一张66像素的彩色图像时&#xff0c;提及的“3”实际上是指红、绿、蓝三种颜色通道&#xff0c;形象地说&am…