本文的重点是详细介绍nginx对http请求解析各个阶段的分析的相关信息。原文根据示例代码非常详细,对大家的学习培训或者工作都有一定的参考价值。有必要的朋友陪我去了解一下。
在编写nginx的http的模块时,需要在每个阶段相对解决http请求,以达到不同的目的,比如请求时是否有访问限制,内容形成时是否过度考虑,或者其他解决方法。如果在编译器nginx模块中申请注册的求解阶段出现了误解,无法达到想要的结果,比如想要求解内容,此时内容实际上是不可用的,等等。
在nginx内部,定义了几个阶段来考虑不同的解决方案(在ngx_http_core_module.h中,不同的版本有不同的编号):
typedefenum{ NGX_HTTP_POST_READ_PHASE=0, NGX_HTTP_SERVER_REWRITE_PHASE, NGX_HTTP_FIND_CONFIG_PHASE, NGX_HTTP_REWRITE_PHASE, NGX_HTTP_POST_REWRITE_PHASE, NGX_HTTP_PREACCESS_PHASE, NGX_HTTP_ACCESS_PHASE, NGX_HTTP_POST_ACCESS_PHASE, NGX_HTTP_TRY_FILES_PHASE, NGX_HTTP_CONTENT_PHASE, NGX_HTTP_LOG_PHASE }ngx_http_phases;相应的含义是:
NGX_HTTP_POST_READ_PHASE=0//载入请求阶段 NGX_HTTP_SERVER_REWRITE_PHASE//URI变换阶段 NGX_HTTP_FIND_CONFIG_PHASE//搜索相对的配备来实行阶段 NGX_HTTP_REWRITE_PHASE//URI变换阶段(不太清晰这里) NGX_HTTP_POST_REWRITE_PHASE//对变换后的URL結果开展解决的阶段 NGX_HTTP_PREACCESS_PHASE//管理权限查验提前准备阶段 NGX_HTTP_ACCESS_PHASE//管理权限查验阶段 NGX_HTTP_POST_ACCESS_PHASE//对管理权限查验結果开展解决阶段 NGX_HTTP_TRY_FILES_PHASE//解决配备中的try_files阶段 NGX_HTTP_CONTENT_PHASE//解决形成返回数据阶段(这里觉得不过细,自然有filter还可以忽视) NGX_HTTP_LOG_PHASE//纪录日志解决阶段,实际表明理应是请求进行后,关掉请求时解决从这个设备可以分析出nginx的请求解析的所有步骤,从头到尾都是执行的。可以看出,日志是在最后阶段实现的,内容片段的解析一般在过滤模块中完成。NGX_HTTP_LOG_PHASE阶段申请注册的解析段无法获取返回数据,返回数据发送到手机客户端后立即释放。所以每个阶段求解的时候都要明确这个阶段的数据准备状态。
一般情况下,我们可以按照以下方法申请注册自己的解决方案模块:
staticngx_int_t ngx_http_xxx_init(ngx_conf_t*cf) { ngx_http_handler_pt*h; ngx_http_core_main_conf_t*cmcf; cmcf=ngx_http_conf_get_module_main_conf(cf,ngx_http_core_module); h=ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); if(h==NULL){ returnNGX_ERROR; } *h=ngx_http_xxx_handler; returnNGX_OK; }而ngx_http_xxx_up_handler的返回值只有如下:
NGX_OK//解决取得成功,进到下一阶段 NGX_DECLINED//舍弃解决 NGX_AGAIN||NGX_DONE//解决进行,返回该会开启请求 NGX_ERROR||NGX_HTTP_..//错误处理或是HTTP的其他状态值另外,对于NGX_HTTP_CONTENT_PHASE阶段,其实还有另外一种方法可以申请注册,就像这样:
staticchar* ngx_http_xxx_server(ngx_conf_t*cf,ngx_command_t*cmd,void*conf) { ngx_str_t*value; ngx_url_tu; ngx_http_core_loc_conf_t*clcf; clcf=ngx_http_conf_get_module_loc_conf(cf,ngx_http_core_module); clcf->handler=ngx_http_xxx_handler; if(clcf->name.data[clcf->name.len-1]=='/'){ clcf->auto_redirect=1; } returnNGX_CONF_OK; }但是像这样,你需要做的项目太多了。在很多情况下,考虑到上游的集成或者请求的唯一解决方案,比如分布式系统的分布,就需要解决请求和系统文件的关系,比如当请求的数据被立即交给一个唯一的服务器来获取内容。呵呵。
到目前为止,这篇关于nginx的http请求解析每个阶段的详细分析的文章已经在这里详细介绍过了。有关nginx的http请求解析的大量详细分析,请搜索您以前的文章或再次访问下面的相关文章。期待你以后的申请!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)