Nginx服务器基本框架分析

Nginx基本框架

Nginx是近年来非常受欢迎的一款轻量级web服务器。Nginx不像Apache服务器那样重量级服务器需要占用大量的计算机资源,其本身硬件资源占用率低,但其异步O/I的处理模式分段资源分配技术使其能支持大量的访问量而不崩溃。Nginx官方曾表示服务器只需要几兆的内存就能维持一万多个的无活动链接。所以Nginx拥有极高的稳定性。
Nginx模块化
高度的模块化设计是Nginx的架构基础,其中包括:核心模块、配置模块、事件模块、HTTP模块、mail模块、第三模块和补丁。每一个模块都相对独立,这样对于开发人员来说很方便扩展系统功能而其模块化的都具有以下几个特点:
  • 高度抽象的模块化接口:给Nginx带来良好的简单性,静态可扩展性,可重用性
  • 较高的灵活性:使得Nginx比较简单的实现了动态可修改性
  • 配置设置模块化:使Nginx可以提供高可配置性,高扩展性,高可定性,高可伸缩性。
  • 核心模块简单化:为Nginx实现动态可配置性,动态可扩展性,动态可制定性带来极大的便利
  • 多层次、多类别的模块设计:每一个模块都会在核心模块有一个相对的代言人
  • 具体结构图如下:

    Nginx服务器基本框架分析_第1张图片

    事件驱动架构

    Nginx是基于事件驱动模型设计的。所谓事件驱动就是有一些事件发生源来产生有一个或者多个事件收集器来收集分发事件。所示如下图:

    Nginx服务器基本框架分析_第2张图片

    Nginx事件驱动带来的优点:

    1.网络性能,用户感知的请求时延都得到提升,整个服务器的网络吞吐量的到极大地提升。
    2.每个事件消费者都有阻塞行为,减少了CPU的占用率。

    进程处理模型
    Nginx有一个master管理进程,多个worker工作进程的设计方式处理事件。其具体流程图如下:

    Nginx服务器基本框架分析_第3张图片

    master管理进程:
    不处理网络事件、不负责业务的执行它只是通过信号去管理worker等子进程来实现重启服务、平滑升级、更换日志、配置文件实时生效等功能。
    worker进程:
    用来处理master进程fork过来的请求、worker进程是通过信号与master进程进行通信
    优点:
  • 利用多核系统的并发处理能力,现在操作系统已经支持多CPU架构,Nginx采用多进程处理请求且每一个进程的地位平等,这样使得网络性能和请求延时都有很大的改善。
  • 有多个worker进程在进程间任务切换时运用负载均衡,将请求分发给适合的进程,以避免有的进程负载多大而有的却负载很小从而极大的提升了CPU的利用率。
  • 这样多worker进程通过一个master进程来管理极大的提高了系统的稳定性,方便系统对进程错误进行及时的处理。这样也可以提升系统的性能、增加它的可扩展性。
    请求多阶异步处理
    Nginx读取请求头后就会进入Nginx请求的多阶处理。在以前Web服务器将客户端发送过来的资源地位符(url)直接映射为本地文件路径,然后将资源返回给服务器。但随着互联网的不断发展,客户端的请求也变得各式各样了,这样Web服务器要处理诸多安全和权限等问题。所以Nginx良好的的模块化设计特性,把请求处理变化为一条流水线的多阶处理方式。Nginx实际把请求处理流程划分为11个阶段这样使得开发者更方便开发,具体如下。
  • NGX_HTTP_POST_READ_PHASE: 接收完请求头之后的第一个阶段,它位于uri重写之前,实际上很少有模块会注册在该阶段,默认的情况下,该阶段被跳过;
  • NGX_HTTP_SERVER_REWRITE_PHASE: server级别的uri重写阶段,也就是该阶段执行处于server块内,location块外的重写指令,前面的章节已经说明在读取请求头的过程中nginx会根据host及端口找到对应的虚拟主机配置;
  • NGX_HTTP_FIND_CONFIG_PHASE: 寻找location配置阶段,该阶段使用重写之后的uri来查找对应的location,值得注意的是该阶段可能会被执行多次,因为也可能有location级别的重写指令;
  • NGX_HTTP_REWRITE_PHASE: location级别的uri重写阶段,该阶段执行location基本的重写指令,也可能会被执行多次;
  • NGX_HTTP_POST_REWRITE_PHASE: location级别重写的后一阶段,用来检查上阶段是否有uri重写,并根据结果跳转到合适的阶段;
  • NGX_HTTP_PREACCESS_PHASE: 访问权限控制的前一阶段,该阶段在权限控制阶段之前,一般也用于访问控制,比如限制访问频率,链接数等;
  • NGX_HTTP_ACCESS_PHASE: 访问权限控制阶段,比如基于ip黑白名单的权限控制,基于用户名密码的权限控制等;
  • NGX_HTTP_POST_ACCESS_PHASE: 访问权限控制的后一阶段,该阶段根据权限控制阶段的执行结果进行相应处理;
  • NGX_HTTP_TRY_FILES_PHASE: try_files指令的处理阶段,如果没有配置try_files指令,则该阶段被跳过;
  • NGX_HTTP_CONTENT_PHASE:内容生成阶段,该阶段产生响应,并发送到客户端;
  • NGX_HTTP_LOG_PHASE: 日志记录阶段,该阶段记录访问日志。
    内存池设计
    内存池是一种内存分配方式。在使用之前,先预先申请分配一定数量的,大小相等的内存块留用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够则再继续申请新的内存,是的内存分配效率得到。
    Nginx内存池设计非常精妙,每一个模块对应一个内存池。Nginx内存池结构有一个内存池头部,该头部又包含一个数据部。头部主要用来为用户分配内存,管理外部资源,日志信息以及内存池的一些其他信息。数据部主要用来为用户分配小块内存,以及链接到下一个内存池的指针。具体结构如下。

    Nginx服务器基本框架分析_第4张图片

    如此每一次请求的内存都相互独立,而请求结束时又销毁整个内存池把分配的内存一次性归还给操作系统。这样设计大大的提升了模块开发的简单性、降低了请求的延时、提高内存的有效利用率从而增加网络性能。

  • 你可能感兴趣的:(Linux)