nginx工作原理详解

article/2025/10/4 8:25:32

一、Nginx请求处理流程

在这里插入图片描述
图解:
进入nginx的大致三种流量:WEB、EMAIL及TCP
Nginx中三个状态机:

  • 传输层状态机:处理TCP/UDP四层传输层
  • HTTP状态机:处理应用层
  • MAIL状态机:处理邮件

状态机作用:Nginx采用epoll异步非阻塞事件驱动处理引擎,需要状态机识别和处理请求,将解析出来的请求引导到静态资源或磁盘缓存(做反向代理时)。
当静态资源太多,内存不足以缓存时,磁盘调用会退化成阻塞调用,所以我们使用线程池来处理。
线程池详解
总的来说:线程池就是一个单独的处理机制,所有的worker进程处理起来耗时的任务都会交给他,他处理完之后返回结果。worker进程不需要等待,客户端等待就行。
对每一个处理完成的请求会记录Access访问日志和Error错误日志(记录到磁盘中的)。
nginx作反向代理时可以使用应用层协议HTTP、FastCGI等将请求代理到其他服务器。

二、nginx的进程结构

在这里插入图片描述nginx中有Master进程和child进程。child进程分为两类:worker进程和cache进程。

为什么nginx采用多进程结构而不是多线程结构?
nginx目的:保持高可用性和高可靠性。
如果采用多线程模型,线程之间共享地址空间,如果某个第三方模块引发地址空间导致的段错误时,在地址越界出现时,会导致整个nginx全部挂掉。而多进程就不会出现这种问题。

进程作用
master进程:负责监控每个worker进程工作状态。
worker进程:处理请求。缓存需要在多个worker之间进行共享。
Cache manager:做反向代理时为后端发来的动态请求做缓存使用的。做缓存管理。
Cache loader:做反向代理时为后端发来的动态请求做缓存使用的。做缓存载入。
进程间的通信方式:共享内存。

为什么有多个worker进程?
nginx采用事件驱动模型,希望每个worker进程从头到尾占有一个cpu。我们需要将worker进程数配置成与cpu核数相同的同时将每一个worker和一个cpu绑定在一起。这样可以更好的使用每一个cpu核上的cpu缓存来减少缓存失效的命中率。

nginx -s reload
kill -SIGHUP 父进程id

会将老的子进程(worker和cache进程)优雅的退出,加载配置文件,启动新的子进程。

kill -SIGTERM  子进程id

子进程退出告知父进程,父进程会重新起一个子进程,维持原有worker数量。

三、Nginx进程管理:信号

在这里插入图片描述
解析:
子进程终止时会给父进程发送CHLD信号,如果worker进程由于某些bug意外终止,master进程会立马发现并拉起worker进程。

通过nginx命令行方式发送信号:
TERM,INT:立刻停止nginx进程
QUIT:优雅停止nginx
HUP:重载配置文件
USR1:重新打开日志文件,做日志文件切割

专门针对做热部署时使用,只能通过kill(linux命令行)发送信号:
USR2
WINCH

四、reload重载配置文件的真相

reload流程:
1、向master进程发送HUP信号(reload命令)
2、master进程校验配置语法是否正确(nginx -t)
3、master进程打开新的监听端口(子进程会继承所以master打开的端口,我们可能引入了新的监听端口)
4、master进程用新配置启动新的worker子进程
5、master进程向老worker子进程发生QUIT信号
6、老worker进程关闭监听句柄,处理完当前连接后结束进程

在这里插入图片描述
Master进程启动新的子进程时会加一个定时器worker_shutdown_timeout,定时器到时后会立刻强制退出还未退出的老worker进程。

六、热升级流程

1、将旧nginx文件替换成新nginx文件
2、向老master进程发送USR2信号
3、master进程修改pid文件名,加后缀.oldbin(保存老pid文件)
4、master进程用新nginx文件启动新master进程。(目前为止有两个master进程)
5、向老master进程发送WINCH信号,关闭老worker
6、回滚:向老master发送HUP,向新master发送QUIT。


http://chatgpt.dhexx.cn/article/3KaS9mhE.shtml

相关文章

nginx工作原理:

首先nginx,采用的是多线程&多路io复用模型,使用I/O多路复用技术的nginx,成就了”并发驱动”的服务器. nginx的框架模型: 进程组件角色: master进程: 监视工作进程的状态,当工作进程死掉后重启一个新的,处理信号和通知工作进程. work进程: 处理客户端请求,从主进程处获得…

原来使用 Spring 实现策略模式可以这么简单

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,可以替代代码中大量的 if-else。 比如我们生活中的场景:买东西结账可以使用微信支付、支付宝支付或者银行卡支付&#xf…

策略设计模式

