Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)

nginx源码分析(8)——phase handler处理 nginx将请求的处理过程划分为11个phase(阶段),相当于是对请求处理的一种抽象,便于定制处理过程。这个11个phase,分别是(定义在http/ngx_http_core_module.h): typedef enum { NGX_HTTP_POST_READ_PHASE = 0, /* 读取请求 */ NGX_HTTP_SERVER_REWRITE_PHAS 阅读详情

目录

一、HTTP模块11个阶段处理

二、阶段处理的初始化ngx_http_block

三、阶段处理过程ngx_http_core_run_phases

四、挂载自定义模块


上一章我们讲解了HTTP request的解析过程。我们基本知道了Nginx是如何解析HTTP的行和头。

这一章我们主要讲解Nginx的阶段处理(PHASE 状态机实现)。阶段处理的概念如何理解,我举个例子:一个HTTP请求过来,除了解析HTTP的行和头外,还需要解析URI的rewrite、接受HTTP BODY中的POST数据、转发给后端JAVA/PHP服务器进行数据处理等等一系列的操作。

Nginx的PHASE阶段处理共包含11部分,通过这11个阶段的处理,就能完整的处理一个HTTP请求了。

一、HTTP模块11个阶段处理


阶段处理对应函数描述信息

NGX_HTTP_POST_READ_PHASE

ngx_http_core_generic_phase读取请求内容阶段,这个阶段没有默认的handler,主要用来读取请求体,并对请求体做相应的处理

NGX_HTTP_SERVER_REWRITE_PHASE

ngx_http_core_rewrite_phaseServer请求地址重写阶段,这个阶段主要是处理全局的(server block)的rewrite规则

NGX_HTTP_FIND_CONFIG_PHASE

ngx_http_core_find_config_phase配置查找阶段,不支持ch,这个阶段主要是通过uri来查找对应的location。然后将uri和location的数据关联起来。这个阶段主要处理逻辑在checker函数中,不能挂载自定义的handler

NGX_HTTP_REWRITE_PHASE

ngx_http_core_rewrite_phaseLocation请求地址重写阶段,这个主要处理location block的rewrite。

NGX_HTTP_POST_REWRITE_PHASE

ngx_http_core_post_rewrite_phase请求地址重写提交阶段,post rewrite,这个主要是进行一些校验以及收尾工作,以便于交给后面的模块。这个phase不能挂载自定义handler

NGX_HTTP_PREACCESS_PHASE

ngx_http_core_generic_phase访问权限检查准备阶段,比如流控这种类型的access就放在这个phase,也就是说它主要是进行一些比较粗粒度的access。

NGX_HTTP_ACCESS_PHASE

ngx_http_core_access_phase访问权限检查阶段,这个比如存取控制,权限验证就放在这个phase,一般来说处理动作是交给下面的模块做的.这个主要是做一些细粒度的access。

NGX_HTTP_POST_ACCESS_PHASE

ngx_http_core_post_access_phase访问权限检查提交阶段,一般来说当上面的access模块得到access_code之后就会由这个模块根据access_code来进行操作 这个phase不能挂载自定义handler

NGX_HTTP_TRY_FILES_PHASE

ngx_http_core_try_files_phase配置项try_files处理阶段,try_file模块,也就是对应配置文件中的try_files指令。 这个phase不能挂载自定义handler

NGX_HTTP_CONTENT_PHASE

ngx_http_core_content_phase内容产生阶段,内容处理模块,产生文件内容,如果是PHP,去调用phpcgi,如果是代理,就转发给相应的后端服务器

NGX_HTTP_LOG_PHASE

ngx_http_core_generic_phase日志模块处理阶段,日志处理模块,是每个请求最后一定会执行的。用于打印访问日志。
 
typedef enum {
    NGX_HTTP_POST_READ_PHASE = 0, /* 读取请求内容阶段 */

    NGX_HTTP_SERVER_REWRITE_PHASE, /* Server请求地址重写阶段 */

    NGX_HTTP_FIND_CONFIG_PHASE, /* 配置查找阶段 */
    NGX_HTTP_REWRITE_PHASE,  /* Location请求地址重写阶段 */
    NGX_HTTP_POST_REWRITE_PHASE, /* 请求地址重写提交阶段 */

    NGX_HTTP_PREACCESS_PHASE,  /* 访问权限检查准备阶段 */

    NGX_HTTP_ACCESS_PHASE,  /* 访问权限检查阶段 */
    NGX_HTTP_POST_ACCESS_PHASE,  /* 访问权限检查提交阶段 */

    NGX_HTTP_TRY_FILES_PHASE,   /* 配置项try_files处理阶段 */
    NGX_HTTP_CONTENT_PHASE,    /* 内容产生阶段 */

    NGX_HTTP_LOG_PHASE  /* 日志模块处理阶段 */
} ngx_http_phases;
  • 四个phase是不支持添加http功能的handler的,这四个阶段分别是NGX_FIND_CONFIG_PHASE、NGX_POST_REWRITE_PHASE、NGX_POST_ACCESS_PHASE、NGX_TRY_FILES_PHASE
  • 如果需要自定义添加模块挂载的Nginx的阶段处理上,推荐挂载到这三个阶段:NGX_HTTP_PREACCESS_PHASE、NGX_HTTP_ACCESS_PHASE、NGX_HTTP_CONTENT_PHASE
 

二、阶段处理的初始化ngx_http_block


我们从前面的篇章中知道,HTTP模块的初始化从 ngx_http_block这个方法开始。阶段处理的初始化也在这个方法中。
/**
 *ngx_http_commands 命令集的回调函数
 *HTTP模块初始化的入口函数
 *
 */
static char *
ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
.........
    /* 初始化阶段数组 只有这里面的6个阶段可以挂载模块 */
    if (ngx_http_init_phases(cf, cmcf) != NGX_OK) {
        return NGX_CONF_ERROR;
    }
........
    /**
     * 初始化阶段处理
     */
    if (ngx_http_init_phase_handlers(cf, cmcf) != NGX_OK) {
        return NGX_CONF_ERROR;
    }
}
ngx_http_init_phases 初始化阶段数组
/**
 * 初始化阶段处理数组
 * 每一个可以挂载模块的阶段,都定义了一个cmcf->phases[?].handlers的数组
 * 每个阶段被调用的时候,都会去遍历改阶段处理数组下需要处理的逻辑函数
 */
