1、connection
connection顾名思义,表示的是连接,但是结构体是在nginx进程启动时创建的,在创建connection时,会分配相同多少的read和write事件处理结构体,其中事件结构体与connection是一一绑定关系
connection中的buffer有可能是处理上一个请求时创建的,所以使用时需要初始化。为什么呢,这依赖于nginx的设计,也就是connection从感觉上来说,是比应用层要低一点,拿HTTP来说,connection的生命周期要比request要长,当http最终释放时,必须放回connection。那么就有一种这样的情况,当request尚未创建,但新建数据到来时,可能会发生错误,此时其实不需要创建request的,而且创建了request以后,数据还是得先用connection的buffer来接收,再拷贝到request的buffer中去。
2、event
表示事件,但是加了timer功能,且回调函数是同一个。所以在回调函数中首先统一判断时间超时即可。
3、request
表示一个http请求,创建connection后或者在connection keepalive触发后进行创建,也就是说request的创建是晚于connection,那么销毁呢?在销毁request时,不一定会销毁connection;但是如果要销毁connection,那么一定会销毁request。connection属于基础设施,connection的生命周期由应用层模块来管理。
创建request时,connection的buffer会设置给request的header_in,如果放不下将会创建一个更大的buffer来存放请求。从名字来看,header_in就是用来读入头部的buffer,那么包体部分呢,nginx的http框架,在读入包体以后就开始解析头部,头部解析完成以后,需要在handler中来调用ngx_http_read_client_request_body来读取请求的body部分,但是,此时可能有一部分包体已经被读取到header_in中。
成员ctx:在调用ngx_http_create_request时会根据http module的数量分配空间,用处是当自定义module时,可能需要将一些信息保存到request中,但是又不能直接修改request的结构体(破坏完整性),那么此时就需要有空间来存放自定义的request附属信息,ctx就是用来保存这些信息。实质是一个数组,大小为ngx_http_max_module,每个成员是一个void *,当要使用时,需要在request的pool中创建相应的结构体,然后保存在响应的位置。ngx_http_get_module_ctx:获取相应的结构体,ngx_http_set_ctx:设置相应的结构体。
------------------------
对于一条长流来说,每个响应转发完全以后,应该返回框架一个NGX_DONE,这表示的是该请求已经处理完成,如果没有子请求则销毁request,如果connection需要保持,connection不销毁,并设置回调函数为ngx_http_keepalive_handler;否则销毁connection,并回收。
阅读(1505) | 评论(0) | 转发(0) |