Nginx_handler模块发开(hello模块结构解析)「建议收藏」

Nginx_handler模块发开(hello模块结构解析)

大家好,又见面了,我是全栈君。

声明:请在文章页面明显位置给出原文连接 http://www.cnblogs.com/paulweihan/p/4654173.html,否则保留追究法律责任的权利。
近期查了非常多资料。入门的样例都是ngx_http_hello(or mytest)_module.
最主要是參考http://tengine.taobao.org/book/chapter_03.html#config 站点以及
《深入理解Nginx模块发开与架构解析》一书。但感觉讲的都不够清楚。书上讲的太复杂,側重结构体解析,以下贴出我的理解,欢迎大家谈论。联系方式:rwhsysu@163.com 。

(读本日志,希望你首先对于Nginx有个基本了解。其次,手头有一份Nginx源代码,一份gx_http_hello(or mytest)_module.c源代码)

本文不涉及hello模块文件夹下的config文件以及编译时加入的add-module指令,注重对于模块源代码的结构的理解,用于理清作者本人和您的思路。

对于上面站点上和书上强调的非常清楚的各个结构的定义,本文不做赘述。(太占篇幅-_-|||),參考资料里面讲的非常详细非常清楚,本文着重描写叙述自己的理解。如有对结构定义疑问。请读者自行參考上面提到的书以及站点

对于ngx_http_hello(or mytest)_module内定义的数据结构与函数的理解见下图:
ngx_http_hello(or mytest)_module数据结构与函数关系

上面图里包含了我对这个入门模块的结构的理解,解释例如以下:
实现一个handler的步骤:

  1. 编写模块基本结构。包含模块的定义,模块上下文结构,模块的配置结构等。
  2. 假设有loc_conf,须要定义自己loc_conf结构,以及conf结构创建。赋值函数。

  3. 实现handler的挂载函数。依据模块的需求选择正确的挂载方式。
  4. 编写handler处理函数。

    模块的功能主要通过这个函数来完毕。

这些结构域函数之间的包含关系见上面的图。

以下说说我个人对这些模块和函数的理解。
Num 1:模块定义结构

ngx_module_t ngx_http_hello_module;

对于开发一个模块来说。我们都须要定义一个ngx_module_t类型的变量来说明这个模块本身的信息。从某种意义上来说。这是这个模块最重要的一个信息,它告诉了nginx这个模块的一些信息,上面定义的配置信息。还有模块上下文信息。都是通过这个结构来告诉nginx系统的,也就是载入模块的上层代码,都须要通过定义的这个结构。来获取这些信息。
这个模块中最主要要定义的就是CTX上下文结构与commands配置结构数组。
Num 2:上下文结构

ngx_http_module_t ngx_http_hello_module_ctx;

这是一个ngx_http_module_t类型的静态变量。

这个变量实际上是提供一组回调函数指针,这些函数有在创建存储配置信息的对象的函数,也有在创建前和创建后会调用的函数。这些函数都将被nginx在合适的时间进行调用。
这个样例中,该结构最重要的是

  • 调用了一个handler挂载函数ngx_http_hello_init
  • 调用了一个loc_conf创建函数ngx_http_hello_create_loc_conf

Num 3:模块的配置结构

ngx_command_t ngx_http_hello_commands[];

在我的理解里,这个数组实现的功能是将我们在nginx.conf文件里定义的配置读取并存储进loc_conf结构中。conf结构已经在上下文结构中被创建。

Num 4:loc_conf与其创建赋值函数
本样例中,定义了一个结构体:

typedef struct
{
        ngx_str_t hello_string;
        ngx_int_t hello_counter;
}ngx_http_hello_loc_conf_t;

该结构体储存了本模块的配置变量。通过上下文结构中的调用的ngx_http_hello_create_loc_conf函数创建。通过配置结构中的ngx_http_hello_string以及ngx_http_hello_counter函数赋值。

(详细实现代码不贴了,请读者自行查询hello模块源代码)
Num 5:handler 挂载函数

