nginx_http_phases

来源:互联网 发布:java调用支付宝接口 编辑:程序博客网 时间:2024/05/17 20:28
当接收到一个http请求的时候将解析其头部和body到ngx_http_request_t,接着将进行大量的phase操作。
一个http请求分11个phase, 处理是有顺序的,NGX_HTTP_POST_READ_PHASE为第一个,一个接着一个处理。
[cpp] view plaincopy
  1. typedef enum {  
  2.     //读取请求phase  
  3.     NGX_HTTP_POST_READ_PHASE = 0,                       //第一个  
  4.        
  5.     //开始处理  
  6.     //这个阶段主要是处理全局的(server block)的rewrite  
  7.     NGX_HTTP_SERVER_REWRITE_PHASE,  
  8.   
  9.     //这个阶段主要是通过uri来查找对应的location。然后将uri和location的数据关联起来  
  10.     NGX_HTTP_FIND_CONFIG_PHASE,  
  11.               
  12.     //这个主要处理location的rewrite。    
  13.     NGX_HTTP_REWRITE_PHASE,  
  14.     //post rewrite,这个主要是进行一些校验以及收尾工作,以便于交给后面的模块。  
  15.     NGX_HTTP_POST_REWRITE_PHASE,  
  16.       
  17.     //比如流控这种类型的access就放在这个phase,也就是说它主要是进行一些比较粗粒度的access。    
  18.     NGX_HTTP_PREACCESS_PHASE,  
  19.     //这个比如存取控制,权限验证就放在这个phase,一般来说处理动作是交给下面的模块做的.这个主要是做一些细粒度的access。  
  20.     NGX_HTTP_ACCESS_PHASE,  
  21.     //当上面的access模块得到access_code之后就会由这个模块根据access_code来进行操作  
  22.     NGX_HTTP_POST_ACCESS_PHASE,  
  23.     //try_file模块,也就是对应配置文件中的try_files指令。   
  24.     NGX_HTTP_TRY_FILES_PHASE,  
  25.     //内容处理模块,我们一般的handle都是处于这个模块,比如说模块扩展也将是该phase, 默认调用ngx_http_autoindex_module.c中的ngx_http_autoindex_handler handler    
  26.     NGX_HTTP_CONTENT_PHASE,  
  27.     //log模块   
  28.     NGX_HTTP_LOG_PHASE  
  29. } ngx_http_phases;  

在ngx_http_core_module.c文件中有一处理函数来处理这些phases,直到输出过滤到客户端。
[cpp] view plaincopy
  1. void  
  2. ngx_http_core_run_phases(ngx_http_request_t *r)  
  3. {  
  4.     ngx_int_t                   rc;  
  5.     ngx_http_phase_handler_t   *ph;  
  6.     ngx_http_core_main_conf_t  *cmcf;  
  7.   
  8.     cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);  
  9.   
  10.     ph = cmcf->phase_engine.handlers;  
  11.   
  12.     while (ph[r->phase_handler].checker) {              //循环phases         
  13.   
  14.         rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);  
  15.         if (rc == NGX_OK) {  
  16.             return;  
  17.         }  
  18.     }  

原创粉丝点击