介绍 Java策略模式(Strategy Pattern)是一种行为设计模式,它允许再运行时动态选择算法的行为.策略模式通过将算法封装在可互换的策略对象中,使得客户端代码能够轻松地切换算法,而无需修改原始代码.在策略模式中,每个算法都被实现为一个单独的策略类,这些策略类都实现了相同的接…

Java 设计模式——策略模式(行为型设计模式)

策略模式用我个人的理解就是: 用一种更灵活更优雅和更健壮的方式替换了if…else… 一、问题引入 当我们导出一些数据到Excel表格时,有时候需要从不同的维度导出(如:个人维度,时间维度),不同维…

采用注解实现策略模式

目录 一、前言 二、采用简单的注解方式进行业务策略模式 (一)场景举例 (二)实现方案 1、基本代码准备 2、基本功能接口定义 3、定义注解与不同的策略实现 4、业务实际使用 5、测试及结果展示 三、采用组合的注解方式进行…

​JAVA设计模式(六)——策略模式

下图为所有设计模式,带标记为重点掌握以及工作中常用到的: 策略模式是行为型设计模式之一,其作用是让一个类的行为或其算法可以在运行时更改,该模式也算是我比较熟悉的模式之一了,因为之前项目中有幸遇到大佬用过&…

java 策略模式例子_策略模式—Java实现(转)

1. 现实需求 客户有了新的需求,这时我们直接新增策略即可,改很少的代码。基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合。 2. 策略模式定义 策略模式,又叫算法簇模式,就…

Java设计模式(五)策略模式-在SpringBoot项目中的实际应用

文章目录 什么是策略模式优点缺点使用场景结构图 策略模式的简单示例策略模式的项目实战场景实现 小结 什么是策略模式 官话:策略模式(Strategy Pattern): 定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换&#xff…

java调用微信加密_java微信消息加解密

今天心血来潮就信手拈来学了下微信消息加解密的知识,忽然觉得微信真的好强大。可能在大部分项目微信消息的加解密都用不上,但是仍然不排除有使用到的情况,如涉及金钱方面的微信应用包括商城类、金融类还有其他安全级别要求很高的微信应用。针对这些情况我觉得还是有必要分享…

spring如何使用策略模式

这里使用登录做例子介绍如何实现登录的多种策略 上图是策略模式的基础模型。 context Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。 Strategy 策略角色…

java设计模式实战-(反射+策略模式)

学完23种设计模式,相信很多同学都疑问,除了单例模式、工厂模式其他模式还有运用的场景吗? 现在这里就举一个例子。 首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景。但是在实际的开发中&#x…

Java23种设计模式之策略模式【普通写法以及spring中的写法】

目录 设计模式简介策略模式的简介普通写法案例基于注解式改造的案例优缺点策略模式的使用场景 设计模式简介 将设计者的思维融入大家的学习和工作中,更高层次的思考! • 创建型模式: – 单例模式、工厂模式、抽象工厂模式、建造者模式、原型…

Java设计模式-策略模式(支付业务的优化)

一、什么情况下使用策略模式 功能类似的业务功能,避免创建多个接口,大量if else 判断逻辑,简化代码 二、我以支付为例(支付方式有微信,支付宝支付) 1、新建策略抽象类或者接口 public interface ThirdP…

java策略模式实战示例

现已放在gitee上,可以不下载直接参考一下即: https://gitee.com/zhang-xiao-xiang/zxx-pattern 日常碰到的业务概述 登录类型,支付类型,供应商渠道,不同等级会员享受的优惠券价格不一样,等等业务判断,大量if else导致拓展(侧重新增)极其困难,维护(侧重修改)自然是改起来头痛(…

【JAVA设计模式】策略模式

1.什么是策略模式? 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,相同的事情-----选择不用同方式 (不同实现)举例子,最终可以实现解决多重if判断问题。 …

java微信关注事件_java策略模式在接收微信事件推送上的具体应用

java策略模式,在我的认知中是根据不同选择执行不同的实现。通过if或者switch-case也能实现这种逻辑,但是代码冗余,可扩展性不强。 百度百科上的解释为策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景…

Java设计模式之3种策略模式实现

一、什么是策略模式 所谓策略模式,就是定义了一组策略,分别封装在不同类中,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。比如我们要去某个地方,会根据距离的不同来选择不同的出行方式&…

java8 策略模式_JAVA设计模式之策略模式

策略模式:在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对…

git如何提交代码

代码提交 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前,首先应该检查目前所做的修改,运行git status命令 a)…

修改git提交时间

问题描述: 修改git提交记录的时间 git脚本: 此方法使用github上的开源工具完成。感谢无私的奉献者! 操作步骤: github上下载文件 解压文件夹,把git-redate文件置于git安装目录的\mingw64\libexec\git-core文件夹…