nginx程序架构

  nginx是一个模块化的、事件驱动的、异步,单线程的、非阻断的服务。nginx启动后会有master与worker进程,master进程只有一个,负责加载和分析配置文件、管理worker进程、平滑升级。worker进程有一个或多个,负责处理并响应用户请求。

worker模型

  nginx并不为每个连接产生一个进程或线程。工作进程从一个共享的“listen”socket接受新的请求,每个worker内运行循环高效执行。每个worker处理数以千计的连接。在启动时,一组初始的监听套接字被创建。当处理HTTP请求和响应时,worker不断接受,读取和写入到socket。

  nginx的worker代码的运行循环是最复杂的部分。它包括全部的内部调用,并在很大程度上依赖于异步处理任务的想法。异步操作通过模块化,事件通知,广泛使用回调函数和微调定时器实现。总体而言,关键的原则是尽可能的非阻塞。 唯一可以让nginx阻塞的情形是,没有足够的磁盘存储供worker操作。

  由于nginx并不会为每个连接产生新的进程或线程,内存使用在绝大多数情况下是非常保守的,效率非常高。 nginx节省CPU周期,因为没有持续的进程或线程的创建销毁模式。nginx要做的是检查网络和存储的状态,初始化新的连接,将它们添加到运行循环,处理直到完成,此时连接被释放,从运行循环中移除。谨慎使用系统调用和准确实现支持接口,如poll和slab内存分配器相结合,nginx通常达到中度至低CPU占用率,即使在极端恶劣的工作负载环境下。

  由于nginx可以产生数个worker进程处理连接,在多核上扩展性很好。一般情况下,每核一个单独的worker可以充分利用多核架构,并防止线程的波动和锁定。隔离的单线程worker进程没有资源匮乏和资源控制机制。该模型还允许在物理存储设备上的可扩展性,有利于更好的磁盘利用率,避免了磁盘I / O阻塞。所以,一些资源在几个worker之间共享可以更有效的被利用

  在磁盘和CPU的负载模式中,nginx的worker数目应该进行相应的调整。这里有一些基本规则,系统管理员应该根据负载量尝试几种配置。以下的是一般建议内容:如果负载模式是CPU密集的情况下,处理大量的TCP / IP,做SSL,压缩,nginx的worker的数量和CPU核的数量应该相匹配;如果负载主要是磁盘I / O范畴的情况下,从储存提供不同的内容,或繁忙的代理。worker的数量可以是一个半到两个核。与之相反的是,一些工程师选择worker的数量是基于独立存储单元的数量,但这种方法的效率取决于磁盘存储的类型和配置。

Nginx进程的作用

  nginx在内存中运行多个进程。有一个主进程和多个worker进程。此外,还有一些特殊用途的进程,特别是高速缓存加载器和高速缓存管理器。在nginx的1.x版本中所有的进程都是单线程。所有进程主要使用共享内存的进程间通信机制。主进程以root用户运行。缓存加载器,缓存管理器和worker作为一个非特权用户运行。

 主进程负责执行以下任务:

  • 读取并验证配置
  • 创建,绑定和关闭套接字
  • 启动,终止和维护配置的工作进程数
  • 不中断服务的情况下重新配置
  • 控制不停止服务的二进制升级(如有必要,启动新的二进制程序和回滚)
  • 重新打开日志文件
  • 编译嵌入式的Perl脚本

  worker进程接受,处置和处理来自客户端的连接,提供反向代理和过滤功能,做nginx能力范围之内的所有事情。关于监测nginx的实例的动态,系统管理员应该留意worker,因为他们是反映了Web服务器的实际日常操作的进程。

  缓存加载器进程负责检查磁盘上的缓存项和使用高速缓存元数据填充Nginx在内存中的数据库。从本质上讲,缓存加载器可以帮助nginx和文件协同工作,一个已经专门分配存储在磁盘上的目录结构。它遍历目录,检查缓存内容,元数据,更新共享内存中的相关条目,当一切都干净并准备投入使用时,它会退出。

  高速缓存管理器主要是负责缓存过期和失效。在正常nginx的操作过程中它驻留在内存中,在失败的情况下,它被主进程重新启动。

Nginx的缓存的简要概述

  Nginx的缓存是以分层数据存储的形式在一个文件系统中实现的。缓存键是可配置的,不同请求的目的参数可以用来控制哪些参数可以进入高速缓存中。高速缓存键和缓存元数据存储在共享内存段,从而缓存加载器、缓存管理器和worker都可以访问。没有任何文件缓存在内存中,只有操作系统的虚拟文件系统机制方面的优化。每个高速缓存的响应被放置在文件系统上的不同文件。通过nginx的配置指令控制的层次结构(层次和命名的详细信息)。当一个响应被写入到高速缓存的目录结构,路径和文件的文件名是来自代理URL的MD5哈希。

  放置在高速缓存中的内容的过程如下所示:当nginx从上游服务器读取响应,内容首先被写入到高速缓存的目录结构以外的一个临时文件。当nginx完成处理请求时,临时文件重命名,并被移动到缓存目录中。如果临时文件目录代理是在另一个文件系统上,该文件将被复制,因此建议临时文件和缓存目录保持在同一个文件系统。需要显式地清除,从缓存目录结构删除文件是比较安全的。

HTTP请求处理过程

  1. 客户端发送HTTP请求。
  2. nginx的核心段根据所配置的location选择合适匹配请求的处理程序。
  3. 如果配置要求这样做,负载平衡器为代理挑选一个上游服务器(或“后端”)。
  4. 阶段处理程序执行它的工作,并传递每个输出缓冲器到所述第一滤波器。
  5. 第一滤波器的输出传递到所述第二过滤器。
  6. 第二滤波器的输出到第三个(等等)。
  7. 最终的响应被发送到客户端。

参考:https://my.oschina.net/daleshen128/blog/95130

作者

John Doe

发布于

2018-09-12

更新于

2023-03-17

许可协议