static ngx_int_t
ngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
{
    if (ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers,
                       cf->pool, 1, sizeof(ngx_http_handler_pt))
        != NGX_OK)
    {
        return NGX_ERROR;
    }

    if (ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers,
                       cf->pool, 1, sizeof(ngx_http_handler_pt))
        != NGX_OK)
    {
        return NGX_ERROR;
    }

    if (ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers,
                       cf->pool, 1, sizeof(ngx_http_handler_pt))
        != NGX_OK)
    {
        return NGX_ERROR;
    }

    if (ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers,
                       cf->pool, 1, sizeof(ngx_http_handler_pt))
        != NGX_OK)
    {
        return NGX_ERROR;
    }

    if (ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers,
                       cf->pool, 2, sizeof(ngx_http_handler_pt))
        != NGX_OK)
    {
        return NGX_ERROR;
    }

    if (ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers,
                       cf->pool, 4, sizeof(ngx_http_handler_pt))
        != NGX_OK)
    {
        return NGX_ERROR;
    }

    if (ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers,
                       cf->pool, 1, sizeof(ngx_http_handler_pt))
        != NGX_OK)
    {
        return NGX_ERROR;
    }

    return NGX_OK;
}
ngx_http_init_phase_handlers 初始化阶段处理
/**
 * 初始化阶段处理
 *
 * nginx在接收并解析完请求行,请求头之后,就会依次调用各个phase handler
 *
 * 	NGX_HTTP_POST_READ_PHASE	读取请求内容阶段
	NGX_HTTP_SERVER_REWRITE_PHASE	Server请求地址重写阶段
	NGX_HTTP_FIND_CONFIG_PHASE	配置查找阶段
	NGX_HTTP_REWRITE_PHASE	Location请求地址重写阶段
	NGX_HTTP_POST_REWRITE_PHASE	请求地址重写提交阶段
	NGX_HTTP_PREACCESS_PHASE	访问权限检查准备阶段
	NGX_HTTP_ACCESS_PHASE	访问权限检查阶段
	NGX_HTTP_POST_ACCESS_PHASE	访问权限检查提交阶段
	NGX_HTTP_TRY_FILES_PHASE	配置项try_files处理阶段
	NGX_HTTP_CONTENT_PHASE	内容产生阶段
	NGX_HTTP_LOG_PHASE	日志模块处理阶段
 */
