深入浅出Nginx|Nginx源码初探之事件模块 - 连接基数数据结构

Nginx事件处理模型是Nginx事件处理的核心,充分体现了最简业务原则和分段处理的架构理念。
作为Web服务器,Nignx每一个用户请求至少对于一个TCP连接,一个TCP连接至少需要一个读事件和一个写事件(分段原则的体现,即使很简单很明确的需求也会分段处理。)。在这里我们必须理解Nginx事件的定义和连接的定义。事件定义的基本数据结构是ngx_event_t,连接定义的基本数据结构是ngx_connect_t。
1.事件定义
Nginx事件定义有两个基础事件和AIO事件,每个事件最核心的部分是handler回调方法,handler将由事件消费者实现,它决定事件的最终处理方式。Nginx事件驱动模型有很多种,所以ngx_event_s事件定义中很多字段也都是有针对性的,需要在特定事件驱动模式下才有意义,我们只需要掌握关于TCP处理的最基础的就可以,其他的在学习具体的事件驱动模式的时候,慢慢掌握。

/*基础事件定义*/ struct ngx_event_s { void*data; /*指向数据的指针*/unsignedwrite:1; /*事件可写,即TCP连接(事件处理可以理解为TCP请求处理)状态可以发送网络报文*/unsignedaccept:1; /*是否可以接受新的连接,由核心框架中的worker进程直接控制*//* 过期事件是否需要在事件驱动模块处理,结合前面的ngx_posted_accept_events理解*/ unsignedinstance:1; /* * the event was passed or would be passed to a kernel; * in aio mode - operation was posted. */ unsignedactive:1; /*事件禁用在kqueue或者rtsig中有效,在epoll事件中无效*/ unsigneddisabled:1; /* AIO 处理模式,事件处于可处理状态*/ unsignedready:1; unsignedoneshot:1; /*在AIO模式下标示有请求事件处理*//* aio operation is complete */ unsignedcomplete:1; /*在AIO模式下事件处理完成*/unsignedeof:1; unsignederror:1; unsignedtimedout:1; unsignedtimer_set:1; unsigneddelayed:1; unsigneddeferred_accept:1; /* the pending eof reported by kqueue, epoll or in aio chain operation */ unsignedpending_eof:1; unsignedposted:1; unsignedclosed:1; /* worker进程退出标志位,管理进程中的资源处理状态to test on worker exit */ unsignedchannel:1; unsignedresolver:1; unsignedcancelable:1; #if (NGX_HAVE_KQUEUE) unsignedkq_vnode:1; /* the pending errno reported by kqueue */ intkq_errno; #endif/* * kqueue only: *accept:number of sockets that wait to be accepted *read:bytes to read when event is ready *or lowat when event is set with NGX_LOWAT_EVENT flag *write:available space in buffer when event is ready *or lowat when event is set with NGX_LOWAT_EVENT flag * * iocp: TODO * * otherwise: *accept:1 if accept many, 0 otherwise *read:bytes to read when event is ready, -1 if not known */intavailable; ngx_event_handler_pthandler; #if (NGX_HAVE_IOCP) ngx_event_ovlp_t ovlp; #endifngx_uint_tindex; ngx_log_t*log; ngx_rbtree_node_ttimer; /*超时处理机制, 使用红黑树管理*//* the posted queue */ ngx_queue_tqueue; /* event事件处理队列 */#if 0/* the threads support *//* * the event thread context, we store it here * if $(CC) does not understand __thread declaration * and pthread_getspecific() is too costly */void*thr_ctx; #if (NGX_EVENT_T_PADDING)/* event should not cross cache line in SMP */uint32_tpadding[NGX_EVENT_T_PADDING]; #endif #endif };

2.连接定义
Nginx的连接分为主动连接和被动连接。主动连接是指Nginx服务器主动向客户端或者其他服务器建立的连接,被动连接是指客户端向Nginx服务器发送的连接。分别对应于ngx_connection_t和ngx_peer_connection_t,ngx_connection_t在之前的章节中介绍过,这里主要介绍ngx_peer_connection_s,ngx_peer_connection_s自有定义主要定义了远端服务器信息和服务器的管理信息,详细见注释。
struct ngx_peer_connection_s { ngx_connection_t*connection; /*TCP连接的基础信息*/struct sockaddr*sockaddr; /*远端服务器地址*/ socklen_tsocklen; /*远端服务器地址长度*/ ngx_str_t*name; /*远端服务器名称*/ngx_uint_ttries; /*连接失败后重试次数*/ ngx_msec_tstart_time; ngx_event_get_peer_ptget; /**/ ngx_event_free_peer_ptfree; ngx_event_notify_peer_ptnotify; void*data; #if (NGX_SSL || NGX_COMPAT) ngx_event_set_peer_session_ptset_session; ngx_event_save_peer_session_ptsave_session; #endifngx_addr_t*local; inttype; intrcvbuf; ngx_log_t*log; unsignedcached:1; unsignedtransparent:1; unsignedso_keepalive:1; unsigneddown:1; /* ngx_connection_log_error_e */ unsignedlog_error:2; NGX_COMPAT_BEGIN(2) NGX_COMPAT_END };

【深入浅出Nginx|Nginx源码初探之事件模块 - 连接基数数据结构】

    推荐阅读