在这里插入图片描述

你好呀,我是赵兴晨,文科程序员。

今天咱们继续聊 Nginx,我将依次介绍Nginx的架构设计、进程模型、进程间通信机制,以及Nginx的启动流程和HTTP连接的处理。希望通过今天的分享,大家能够对Nginx有一个更清晰的认识。

Nginx 架构

在这里插入图片描述

在Nginx的架构中,存在一个主进程(master process)和多个工作进程(worker processes)。主进程的核心职责是管理工作进程,并不直接处理网络请求。它的主要功能包括:

1.加载配置文件,确保Nginx的设置能够正确应用。
2. 启动工作进程,让它们准备就绪以响应网络请求。
3. 接收外部信号并转发给工作进程,以便进行平滑的重启或配置重载。
4. 监控工作进程的状态,确保它们的健康运行。
5. 在工作进程异常退出时,自动重启新的工作进程,以维持服务的连续性。
而工作进程则承担起处理网络请求和生成响应的重任。它们的工作特点包括:

  1. 多个工作进程之间是平等的,它们独立运行并竞争客户端的请求。
  2. 每个请求只会由一个工作进程处理,且一个工作进程不会处理其他进程的请求。
  3. 工作进程的数量可以根据需要进行配置,通常建议与服务器的CPU核心数相匹配,以实现最佳的并发处理能力。
  4. Nginx提供了CPU绑定功能,允许将特定的工作进程绑定到特定的CPU核心上。这样做可以减少缓存失效的情况,因为当工作进程固定在某个CPU核心上时,相关的缓存数据可以更有效地被利用。
    通过这种设计,Nginx能够有效地利用多核处理器的优势,同时保证了高可用性和灵活性。

Nginx进程结构

Nginx采用了多进程的组织模型,主要由一个主进程(master process)和多个工作进程(worker processes)组成。这种架构设计旨在提高性能和稳定性。

Web请求处理机制

1.多进程方式:在传统的多进程模型中,服务器为每个客户端请求生成一个子进程。这种方法的优势在于处理速度快,且子进程之间相互独立,但当访问量过大时,可能会导致服务器资源耗尽。

2.多线程方式:与多进程类似,但使用的是线程而非进程。线程的开销小于进程,因此在资源使用上更为高效。然而,多线程存在线程间同步问题,因为它们共享同一内存空间。如果主进程崩溃,所有线程也会随之停止工作。IIS服务器采用多线程模型,可能需要定期重启以保持稳定。

Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。

在这里插入图片描述

Nginx主进程(Master Process)的功能
• 接收并处理外部信号,如重启、升级或关闭服务器的指令。
• 管理工作进程,包括启动、监控和在工作进程异常终止时自动重启。
• 读取并验证Nginx配置文件的有效性和正确性。
• 建立、绑定和关闭socket连接。
• 根据配置文件生成、管理和结束工作进程。
• 实现不中断服务的平滑升级和重启。
• 管理日志文件和文件描述符。
• 编译和处理Perl脚本(如果配置中使用Perl)。

Nginx工作进程(Worker Processes)的功能
• 所有工作进程在地位上是平等的,它们共同竞争处理客户端的请求。
• 实际处理网络请求,包括接收、处理和发送响应。
• 工作进程的数量通常设置为与CPU核心数相匹配,以充分利用CPU资源,同时避免因进程数量过多而导致的CPU资源竞争和上下文切换损耗。
• 将请求送入Nginx的各个功能模块进行处理。
• 执行I/O调用,获取响应数据。
• 与后端服务器通信,接收处理结果。
• 缓存数据,访问缓存索引,并查询或调用缓存数据。

请注意,Nginx并不是为每个请求生成一个子进程,而是使用多个工作进程来并发处理请求。此外,Nginx不使用多线程,而是采用事件驱动和异步处理机制,这使得它在处理大量并发连接时非常高效。

Nginx进程间通信

在Nginx中,主进程(master process)通过fork()系统调用生成工作进程(worker processes)。在Nginx启动时,主进程会根据配置文件中设定的数量来启动工作进程,并将它们记录在全局工作进程表中。这个表用于追踪所有当前活跃的工作进程。

