欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

《深入理解Nginx》笔记之 HTTP请求的11个处理阶段

程序员文章站 2022-06-12 20:08:28
...
HTTP请求的11个处理阶段
typedef enum {
    // 接收到完整的HTTP头部后处理阶段
    NGX_HTTP_POST_READ_PHASE = 0,

    // 将请求URI与location表达式匹配前,修改URI,即重定向阶段
    NGX_HTTP_SERVER_REWRITE_PHASE,

    // 只能由ngx_http_core_module模块实现,用于根据请求URI寻找location表达式
    NGX_HTTP_FIND_CONFIG_PHASE,

    // 上一过程结束后修改URI
    NGX_HTTP_REWRITE_PHASE,

    // 为了防止rewrite造成死循环(一个请求执行10次会被Nginx认定为死循环)
    NGX_HTTP_POST_REWRITE_PHASE,

    // 在“决定请求访问权限”阶段前
    NGX_HTTP_PREACCESS_PHASE,

    // 决定访问权阶段,判断该请求是否可以访问Nginx服务器
    NGX_HTTP_ACCESS_PHASE,

    // 当然请求不被允许访问Nginx服务器时,该阶段负责向用户返回错误响应
    NGX_HTTP_POST_ACCESS_PHASE,

    // 用try_files配置项。顺序访问多个静态文件资源阶段
    NGX_HTTP_TRY_FILES_PHASE,

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

    // 记录日志阶段
    NGX_HTTP_LOG_PHASE
} ngx_http_phases;

处理阶段的数据结构

typedefstruct ngx_http_phase_handler_s  ngx_http_phase_handler_t;

// 一个HTTP阶段的checker检查方法,仅有HTTP框架实现typedef ngx_int_t (*ngx_http_phase_handler_pt)(ngx_http_request_t *r,
    ngx_http_phase_handler_t *ph);

// 由HTTP模块实现的handler处理方法typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);

struct ngx_http_phase_handler_s {
     // 在处理一个HTTP阶段时,最先调用这个checker检查方法,在checker方法中调用模块实现的handler方法
    ngx_http_phase_handler_pt  checker;

    // 用于定义HTTP模块处理方法
    ngx_http_handler_pt        handler;

    // 将要执行的下一个HTTP处理阶段序号,可以不按顺序执行(这些处理阶段结构体都被存放在一个数组中,所以可以有下标序号
    ngx_uint_t                 next;
};

在一个http{}块解析完后,会根据nginx.conf中的配置项产生由ngx_http_phase_handler_t(上述结构)组成的数组。在处理HTTP请求时,按照next的顺序执行。这个组成的数组,被作为另一个结构体:

ngx_http_phase_engine_t

typedefstruct {
    // 由ngx_http_phase_handler_t构成的数组首地址,表示一个请求可能经历的所有ngx_http_handler_pt处理方法
    ngx_http_phase_handler_t  *handlers;

    // 表示NGX_HTTP_SERVER_REWRITE_PHASE阶段第一个ngx_http_phase_handler_t处理方法在handlers数组中的序号
    ngx_uint_t                 server_rewrite_index;

    // 表示NGX_HTTP_REWRITE_PHASE阶段第一个ngx_http_phase_handler_t处理方法在handlers数组中的序号
    ngx_uint_t                 location_rewrite_index;
} ngx_http_phase_engine_t;

这个数组被保存在了ngx_http_core_main_conf_t结构中:

typedef struct {
    ngx_http_phase_engine_t         phase_engine;
    ...
    // 在HTTP框架初始化时帮助各个HTTP模块在任意阶段中添加HTTP处理方法,它是一个有11个ngx_http_phase_t成员的数组,在初始化完毕后是没用的
    ngx_http_phase_t                    phases[NGX_HTTP_LOG_PHASE + 1];
    ...
} ngx_http_core_main_conf_t;

ngx_http_phase_t

typedefstruct {
    // handlers动态数组保存着每一个HTTP模块初始化时添加到当前阶段处理方法
    ngx_array_t                     handlers;
}   ngx_http_phase_t;

版权声明:Pain is just in your mind.

以上就介绍了《深入理解Nginx》笔记之 HTTP请求的11个处理阶段,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

《深入理解Nginx》笔记之 HTTP请求的11个处理阶段

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频