ngx_int_t ngx_http_hello_init

该函数在上下文结构中被调用,决定了handler函数详细在11个PHASE中的哪个PHASE被调用。关于PHASE定义以及函数详细实现參看站点以及hello模块源代码。
Num 6:handler函数

static ngx_int_t
ngx_http_hello_handler(ngx_http_request_t *r)
{
}

关于这个函数,没什么好说的,他实现了对于整个request的处理,依据loc_conf的不同,处理方式也不同。

待续:上面仅仅介绍了hello模块涉及的数据结构以及函数的关系以及其相关功能,理清了hello模块是怎样工作的:详细体如今,在哪些结构中调用了哪些函数。

对于基本的两个数据结构ngx_conf_t ngx_http_request_t是怎样传递和实现的并未解释。同一时候,并未联系上nginx的main函数进行总体的分析。
希望对你有帮助,欢迎讨论。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115374.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 是的,我昨天当爸爸了

    于2020年12月23日(农历十一月初九)喜得小棉袄一枚,我当爸爸了。 原文始发于微信公众号(全栈程序员社区):是的,我昨天当爸爸了

  • pycharm如何搜索关键字_pycharm import变灰

    pycharm如何搜索关键字_pycharm import变灰1DCS调试方案按照以下内容做出一个完整的调试方案。2编制说明为高效优质完成调校工作,确保工艺试车进度,并实现长期、安全稳定生产的目标,特编制本DCS系统调试方案。3编制依据2.1工程合同2.2施工图及产品说明书2.3《工业自动化仪表工程施工及验收规范》GBJ93-864仪表系统调试程序图一为仪表系统调试程序方框图。本着分层隔离、平行作业的方法,本方案将系统调试分划为以下四个层次:4.1…

  • C语言截取字符串_c语言截取字符串后2位

    C语言截取字符串_c语言截取字符串后2位GitHub-frankRenlf/c_dailyWork只需加入’\0’再输出字符串即可#include<stdio.h>voidtest4(){chararr[100];intk=0;while(scanf(“%s”,arr)!=EOF){scanf(“%d”,&k);arr[k]=’\0′;printf(“%s\n”,arr);}…

    2022年10月31日
  • Istio入门(dignity)

    1.简介在本教程中,我们将介绍服务网格的基础知识,并了解它如何实现分布式系统架构。我们将主要关注Istio,它是服务网格的一种具体实现。在此过程中,我们将介绍Istio的核心架构。2.什么是服务网格?在过去的几十年中,我们已经看到了单体应用程序开始拆分为较小的应用程序。此外,诸如Docker之类的容器化技术和诸如Kubernetes之类的编排系统加速了这一变化。尽管在像Kubernetes这样的分布式系统上采用微服务架构有许多优势,但它也具有相当的复杂性。由于分布式服务必须相互通信,因

  • PLANTINUM_plantuml流程图

    PLANTINUM_plantuml流程图bytotinunsplash1.背景随着工作时间的增长,越发觉得用专业的图形(用例图,时序图,ER图等等)去准确表达想法是很重要的。比如针对某个需求绘制的的用例图,比一段乏味的文字来的更加有意义,也便于别人理解。加之最近在学习源码的时候,发现很多书籍中都会使用类图,时序图等UML语言来描述逻辑关系。于是就在网上找了找绘制UML语言时,业界主流的一些工具都用什么,找了半天,大部分都用了下面…

    2022年10月26日
  • MySQL (4) 第一范式 第二范式 第三范式 BC范式

    MySQL (4) 第一范式 第二范式 第三范式 BC范式第一范式第一范式:所有属性都是不可分割的原子值。也就是每个属性都是不可再分的。例如下图就不符合第一范式的要求实际上,1NF是所有关系型数据库的最基本要求,你在关系型数据库管理系统(RDBMS),例如SQLServer,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的。如果我们要在RDBMS中表现表中的数据,就得设计为下图的

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号