HTTP请求的11个处理阶段

摘自 陶辉 深入理解Nginx

几乎所以有关Nginx书只要是讲深入点的就会讲到Nginx请求的11个处理阶段,要记住这些真是不易,人脑特别不擅长记住各种东西,只能做些索引罢了,能做到知道这个知识点在哪儿能找到不就行了,可是你去面试还是问这些理论,所以这里汇总下记录如下

ngx_http_phases阶段定义

typedef enum {
    // 在接收到完整的HTTP头部后处理的HTTP阶段
    NGX_HTTP_POST_READ_PHASE = 0,

    /*在将请求的URI与location表达式匹配前,修改请求的URI(所谓的重定向)是一个独立的HTTP阶段*/
    NGX_HTTP_SERVER_REWRITE_PHASE,

    /*根据请求的URI寻找匹配的location表达式,这个阶段只能由ngx_http_core_module模块实现,不建议其他HTTP模块重新定义这一阶段的行为*/
    NGX_HTTP_FIND_CONFIG_PHASE,

    /*在NGX_HTTP_FIND_CONFIG_PHASE阶段寻找到匹配的location之后再修改请求的URI*/
    NGX_HTTP_REWRITE_PHASE,

    /*这一阶段是用于在rewrite重写URL后,防止错误的nginx.conf配置导致死循环(递归地修改URI),因此,这一阶段仅由ngx_http_core_module模块处理。目前,控制死循环的方式很简单,首先检查rewrite的次数,如果一个请求超过10次重定向,就认为进入了rewrite死循环,这时在NGX_HTTP_POST_REWRITE_PHASE阶段就会向用户返回500,表示服务器内部错误*/
    NGX_HTTP_POST_REWRITE_PHASE,

    /*表示在处理NGX_HTTP_ACCESS_PHASE阶段决定请求的访问权限前,HTTP模块可以介入的处理阶段*/
    NGX_HTTP_PREACCESS_PHASE,

    // 这个阶段用于让HTTP模块判断是否允许这个请求访问Nginx服务器
    NGX_HTTP_ACCESS_PHASE,

    /*在NGX_HTTP_ACCESS_PHASE阶段中,当HTTP模块的handler处理函数返回不允许访问的错误码时(实际就是NGX_HTTP_FORBIDDEN或者NGX_HTTP_UNAUTHORIZED),这里将负责向用户发送拒绝服务的错误响应。因此,这个阶段实际上用于给NGX_HTTP_ACCESS_PHASE阶段收尾*/
    NGX_HTTP_POST_ACCESS_PHASE,

    /*这个阶段完全是为try_files配置项而设立的,当HTTP请求访问静态文件资源时,try_files配置项可以使这个请求顺序地访问多个静态文件资源,如果某一次访问失败,则继续访问try_files中指定的下一个静态资源。这个功能完全是在NGX_HTTP_TRY_FILES_PHASE阶段中实现的*/
    NGX_HTTP_TRY_FILES_PHASE,

    // 用于处理HTTP请求内容的阶段,这是大部分HTTP模块最愿意介入的阶段
    NGX_HTTP_CONTENT_PHASE,

    /*处理完请求后记录日志的阶段。例如,ngx_http_log_module模块就在这个阶段中加入了一个handler处理方法,使得每个HTTP请求处理完毕后会记录access_log访问日志*/
    NGX_HTTP_LOG_PHASE
} ngx_http_phases;
  • NGX_HTTP_POST_READ_PHASE阶段
  • NGX_HTTP_SERVER_REWRITE_PHASE阶段
  • NGX_HTTP_FIND_CONFIG_PHASE阶段
  • NGX_HTTP_REWRITE_PHASE阶段
  • NGX_HTTP_POST_REWRITE_PHASE阶段
  • NGX_HTTP_PREACESS_PHASE阶段
  • NGX_HTTP_ACCESS_PHASE阶段
  • NGX_HTTP_POST_ACCESS_PHASE阶段
  • NGX_HTTP_TRY_FILES_PHASE阶段
  • NGX_HTTP_LOG_PHASE阶段

原文地址:https://blog.51cto.com/jerrymin/2357404

时间: 2024-08-03 09:25:15

HTTP请求的11个处理阶段的相关文章

【Nginx】HTTP请求的11个处理阶段

