深入浅出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源码初探之事件模块 - 连接基数数据结构】
推荐阅读
- Android事件传递源码分析
- 深入浅出谈一下有关分布式消息技术(Kafka)
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- ffmpeg源码分析01(结构体)
- Java程序员阅读源码的小技巧,原来大牛都是这样读的,赶紧看看!
- Vue源码分析—响应式原理(二)
- 监控nginx
- SwiftUI|SwiftUI iOS 瀑布流组件之仿CollectionView不规则图文混合(教程含源码)
- java|java b2b2c shop 多用户商城系统源码- config 修改配置