static ngx_int_t
ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
{
    ngx_int_t                   j;
    ngx_uint_t                  i, n;
    ngx_uint_t                  find_config_index, use_rewrite, use_access;
    ngx_http_handler_pt        *h;
    ngx_http_phase_handler_t   *ph;
    ngx_http_phase_handler_pt   checker;

    cmcf->phase_engine.server_rewrite_index = (ngx_uint_t) -1;
    cmcf->phase_engine.location_rewrite_index = (ngx_uint_t) -1;
    find_config_index = 0;
    use_rewrite = cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers.nelts ? 1 : 0;
    use_access = cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers.nelts ? 1 : 0;

    n = use_rewrite + use_access + cmcf->try_files + 1 /* find config phase */;

    for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {
        n += cmcf->phases[i].handlers.nelts;
    }

    ph = ngx_pcalloc(cf->pool,
                     n * sizeof(ngx_http_phase_handler_t) + sizeof(void *));
    if (ph == NULL) {
        return NGX_ERROR;
    }

    cmcf->phase_engine.handlers = ph;
    n = 0;

    for (i = 0; i < NGX_HTTP_LOG_PHASE; i++) {
        h = cmcf->phases[i].handlers.elts;

        switch (i) {

        /* server中的rewrite*/
        case NGX_HTTP_SERVER_REWRITE_PHASE:
            if (cmcf->phase_engine.server_rewrite_index == (ngx_uint_t) -1) {
                cmcf->phase_engine.server_rewrite_index = n;
            }
            checker = ngx_http_core_rewrite_phase;

            break;

        /* 根据URI查找 location */
        case NGX_HTTP_FIND_CONFIG_PHASE:
            find_config_index = n;

            ph->checker = ngx_http_core_find_config_phase;
            n++;
            ph++;

            continue;

        /* localtion级别的rewrite */
        case NGX_HTTP_REWRITE_PHASE:
            if (cmcf->phase_engine.location_rewrite_index == (ngx_uint_t) -1) {
                cmcf->phase_engine.location_rewrite_index = n;
            }
            checker = ngx_http_core_rewrite_phase;

            break;

        /* server、location级别的rewrite都是在这个phase进行收尾工作的 */
        case NGX_HTTP_POST_REWRITE_PHASE:
            if (use_rewrite) {
                ph->checker = ngx_http_core_post_rewrite_phase;
                ph->next = find_config_index;
                n++;
                ph++;
            }

            continue;

        /* 细粒度的access,比如权限验证、存取控制 */
        case NGX_HTTP_ACCESS_PHASE:
            checker = ngx_http_core_access_phase;
            n++;
            break;

        /* 根据上述两个phase得到access code进行操作 */
        case NGX_HTTP_POST_ACCESS_PHASE:
            if (use_access) {
                ph->checker = ngx_http_core_post_access_phase;
                ph->next = n;
                ph++;
            }

            continue;

        /* 实现try_files指令 */
        case NGX_HTTP_TRY_FILES_PHASE:
            if (cmcf->try_files) {
                ph->checker = ngx_http_core_try_files_phase;
                n++;
                ph++;
            }

            continue;

        /* 生成http响应 */
        case NGX_HTTP_CONTENT_PHASE:
            checker = ngx_http_core_content_phase;
            break;

        default:
            checker = ngx_http_core_generic_phase;
        }

        n += cmcf->phases[i].handlers.nelts;

        for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--) {
            ph->checker = checker;
            ph->handler = h[j];
            ph->next = n;
            ph++;
        }
    }

    return NGX_OK;
}
 

三、阶段处理过程ngx_http_core_run_phases


阶段处理核心函数ngx_http_core_run_phases

先看下阶段处理返回的几个状态含义:
  • NGX_OK:    表示该阶段已经处理完成,需要转入下一个阶段;
  • NGX_DECLINED:    表示需要转入本阶段的下一个handler继续处理;
  • NGX_AGAIN, NGX_DONE:表示需要等待某个事件发生才能继续处理(比如等待网络IO),此时Nginx为了不阻塞其他请求的处理,必须中断当前请求的执行链,等待事件发生之后继续执行该handler;
  • NGX_ERROR:    表示发生了错误,需要结束该请求。
/**
 * 11个阶段处理HTTP请求
 */
void
ngx_http_core_run_phases(ngx_http_request_t *r)
{
    ngx_int_t                   rc;
    ngx_http_phase_handler_t   *ph;
    ngx_http_core_main_conf_t  *cmcf;

    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);

    ph = cmcf->phase_engine.handlers;

    /* 遍历解析和处理各个阶段的HTTP请求 如果返回rc==NGX_AGAIN 则交由下一个阶段处理;返回OK则返回结果  */
    while (ph[r->phase_handler].checker) {

		rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);

        if (rc == NGX_OK) {
            return;
        }
    }
}

