request的使用
开发了一个http模块,挂在conten-phase阶段,
static char * ngx_http_ivms(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_core_loc_conf_t *clcf; clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); /* 设置回调函数。当请求的时候,会挪用此回调函数 */ clcf->handler = ngx_http_ivms_loc_handler; return NGX_CONF_OK; }
在ngx_http_ivms_loc_handler中读取包体,回调为ngx_http_ivms_handler;
static ngx_int_t ngx_http_ivms_loc_handler(ngx_http_request_t *r) { ngx_int_t rc; rc = ngx_http_read_client_request_body(r, ngx_http_ivms_handler); if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } // return NGX_OK; return NGX_DONE; }
在ngx_http_ivms_handler中措置惩罚惩罚包体并返回。
问题:
我想在措置惩罚惩罚完包体后销毁这个request,挪用ngx_http_finalize_request()之后发明连接没法再次接收请求,原因是r->main->count =2;在销毁请求过程中减一,发明还有引用,所以没有销毁请求而是直接返回了。
cgdb调试nginx,watch r->main->count(没有子请求,所以这就是r->count),,发此刻创建r的时候r->count++,在ngx_http_read_client_request_body的时候r->count++;
解决:
我检察了nginx中ngx_http_read_client_request_body的使用,在其回调函数中并没有找到r->count--,风闻在另外处所有减,但是我直接在其回调中r->count--,问题解决。
总结:
debug的时候发明,https://blog.csdn.net/ApeLife/article/details/74780059 这篇博文说的对:“到此,需要正常的封锁http请求了,但会不会顿时就封锁请求要看引用计数,引用计数为0则会封锁请求,但并不必然会顿时封锁tcp连接,因为有可能开启了keepalive机制或者延迟封锁机制。也就是说引用计数决定是否需要封锁http请求,而keepalive机制或者延迟封锁机制则决定是否需要封锁tcp连接。”
请求中Connection: close,则r->keepalive =1时,不会直接销毁会话,需要设置r->cln,当销毁同一个connection的request的时候,会挪用之前r->cln->handler,做清理事情;
请求中Connection: close,则r->keepalive=0时,request措置惩罚惩罚完,直接销毁会话。
ngx_http_finalize_request的使用
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/29354.html