http { server { location ~ \.php$ { #proxy_pass命令在http_proxy_module中的被ngx_http_proxy_pass函数实现 proxy_pass http://127.0.0.1; } } }
////// nginx/src/http/ngx_http.c //////// static ngx_int_t ngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf) { //申请指针数组,用于存储该阶段的处理函数指针 if (ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers, cf->pool, 1, sizeof(ngx_http_handler_pt)) != NGX_OK) { return NGX_ERROR; } ..... return NGX_OK; } ///// nginx/src/http/modules/ngx_http_rewrite_module.c ///// // 该函数是在rewrite的postconfiguration阶段被调用 static ngx_int_t ngx_http_rewrite_init(ngx_conf_t *cf) { ..... //获取rewrite命令对应的core_module配置结构 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); //在&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers指向的数组中申请一个函数指针空间 h = ngx_array_push(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers); if (h == NULL) { return NGX_ERROR; } //将函数添加到数组中新申请的元素中 *h = ngx_http_rewrite_handler; ...... return NGX_OK; } ////// nginx/src/http/ngx_http.c //////// //遍历各个PHASE,给每个PHASE添加相关的checker函数,并将各个phase阶段注册的函数按照phase+数组index的顺序统一添加到一个phase_engine中,每个phase handler函数都会由唯一的index标识,便于之后的遍历使用 static ngx_int_t ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf) { for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) { h = cmcf->phases[i].handlers.elts; switch (i) { case NGX_HTTP_SERVER_REWRITE_PHASE: if (cmcf->phase_engine.server_rewrite_index == (ngx_uint_t) -1) { cmcf->phase_engine.server_rewrite_index = n; } //根据phase阶段确定每个阶段对应的checker checker = ngx_http_core_rewrite_phase; break; ..... ..... default: checker = ngx_http_core_generic_phase; } n += cmcf->phases[i].handlers.nelts; //遍历各个phase handlers数组中的注册函数并统一添加到cmcf->phase_engine.handlers中 for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--) { ph->checker = checker; ph->handler = h[j]; ph->next = n; ph++; } } return NGX_OK; }
//////// nginx/src/http/ngx_http_core_module.c ///// void ngx_http_update_location_config(ngx_http_request_t *r) { ngx_http_core_loc_conf_t *clcf; clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); .... //如果对应command存在直接的handler函数,就直接调用 if (clcf->handler) { r->content_handler = clcf->handler; } } ngx_int_t ngx_http_core_content_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph) { .... if (r->content_handler) { r->write_event_handler = ngx_http_request_empty_handler; //如果存在的话就直接执行该handler函数并跳过content阶段的其他处理函数 ngx_http_finalize_request(r, r->content_handler(r)); return NGX_OK; } ..... } //调用各个所有phase中的函数完成对request的处理 void ngx_http_core_run_phases(ngx_http_request_t *r) { .... while (ph[r->phase_handler].checker) { //根据请求中的phase索引确定执行的checker函数 //checker函数根据处理结果来决定是结束处理还是继续下一个phase handler rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]); if (rc == NGX_OK) { return; } } }
///// nginx/src/http/ngx_http_core_module.c /////// ngx_int_t ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in) { ..... //通过链表接口来一次遍历各个filter模块进行处理 rc = ngx_http_top_body_filter(r, in); ..... return rc; } ///// nginx/src/http/ngx_http_copy_filter_module.c ////////// //在postconfiguration阶段被调用,初始化filter handler链表 static ngx_int_t ngx_http_copy_filter_init(ngx_conf_t *cf) { ngx_http_next_body_filter = ngx_http_top_body_filter; ngx_http_top_body_filter = ngx_http_copy_filter; return NGX_OK; } //将本阶段输出执行链表中下一个filter handler函数 static ngx_int_t ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in) { ..... ..... ngx_http_set_ctx(r, ctx, ngx_http_copy_filter_module); //记录下一个要执行的filter ctx->output_filter = (ngx_output_chain_filter_pt) ngx_http_next_body_filter; ctx->filter_ctx = r; .... .... rc = ngx_output_chain(ctx, in); ..... return rc; }
原文:http://www.cnblogs.com/sxhlinux/p/6748191.html