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的处理流程分析完成!
- nginx-0.8.38源码探秘(六)
- nginx-0.8.38源码探秘(一)
- nginx-0.8.38源码探秘(二)
- nginx-0.8.38源码探秘(三)
- nginx-0.8.38源码探秘(四)
- nginx-0.8.38源码探秘(五)
- nginx 源码安装(六)
- nginx源码学习(六)
- C#探秘系列(六)
- epoll源码探秘(epoll_create)
- epoll源码探秘(epoll_ctl)
- nginx 源码学习笔记(六)
- Glance源码架构探秘(一)
- Glance源码架构探秘(二)
- Glance源码架构探秘(三)
- Glance源码架构探秘(四)
- nginx 源码学习笔记(六)——nginx基本数据结构
- nginx 源码学习笔记(六)——nginx基本数据结构
- ubuntu 使用gspca安装摄像头
- linux gspca usb摄像头驱动添加对新型号的详细移植步骤
- 无线网络摄像头Linux 下摄像头驱动支持情况
- 第一章 C语言概论
- zc301摄像头驱动以及在S3C2410中使用serfox和spcaview
- nginx-0.8.38源码探秘(六)
- 摄像头(WebCam)在Linux中采用Spcaserv 架设网络视频服务器 (v0.1b)
- web安全闲谈
- U盘给Linux安装网卡驱动的方法
- ubuntu10.04|vnc4server
- 答辩完毕
- nfl
- 一种基于云计算方式的任务处理模型
- Hibernate高级实体关联映射之多值的实体关联(用组件类实现三重关联,单向导航)