/**
 * 内容接收阶段
 */
ngx_int_t
ngx_http_core_generic_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)
{
    ngx_int_t  rc;

    /*
     * generic phase checker,
     * used by the post read and pre-access phases
     */

    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                   "generic phase: %ui", r->phase_handler);

    /* handler 回调函数*/
    rc = ph->handler(r);

    /* 本阶段处理完成,跳转到下一个阶段处理 */
    if (rc == NGX_OK) {
        r->phase_handler = ph->next;
        return NGX_AGAIN;
    }

    /* 本阶段当前的回调函数处理完成,继续执行本阶段其他回调函数 */
    if (rc == NGX_DECLINED) {
        r->phase_handler++;
        return NGX_AGAIN;
    }

    if (rc == NGX_AGAIN || rc == NGX_DONE) {
        return NGX_OK;
    }

    /* rc == NGX_ERROR || rc == NGX_HTTP_...  */

    ngx_http_finalize_request(r, rc);

    return NGX_OK;
}
 

四、挂载自定义模块


Nginx的自定义模块在http/modules/目录下。如果你编写了一个模块,并且想在阶段处理中,编写自己的模块,那么就非常简单了。只要在模块init初始化的时候,将回调函数注册到阶段上,就能实现自定义阶段处理拦截。

我们看下ngx_http_static_module.c模块的阶段处理的注册。

/**
 * 模块初始化
 */
static ngx_int_t
ngx_http_static_init(ngx_conf_t *cf)
{
    ngx_http_handler_pt        *h;
    ngx_http_core_main_conf_t  *cmcf;

    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
    /* 注册到NGX_HTTP_CONTENT_PHASE阶段 */
    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
    if (h == NULL) {
        return NGX_ERROR;
    }

    /* 设置阶段回调函数 */
    *h = ngx_http_static_handler;

    return NGX_OK;
}

以上就是整个阶段处理的过程。理解之后发现并不难,而且可扩展性非常强,非常适合在不同阶段中挂载自定义的Nginx模块代码。

下一章,也是最后一章,我们讲解一下自定义模块的实现。

 
nginx源码分析(7)——请求处理 在建立连接过程中,对于nginx监听到的每个客户端连接,都会将它的读事件的handler设置为ngx_http_init_request函数,这个函数就是请求处理的入口。在处理请求时,主要就是要解析http请求,比如:uri,请求行等,然后再根据请求生成响应。下面看一下nginx处理的具体过程。 1. ngx_http_init_request         在ngx_http_in 阅读详情

相关推荐

从URDF到仿真动画:基于Simulink、Simscape与S-Function的机械臂一体化建模与控制

本文详细介绍了从URDF文件到高保真仿真动画的一体化机械臂建模与控制流程。通过整合Simulink、Simscape与S-Function,构建了包含物理特性的虚拟机械臂模型,并实现了自适应滑模等高级控制算法的嵌入与验证。该流程打通了从机械设计到控制算法验证的闭环,为机器人开发提供了高效的仿真平台。

cnn8visionary的博客 698

nginx中的http模块配置

nginx中的http模块配置 文章目录nginx中的http模块配置一、简介二、http模块总览三、http块常用配置3.1 upstream四、server块常用配置4.1 listen4.2 server_name 主机名称五、location块常用配置5.1 路径配置5.2 请求限制5.3 配置转发方法5.4 配置转发路径六、http块、server块都可使用的配置6.1 配置请求头header内存buffer大小6.2 配置超大请求header内存buffer大小七、http块、server块、l

panda-star的博客 4487

嵌入式工程师必看:BLDC电机驱动电路设计全流程(附MOS管选型指南)

本文为嵌入式工程师提供了BLDC电机驱动电路设计的全流程实战指南。文章深入解析了三相全桥逆变电路的核心原理,并重点阐述了功率MOSFET的选型关键参数,如Vds、Rds(on)和Qg。同时,详细介绍了栅极驱动设计、PCB布局布线要点及调试安全步骤,旨在帮助开发者构建稳定高效的BLDC驱动系统。

weixin_29194817的博客 587

nginx 源码分析:http 请求处理流程——返回响应

