nginx源码分析-ngx_http_phases说明

来源:互联网 发布:朱炫 知乎 编辑:程序博客网 时间:2024/06/07 01:53
  • auth:农夫-Ben
  • email:szjava#126.com(请把#换成@)
  • blog:http://blog.csdn.net/zll_liang
当接收到一个http请求的时候将解析其头部和body到ngx_http_request_t,接着将进行大量的phase操作。
一个http请求分11个phase, 处理是有顺序的,NGX_HTTP_POST_READ_PHASE为第一个,一个接着一个处理。
typedef enum {    //读取请求phase    NGX_HTTP_POST_READ_PHASE = 0,                       //第一个         //开始处理    //这个阶段主要是处理全局的(server block)的rewrite    NGX_HTTP_SERVER_REWRITE_PHASE,    //这个阶段主要是通过uri来查找对应的location。然后将uri和location的数据关联起来    NGX_HTTP_FIND_CONFIG_PHASE,                //这个主要处理location的rewrite。      NGX_HTTP_REWRITE_PHASE,    //post rewrite,这个主要是进行一些校验以及收尾工作,以便于交给后面的模块。    NGX_HTTP_POST_REWRITE_PHASE,        //比如流控这种类型的access就放在这个phase,也就是说它主要是进行一些比较粗粒度的access。      NGX_HTTP_PREACCESS_PHASE,    //这个比如存取控制,权限验证就放在这个phase,一般来说处理动作是交给下面的模块做的.这个主要是做一些细粒度的access。    NGX_HTTP_ACCESS_PHASE,    //当上面的access模块得到access_code之后就会由这个模块根据access_code来进行操作    NGX_HTTP_POST_ACCESS_PHASE,    //try_file模块,也就是对应配置文件中的try_files指令。     NGX_HTTP_TRY_FILES_PHASE,    //内容处理模块,我们一般的handle都是处于这个模块,比如说模块扩展也将是该phase, 默认调用ngx_http_autoindex_module.c中的ngx_http_autoindex_handler handler      NGX_HTTP_CONTENT_PHASE,    //log模块     NGX_HTTP_LOG_PHASE} ngx_http_phases;

在ngx_http_core_module.c文件中有一处理函数来处理这些phases,直到输出过滤到客户端。
voidngx_http_core_run_phases(ngx_http_request_t *r){    ngx_int_t                   rc;    ngx_http_phase_handler_t   *ph;    ngx_http_core_main_conf_t  *cmcf;    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);    ph = cmcf->phase_engine.handlers;    while (ph[r->phase_handler].checker) {              //循环phases               rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);        if (rc == NGX_OK) {            return;        }    }}


原创粉丝点击