nginx-0.8.38源码探秘(六)

来源:互联网 发布:org.apache.poi jar包 编辑:程序博客网 时间:2024/06/05 19:57

 

本文档的Copyleft归L.L所有,使用GPL发布,可以自由转载,转载时请务必以超链接形式标明文章原始出处,严禁用于任何商业用途。

email: cc.dd.14@163.com
来源: http://blog.csdn.net/ccdd14

开始进入ngx_http_core_run_phases函数,它循环调用各http phase的checker。

 

先看看,在默认配置下,且不设置try_files指令,注册的checker和handler分别如下:

 

因为r->phase_handler==0,第一个调用的checker是ngx_http_core_generic_phase,handler是ngx_http_rewrite_handler,然后按下标顺序逐个调用。

ngx_http_core_generic_phase做的事就是调用相应的handler,ngx_http_rewrite_handler则是根据rewrite相关的指令对http请求进行处理。

ngx_http_core_find_config_phase则是根据location指令进行处理,ngx_http_core_find_location查找匹配的location。

ngx_http_core_post_rewrite_phase判断uri rewrite的次数,没有重写过,则进入下一个phase,这时是ph[4]=ngx_http_core_generic_phase。如果重写次数过多(超过11次),则调用ngx_http_finalize_request返回错误应答,如果重写次数没有达到阈值,则进入的phase为ngx_http_core_find_config_phase。

ngx_http_core_access_phase先判断是否为子请求,如果r != r->main,则为子请求。然后调用的对应的handler,第一个是ngx_http_access_handler处理ip的访问控制,查看配置是否允许该请求访问。第二个是ngx_http_auth_basic_handler,处理基于用户名和密码的访问控制。

ngx_http_core_post_access_phase查看是否有拒绝的请求,如果r->access_code != 0,则有非法的请求。

ngx_http_core_content_phase主要是调用对应的handler:

1. 首先调用的是ngx_http_index_handler,它打开index指令配置

的根文件:index.html。如果http request header的uri不以"/"结尾,返回NGX_DECLINED;否则在最后会调用

ngx_http_internal_redirect,这个函数是实现nginx的internal redirect的方式之一,在修改了request header后,又会重新调用

ngx_http_handler,重新进行http处理流程

2. 接着调用ngx_http_autoindex_handler;

3. 最后调用ngx_http_static_handler,主要功能是设置response header和body。设置head_out,content_type之后,

ngx_http_send_header调用ngx_http_top_header_filter链:

这条链的filter按调用顺序如下:

ngx_http_header_filter最后会调用ngx_http_write_filter,关于这个函数的源码分析可以查看

http://www.mindpin.com/rss_items/1291,做的讲解还是比较详细的。

ngx_http_static_handler在最后调用ngx_http_output_filter,而ngx_http_output_filter则遍历ngx_http_top_body_filter,调用的filter如下:

 

ngx_http_core_content_phase处理完所有的handler后,会调用ngx_http_finalize_request来结束整个http的处理流程。

OK,nginx的处理流程分析完成!

原创粉丝点击