Nginx源码初探之HTTP模块 -HTTP框架处理阶段

      Nginx模块化设计使得每个HTTP模块都可以专注于完成一个独立的、简单的功能,而一个请求的完整处理过程可以由无数个HTTP模块共同完成。依照常规的HTTP处理流程,Nginx将这些HTTP模块分为11个处理阶段,对于这11个处理阶段,其中有4个是必须有HTTP框架完成的,其他的7个是可以有HTTP模块协同完成。理解这11个阶段有助于理解HTTP框架对HTTP请求的处理。, 并不是说一个用户请求最多只能经过11个HTTP模块提供的ngx_http_handler_pt方法来处理, NGX_HTTP_POST_READ_PHASE、NGX_HTTP_SERVER_REWRITE_PHASE、 NGX_HTTP_REWRITE_PHASE、NGX_HTTP_PREACCESS_PHASE、 NGX_HTTP_ACCESS_PHASE、NGX_HTTP_CONTENT_PHASE,NGX_HTTP_LOG_PHASE这7个阶段可以包括任意多个处理方法,它们是可以同时作用于同一个用户请求的。 而NGX_HTTP_FIND_CONFIG_PHASE、 NGX_HTTP_POST_REWRITE_PHASE、NGX_HTTP_POST_ACCESS_PHASE、 NGX_HTTP_TRY_FILES_PHASE这4个阶段则不允许HTTP模块加入自己的ngx_http_handler_pt方法处理用户请求, 它们仅由HTTP框架实现。
1.NGX_HTTP_POST_READ_PHASE阶段
       当HTTP框架在建立TCP连接后,再接收完HTTP请求头,重定向url之前开始执行该阶段的checker方法。目前ngx_http_relip_module模块从NGX_HTTP_POST_READ_PHASE阶段介入HTTP请求,他在postconfiguration方法中将自定义的ngx_http_handler_pt处理方法添加到HTTP框架。
2.GX_HTTP_SERVER_REWRITE_PHASE阶段和NGX_HTTP_REWRITE_PHASE阶段                 NGX_HTTP_SERVER_REWRITE_PHASE阶段的checker方法是ngx_http_core_rewrite_phase。该阶段的返回值有6个值,三种情况,分别对应处理中NGX_DONE,处理完毕NGX_DECLINED ,处理结束(NGX_AGAIN,NGX_DONE,NGX_ERROR)ngx_http_rewrite_module模块定义了ngx_http_rewrite_handler方法, 同时将它
添加到了NGX_HTTP_SERVER_REWRITE_PHASE和NGX_HTTP_REWRITE_PHASE阶段。
3.NGX_HTTP_FIND_CONFIG_PHASE阶段
     该阶段是HTTP框架基于location设计的基石,不可跳过,任何一个HTTP模块不可以项这个极端添加方法。
4.NGX_HTTP_REWRITE_PHASE阶段
      NGX_HTTP_FIND_CONFIG_PHASE阶段检索到location后有机会再次利用rewrite(重
写) URL,这一工作就是在NGX_HTTP_REWRITE_PHASE阶段完成的。它的checker方法都是ngx_http_core_rewrite_phase。
5.GX_HTTP_POST_REWRITE_PHASE阶段
       NGX_HTTP_POST_REWRITE_PHASE阶段就像NGX_HTTP_FIND_CONFIG_PHASE阶段一样, 只能由HTTP框架实现,不允许HTTP模块向该阶段添加ngx_http_handler_pt处理方法。NGX_HTTP_POST_REWRITE_PHASE阶段的checker方法是
ngx_http_core_post_rewrite_phase, 它的意义在于检查rewrite重写URL的次数不可以超过10次,以此防止由于rewrite死循环而造成整个Nginx服务都不可用。
6。NGX_HTTP_PREACCESS_PHASE阶段
      NGX_HTTP_PREACCESS_PHASE阶段一般用于对当前请求进行限制性处理
7.NGX_HTTP_ACCESS_PHASE阶段
NGX_HTTP_ACCESS_PHASE阶段与NGX_HTTP_PREACCESS_PHASE阶段大不相同,这主要体现在它的checker方法是ngx_http_core_access_phase上。
8.NGX_HTTP_POST_ACCESS_PHASE阶段
       NGX_HTTP_POST_ACCESS_PHASE阶段又是一个只能由HTTP框架实现的阶段, 不允
许HTTP模块向该阶段添加ngx_http_handler_pt处理方法。NGX_HTTP_POST_ACCESS_PHASE阶段的checker方法是
ngx_http_core_post_access_phase, 它的工作非常简单, 就是检查ngx_http_request_t请求中的access_code成员, 当其不为0时就结束请求(表示没有访问权限) ,否则继续执行下一个
ngx_http_handler_pt处理方法。
10.NGX_HTTP_TRY_FILES_PHASE阶段
      NGX_HTTP_TRY_FILES_PHASE阶段也是一个只能由HTTP框架实现的阶段, 不允许
HTTP模块向该阶段添加ngx_http_handler_pt处理方法。NGX_HTTP_TRY_FILES_PHASE阶段的checker方法是ngx_http_core_try_files_phase,它是与nginx.conf中的try_files配置项密切相关的,如果try_files后指定的静态文件资源中有一个可以访问, 这时就会直接读取文件并发送响应给用户,.
11.NGX_HTTP_CONTENT_PHASE阶段
      这是一个核心HTTP阶段,可以说大部分HTTP模块都会在此阶段重新定义Nginx服务器的行为。他提供了介入HTTP模块的两种方式。第一种通过向全局变量ngx_http_core_main_conf_t结构体的phases数组中添加ngx_http_handler_pt处理方法来实现。第二种通过ngx_http_handler_pt方法设置到location相关的ngx_http_core_loc_conf_t结构体的handler指针中。
12.NGX_HTTP_LOG_PHASE阶段
日志记录

总的来说HTTP框架大部分阶段是在:重写URL,查询location配置,判断请求权限,读取静态资源文件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值