先来回顾一下,我们的分析流程使用如下的配置文件: events { } http { server { listen 80; location / { root html; index index.html index.htm; } } ...

alenliu's blog 5236

【扫地机器人】详细介绍扫地机器人软硬件测试和场景化测试

本文提出2025版扫地机器人全生命周期测试方案,涵盖实验室仿真、硬件台架、客户实景等全流程验证。测试以"清洁率≥95%、覆盖率≥98%、MTBF≥1000h"为核心指标,采用数字孪生与120套真实场景结合的双V模型。重点包括:传感器精度(LDS误差<±10mm)、清洁系统性能(10g粉尘吸入率≥99%)、动力续航(800次循环容量保持≥80%)等硬件测试;以及SLAM重定位(误差<5cm)、AI识别(mAP>92%)等软件验证。方案特别针对宠物家庭(毛发缠绕率≤3%)、

2501_92897788的博客 2283

【AI Agent 实战】OpenClaw 全面解析 + 全平台一键部署教程(本地 AI 智能体)

本文收录于 AI 智能体 & 自动化实战系列,手把手带你从零部署本地可控的 AI 执行助手关键词:OpenClaw、AI Agent、本地 AI 部署、自动化助手、Docker 部署

爱人爱己,风生水起 7869

Nginx源码分析之 HTTP阶段

typedef enum { /*最开始的阶段,貌似Nginx原生没有该阶段的handler*/ NGX_HTTP_POST_READ_PHASE = 0, /*配置在server块的rewrite指令,则会处理hander,否则,handler进去直接return*/ NGX_HTTP_SERVER_REWRITE_PHASE, /*根据URI进行lo...

Network, Linux Kernel 951

IBM x3650M4服务器更换主板后,导入原有硬盘阵列信息

x3650m4服务器主板坏了,更换好的主板,需要导入原来硬盘的里面的阵列信息 1、开机有提示信息,按C导入配置 2、按Y继续 3、点击start进入阵列卡配置 4、选择configurations 1,点击preview 5、预览硬盘的阵列信息,点击import导入 6、导入成功,可以查看到阵列信息 7、重启服务器,进入操作系统 如果重启找不到操作系统,重启按f12,手动选择从onboard sas controller启动,进入系统一次后面重启就会自动找到并引导系统了。 8、有时候导入阵列

zds00virtue的博客 2万+

nginx 源码分析:http 请求处理流程——请求处理的 11 个阶段

nginx 将处理 http 的请求分为 11 个阶段,每个阶段的作用不同,内置的一些模块都在不同的阶段实现它们的功能。这些阶段定义为如下的枚举类型: typedef enum { NGX_HTTP_POST_READ_PHASE = 0, NGX_HTTP_SERVER_REWRITE_PHASE, NGX_HTTP_FIND_CONFIG_PHASE, NG...

alenliu's blog 1974

获取车辆VIN等OBD信息

获取车辆如下OBD信息: VIN:Vehicle Identification Number CALID:Calibration Identifications CVN:Calibration verification number 一、SAE J1939协议 通过请求 CALIBRATION INFORMATION (DM19),获取CVN和CALID。 发送请求:18EA00F9 00 D3 00 应答:18EC0000 10 14 00 03 FF 00 D3 00 数据,BYTE1=0x10,表明

jianxuezixuan的博客 1万+

Fusion 360嵌入式外壳建模实战:从草图到可装配结构

参数化三维建模是现代电子结构设计的核心能力,其本质是通过几何约束与特征驱动实现设计意图的精确表达和快速迭代。Fusion 360作为集成CAD/CAM/CAE的云端平台,以时间轴驱动的参数化工作流、基于基准面的草图约束机制和面向制造的特征操作逻辑,显著提升了嵌入式硬件的结构验证效率。该技术价值在于支持工程师在无专业机械背景前提下,独立完成PCB适配、散热布局、接口开孔与装配干涉检查等关键任务,广泛应用于3D打印原型、CNC加工外壳及IoT终端结构开发。本文以ESP32冰箱监控终端为实例,详解从基准定义、草图

weixin_35671843的博客 588

Nginx源码剖析--HTTP请求的分阶段处理的初始化

前言 Nginx作为一个http服务器,核心任务就是处理HTTP请求。在接收到请求时,Nginx框架首先解析http请求,将解析结果放在ngx_http_request中,由于http是在tcp上工作的,因此解析可能会持续一段时间。nginx用状态机完成对HTTP请求的异步解析。整个解析过程都是由Nginx框架代码完成,不需要用户介入。当解析得到完整的http请求后,就开始处理http请求。ng

Swartz2015的专栏 721

PostgreSQL:Patroni 高可用架构,基于etcd的自动故障转移集群

本文详细介绍了基于Patroni和etcd构建PostgreSQL高可用集群的方案。Patroni作为外部守护进程,通过etcd分布式协调服务实现自动故障转移、主节点选举等关键功能,弥补了PostgreSQL原生缺乏自动故障转移的不足。文章涵盖核心架构(3节点PG+3节点etcd)、环境规划、etcd集群部署(包括配置验证)以及Patroni安装配置的关键步骤,特别强调了Patroni自动初始化PG实例、配置同步复制等生产级特性。该方案通过外部组件协同工作,在不修改PG源码的情况下实现了生产环境所需的高可用

数据知道的博客 2490

nginx源码分析--模块分类

ngx-modules Nginx 主要的模块大致可以分为四类: handler – 协同完成客户端请求的处理、产生响应数据。比如模块, ngx_http_rewrite_module, ngx_http_log_module, ngx_http_static_module。 filter – 对 handler 产生的响应数据做各种过滤处理。比如模块, ngx_http_n

鱼思故渊的专栏 2130

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ngx_http_rewrite_handler

ngx_http_rewrite_handler

weixin_41812346的博客 211

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ngx_http_core_content_phase

ngx_http_core_content_phase

weixin_41812346的博客 204

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Nginx源码分析 - 实战篇 - 编写一个阶段化的模块(25)

HTTP模块篇,我们讲过Nginx的HTTP阶段处理 《Nginx源码分析 - HTTP模块篇 - ngx_http_core_run_phases函数和HTTP模块的阶段处理PHASE handler》我们代码在《Nginx源码分析 - 实战篇 - 编写一个自定义的模块》的基础上,将定义一个回调函数挂载到HTTP处理的阶段上。先看代码:#include #include #include

自娱自乐的代码人 8049

[nginx源码分析]nginx handler 模块解析

nginx 源码分析

Ubuntu黑客 2007

定义了一个ngx_http_hello_init的方法,将ngx_http_hello_log_handler函数挂载到NGX_HTTP_LOG_PHASE日志处理阶段

如何定义了一个ngx_http_hello_init的方法,将ngx_http_hello_log_handler函数挂载到NGX_HTTP_LOG_PHASE日志处理阶段。在我们自己定义的模块中,ngx_http_hello_init方法将ngx_http_hello_log_handler函数挂载到NGX_HTTP_LOG_PHASE日志处理阶段。将ngx_http_hello_log_handler挂载到NGX_HTTP_LOG_PHASE日志处理阶段。

katerdaisy的博客 125

nginx源码分析--状态机执行

/** * 11个阶段处理HTTP请求 */ void ngx_http_core_run_phases(ngx_http_request_t *r) { ngx_int_t rc; ngx_http_phase_handler_t *ph; ngx_http_core_main_conf_t *cmcf; cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module)

mojianc的专栏 316

nginx源码分析——http多阶段处理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33811539的博客 199

nginx flv模块的使用和源码分析

本文详细介绍了nginx http flv 流媒体模块的使用,并对源码实现进行了详细的剖析。在此基础上,并提出了如何进行FLV流媒体播放的切片回源问题的思考。

一个致力于开源代码学习、分析和交流的博客 1259

ngx_http_mirror_handler

ngx_http_mirror_handler

weixin_41812346的博客 173

Nginx源码分析:核心模块剖析及常见问题

Nginx 在解析完请求行和请求头之后,一共定义了十一个阶段,分别介绍如下 HTTP 模块工作原理 HTTP 处理的十一个阶段定义 typedef enum {          NGX_HTTP_POST_READ_PHASE = 0, // 读取请求内容阶段            NGX_HTTP_SERVER_REWRITE_PHASE, // Se

多看多听多总结 1404

nginx源码分析(持续更新)

1.http模块何时将http请求各个阶段的处理函数注册到nginx的http框架中,     会在该http模块的postconfiguration回调函数被调用过程中将Http请求某阶段本模块干预处理的函数注册进去;  具体参考代码ngx_http_block函数中如下代码(ngx_http.c中) for (m = 0; ngx_modules[m]; m++) {

shichunming126的专栏 466
上一篇: Java深入 - jdk8特性
下一篇: Nginx源码分析 - 实战篇 - 编写一个自定义的模块(24)
老码农zhuli
老码农zhuli 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 2456粉丝 312原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值