zoukankan      html  css  js  c++  java
  • 【Nginx】Nginx事件模块

    一、事件处理框架概述

    事件处理框架所要解决的问题是如何收集、管理、分发事件。事件以网络事件和定时器事件为主,而网络事件中以TCP网络事件为主。事件处理框架需要在不同的操作系统内核中选择一种事件驱动机制(I/O多路复用)支持网络事件的处理。

    步骤:

    1.Nginx定义了一个核心模块ngx_events_module,该模块定义了事件类型的模块,为所有的事件模块解析events{}中的配置项,同时管理这些事件模块存储配置项的结构体

    2.Nginx定义了一个非常重要的事件模块ngx_event_core_module,这个模块会决定使用哪种事件驱动机制,以及如何管理事件

    3.Nginx定义了一系列(目前为9个)运行在不同操作系统、不同内核版本上的事件驱动模块。在ngx_event_module模块的初始化过程中,将会从以上9个模块中选取一个作为Nginx进程的事件驱动模块

    事件模块:ngx_module_t表示Nginx模块的基本接口,而针对于每一种不同类型的模块,都有一个结构体来描述这一类模块的通用接口,这个接口保存在ngx_module_t结构体的ctx成员中。比如:事件模块的通用接口是ngx_event_module_t结构体。

    typedef struct {

      ngx_str_t *name;//事件模块的名称

      void *(*create_conf)(ngx_cycle_t *cycle);//在解析配置项前,创建存储配置项参数的结构体

      //在解析配置项完成后,综合处理当前事件模块感兴趣的全部配置项

      char *(*init_conf)(ngx_cycle_t *cycle,void *conf);

      ngx_event_actions_t action;//每个事件模块需要实现的十个抽象方法

    }ngx_event_module_t;

    ngx_event_module_t中的actions成员是定义事件驱动模块的核心方法。ngx_event_core_module和9个事件驱动模块都必须在ngx_module_t结构体的ctx成员中实现ngx_event_module_t接口。

    二、Nginx事件的定义

    在Nginx中,每一个事件都由ngx_event_t结构体来表示。每一个事件最核心的部分是handler回调方法,它将由每一个事件消费模块实现,用于处理事件。

    typedef void (*ngx_event_handler_pt)(ngx_event_t *ev);

    一般向epoll(事件驱动模块)中添加可读或可写事件时,都是使用ngx_handle_read_event或者ngx_handle_write_event方法的。

    ngx_int_t ngx_handle_read_event(ngx_event_t *rev,ngx_uint_t flags);

    //rev是要操作的事件,flags将会指定事件的驱动方式

    ngx_int_t ngx_handle_write_event(ngx_event_t *wev,size_t lowat);

    //wev是要操作的事件,lowat表示只有当连接对应的套接字缓冲区中必须由lowat大小的可写空间时,事件收集器(如select或epoll_wait调用)才能处理这个可写事件。

    三、Nginx连接的定义

    作为Web服务器,每一个用户请求至少对应着一个TCP连接,为了处理这个连接,至少需要一个读事件和一个写事件,使得epoll可以有效地根据触发的事件调度相应模块读取请求或者发送响应。

    ngx_connection_t:客户端主动发起的,Nginx服务器被动接受的TCP连接(被动连接)

    ngx_peer_connection_t:nginx主动向其他上游服务器建立的连接

    ngx_peer_connection_t主动连接是以ngx_connection_t结构体为基础实现的,这两种连接都不可以随意创建,必须从连接池中获取。

    ngx_connection_t连接池:

    在ngx_cycle_t中的connections和free_connections这两个成员构成了一个连接池,其中connections指向整个连接池数组的首部,而free_connections则指向第一个ngx_connection_t空闲连接。所有的空闲连接ngx_connection_t都以data成员作为next指针串联成一个单链表,如此,一旦有用户发起连接时就从free_connection指向的链表头获取一个空闲的连接,同时free_connection再指向下一个空闲连接,而归还连接时只需把该连接插入到free_connections链表表头即可。

    事件池

    Nginx中每一个连接一定需要一个读事件和一个写事件,有多少连接就分配多少个读写事件。由于读事件、写事件、连接池是由3个相同大小的数组组成,所以根据数组序号就可将每一个连接、读事件、写事件对应起来,这个对应关系在ngx_event_core_module模块的初始化过程中就已经决定。这三个数组的大小由nginx.conf中的connections配置项决定。

    四、ngx_events_module核心模块

    功能:定义新的事件类型,并定义每个事件模块都需要实现的ngx_event_module_t接口,还需要管理这些事件模块生成的配置项结构体,并解析事件类配置项,在解析配置项时会调用其在ngx_command_t数组中定义的回调方法。

    ngx_events_commands数组决定了ngx_events_module模块是如何定制其功能的

    static ngx_command_t ngx_events_conmmands[]={

    {ngx_string("events"),

     NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,

     ngx_events_block,

    0,

    0,

    NULL},

    ngx_null_command  

    };

    作为核心模块,ngx_events_module还需要实现核心模块的共同接口ngx_core_module_t

    static ngx_core_module_t ngx_events_module_ctx={

      ngx_string("events"),

      NULL,

      NULL

    };

    管理所有事件模块的配置项

    每一个事件模块产生的配置结构体指针都会被放在ngx_events_module模块创建的指针数组中。

    管理事件模块

    截图待续

  • 相关阅读:
    2013/11/21工作随笔-PHP开启多进程
    php中mysql操作的buffer知识
    你不一定懂的cpu显示信息
    好文收藏系列(三)
    doctrine2到底是个什么玩意
    制作火焰图(纯笔记)
    《精通Linux内核必会的75个绝技》知识杂记
    BIG5, GB(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char说明与区别
    sed替换换行符“ ”
    mysql将字符串字段转为数字排序或比大小
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3853788.html
Copyright © 2011-2022 走看看