主进程与工作进程的通信
• 主进程与工作进程之间的通信主要通过信号和文件描述符(如Unix管道)来实现。主进程可以向工作进程发送信号,以触发特定的操作,如重启或关闭。
• 工作进程会监听与主进程之间的管道,以便捕获来自主进程的指令。当工作进程接收到指令时,它会解析这些指令并执行相应的操作。

工作进程之间的通信
• 工作进程之间是相互独立的,它们通常不直接通信。如果需要交换信息,通常需要通过主进程来协调。
• 然而,在某些特定场景下,如负载均衡或状态共享,Nginx提供了共享内存机制(如使用upstream模块的共享内存区域zone),允许工作进程间接地交换信息。
共享内存通信
• Nginx工作进程可以使用操作系统提供的共享内存机制来通信。例如,在upstream模块中,可以使用共享内存区域zone来实现负载均衡器之间的状态共享。
• 共享内存允许工作进程访问同一块内存空间,从而无需通过主进程即可直接交换数据。

在这里插入图片描述

Nginx通过精心设计的进程间通信机制,确保了其高效率和高可靠性。主进程在启动时,会根据配置文件生成相应数量的工作进程,并通过fork()系统调用实现。随后,主进程维护一个全局工作进程表,用以追踪所有活跃的工作进程。

主进程与工作进程之间的通信主要依靠信号机制和单向管道。主进程可以向工作进程发送信号,工作进程则通过监听管道中的事件来接收指令,并据此执行操作。

尽管工作进程通常独立运行,但在需要时,它们可以通过主进程协调来实现间接通信。此外,Nginx利用共享内存机制,如upstream模块中的zone,允许工作进程在特定场景下高效地共享信息。

这种通信方式不仅提高了Nginx的性能,也增强了其稳定性和灵活性,使其成为现代Web服务器中的佼佼者。

Nginx启动和HTTP连接建立

当Nginx启动时,其主进程(Master Process)首先执行以下操作:

  1. 加载配置文件:主进程读取并解析Nginx的配置文件(通常为nginx.conf),确保所有指令和设置均已正确加载。
  2. 初始化监听的socket:主进程创建并初始化用于监听网络请求的socket。这些socket绑定到指定的网络接口和端口,如80端口(HTTP)或443端口(HTTPS)。
  3. 生成工作进程:主进程通过fork()系统调用生成多个工作进程(Worker Processes)。这些工作进程将负责处理实际的网络请求。

接下来,这些工作进程将执行以下任务:
• 竞争新的连接:工作进程会竞争来自客户端的新的网络连接请求。在Nginx中,这通常是通过一种称为“抢先式”(preemptive)的方式来实现的,即工作进程会尝试获取新的连接,而不是等待主进程分配。
• 建立Socket连接:一旦工作进程成功竞争到一个新的连接请求,它会与客户端进行TCP三次握手,以建立稳定的socket连接。
• 处理请求:连接建立后,工作进程开始读取客户端发送的HTTP请求,并根据请求类型和配置文件中的指令进行处理。这包括服务静态内容、代理请求、负载均衡等。
这一流程不仅确保了Nginx的高效启动,也为随后的网络通信打下了坚实的基础

HTTP处理过程

废话不多说,直接上图
在这里插入图片描述
OK,今儿的分享就到这,如果你对今天的话题感兴趣,或者有任何想要深入讨论的内容,欢迎在文章下方留言。知识的交流和思想的碰撞,总能带来无限乐趣。


最后,我为您准备了一份特别的技术学习礼物,包括:
Linux学习笔记:详尽记录了Linux的核心知识点和实用技巧。
Java基础笔记:为您打下坚实的Java编程基础。
Java面试总结:十万字的面试经验,助您轻松应对各种技术面试。

【一键领取】
领取这份资料包,您只需轻松一扫:
按住👇🏻图片,扫描二维码,备注:【大礼包】‍
通过好友验证后,您的的专属资料包就会立即发送给您。

Linux系统学习笔记、Java基础学习笔记、10万字Java面试总结
在这里插入图片描述

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