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

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;

处理阶段的数据结构

typedef struct 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

typedef struct {
    // 由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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值