Nginx将一个HTTP请求分成多个阶段,以模块为单位进行处理.这样做的好处是使处理过程更加灵活.降低耦合度.HTTP框架将处理分成了11个阶段,各个阶段以流水线的方式处理请求.这11个HTTP阶段如下所示: typedef enum { NGX_HTTP_POST_READ_PHASE = 0, // 接收到完整的HTTP头部后处理的阶段 NGX_HTTP_SERVER_REWRITE_PHASE, // URI与location匹配前,修改URI的阶段,用于重定向 NGX_HTTP_FIND

Nginx处理请求的11个阶段

Nginx 处理请求的全过程一共划分为 11 个阶段(如图),按阶段由上到下依次执行 (上一阶段的所有指令执行完毕,才进入下一阶段) 各阶段的含义如下: ² post-read: 接收到完整的http头部后处理的阶段,在uri重写之前.一般跳过 ² server-rewrite: location匹配前,修改uri的阶段,用于重定向,location块外的重写指令(多次执行) ² find-config: uri寻找匹配的location块配置项(多次执行) ² rewrite: 找到locat

http请求到响应经历的阶段

浏览器输入url经历图 分析过程: 1.用户输入url,浏览器内部代码将url进行拆分解析 url解析图 2.浏览器首先去找本地的hosts文件,检查在该文件中是否有相应的域名.IP对应关系,如果有,则向其IP地址发送请求,如果没有就会将domain(域)发送给 dns(域名服务器)进行解析(解析如下图),将域名解析成对应的服务器IP地址,发回给浏览器 DNS解析domian过程图 注释:(结合上图看) 浏览器客户端向本地DNS服务器发送一个含有域名www.cnblogs.com的DNS查询报文

2016.11.6新阶段开始

1.框架和第三方 学习的内容已经准备就绪: 主要安排如下: 2.剩余的关键就是怎么把工作和学习 区分开.高效工作的同时,把学习内容也补上:这个两个月是实习期转正的关键期,我需要作出努力,所以有点矛盾: 但是,学习如果拉下了,那么工作还有意义吗?经过反复问自己,工作为重,而且坚决不可以在拖了,工作内容赶紧提交测试吧: 学习的东西也不能拉下,这里面一定有办法找到平衡点: 解决办法:每天观察工作内容为先,然后安排学习内容:尽快找到感觉,不然很麻烦: 这两个月需要特别注意的事情是,轻声说话,千万轻声说话

【Nginx】开发一个简单的HTTP模块

首先来分析一下HTTP模块是如何介入Nginx的. 当master进程fork出若干个workr子进程后,每个worker子进程都会在自己的for死循环中不断调用事件模块: for ( ;; ) { .... ngx_process_events_and_timers(cycle); /* 调用事件模块 */ .... } 事件模块检测是否有TCP连接请求,当收到一个SYN包后,由事件模块建立一条TCP连接.连接建立成功后,交由HTTP框架处理,HTTP框架负责接收HTTP头部,并根据头部信息将

Nginx 中 HTTP模块初始化

概述 在前面的文章< Nginx 配置解析>简单讲解了通用模块的配置项解析,并且大概讲解了HTTP 模块的配置项解析过程,本文更具体的分析 HTTP 模块的初始化过程.HTTP 模块初始化过程主要有:上下文结构初始化.配置项解析.配置项合并.server 相关端口设置. HTTP 模块接口 ngx_http_module_t 结构体 在 Nginx 中,结构体 ngx_module_t 是 Nginx 模块最基本的接口.对于每一种不同类型的模块,都有一个具体的结构体来描述这一类模块的通用接口.

nginx http模块开发入门

导语 本文对nginx http模块开发需要掌握的一些关键点进行了提炼,同时以开发一个简单的日志模块进行讲解,让nginx的初学者也能看完之后做到心里有谱.本文只是一个用作入门的概述. 目录 背景 主线 认识nginx http请求处理流程 日志模块开发准备 配置解析流程 挂载处理函数 获取日志数据 模块编译 完整源码 结尾 背景 网上已经有很多介绍nginx http模块开发入门的文章,但是大多以hello_word程序为例,简单讲解一下代码,看完之后可能只能够依葫芦画瓢,做不了其它事情,更不

atitit.提升开发效率---使用服务器控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比较

atitit.提升开发效率---使用服务器控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比较 如下列举了服务器控件生命周期所要经历的11个阶段. (1)初始化-- --在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置:二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件, 并调用OnInit()方法,控件开发人员可以重写该方法为控件提供初始化逻辑.此后,页面框架将调用TrackViewState方法来跟踪视图状态. 需要注意的是:多

使用CURL检测Clinet侧发起的HTTP请求各阶段时间

前言 上周,我方的一个客户反馈,访问我们的接口,平均耗时在2s以上.但是我方对请求进入,和请求返回,整个过程都有监控,我方的耗时基本在50ms以内,非常快. 后来了解到,客户从广东访问到我方上海,公网来访问我方.那么就建议去检测,DNS耗时,TCP建立的耗时等.理论上,长距离的公网,网络延迟就非常高.遂建议使用CURL去检查.结果果然如猜想,在TCP建立的耗时就很久. 进入正题,这篇文章主要介绍使用CURL检测Client端发起的HTTP请求,各个阶段的时间. 第一.HTTP请求的过程介绍 一个