高度模块化的设计是Nginx的架构基础。全部模块都是以ngx_module_t结构体表示,该结构体内部定义了7个回调方法。它们负责模块的初始化和退出。commands成员是一个包括有ngx_command_t结构体的数组,ngx_command_t的作用就是解析配置项。

ctx是一个void指针。这使得模块具有高度灵活性。


ctx能够指向不同类型模块的通用接口,官方Nginx共同拥有5大类模块,与ctx接口的相应关系例如以下:
  • 核心模块:接口为ngx_core_module_t。类型宏为NGX_CORE_MODULE.
  • HTTP模块:接口为ngx_http_modult_t,类型宏为NGX_HTTP_MODULE.
  • 事件模块:接口为ngx_event_module_t,类型宏为NGX_EVENT_MODULE.
  • mail模块:接口为ngx_mail_module_t,类型宏为NGX_MAIL_MODULE.
  • 配置模块:接口为NULL。类型宏为NGX_CONF_MODULE.
注意。配置模块中仅仅有一个详细的模块,名字是ngx_conf_module,它的ctx上下文指针为空,不指向不论什么结构体。配置模块的作用就是解析nginx.conf配置文件。

核心模块中又包括6个详细的模块:
  • ngx_core_module
  • ngx_errlog_module
  • ngx_events_module
  • ngx_openssl_module
  • ngx_http_module
  • ngx_mail_module
它们的通用接口例如以下:
typedef struct {
ngx_str_t name; // 核心模块名称 // 解析配置项前。由框架调用创建存储配置项的数据结构
void *(*create_conf)(ngx_cycle_t *cycle); // 解析配置项后。由框架调用,依据解析的配置项初始化该模块
char *(*init_conf)(ngx_cycle_t *cycle, void *conf);
} ngx_core_module_t;

Nginx框架管理和核心模块、配置模块有紧密的联系。而与事件模块、HTTP模块、mail模块没有产生直接关系。框架调用6个核心模块,而这6个核心模块则管理其他类型的非核心模块。

5大类模块关系图例如以下所看到的:



总的来说,核心模块和配置模块是其他模块的基础;而事件模块又是HTTP模块和mail模块这两个应用层模块的基础。上图加粗部分的模块是该类模块中其他模块的基础。

參考:
《深入理解Nginx》 P256-P263.

【Nginx】模块化设计的更多相关文章

  1. nginx模块化结构

    NGINX是一个免费.开源.高性能.轻量级的HTTP和反向代理服务器,也是一个电子邮件(IMAP/POP3)代理服务器 特点: 占有内存少,并发能力强 Nginx的优点: 模块化.事件驱动.异步.非阻 ...

  2. iOS程序模块化设计

    一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和 ...

  3. PHP--进行模块化设计

    PHP--进行模块化设计 [来源] 达内    [编辑] 达内   [时间]2012-10-30 导航模块可以简单列为一个关于三级页面链接的HTML文件.通常你可以通过用另一种颜色来标明对当前区域的链 ...

  4. 深入浅出百度地图API开发系列(3):模块化设计

    在前面两张简单介绍了百度地图API的基础知识和使用之后,我们来分析一下百度地图API的基本架构,了解一下基本架构可以帮助我们更清晰的了解API的功能和调用过程,也就可以帮助我们在实际开发中可以更方便的 ...

  5. AngularJs学习笔记7——四大特性之模块化设计

    模块化设计 1.引用自定义模块并调用 自定义模块中,如果有一些服务.封装好笑模块,在另外一个模块中(声明的时候,在依赖列表中加入要引入的模块) var app02 = angular.module(' ...

  6. C51的模块化设计方法

    一个大的单片机程序往往包含很多模块,我是这样组织的: 1.每一个C源文件都要建立一个与之名字一样的H文件(头文件),里面仅仅包括该C文件的函数的声明,其他的什么也不会有,比如变量的定义啊等等不应该有. ...

  7. thinkphp学习笔记5—模块化设计

    原文:thinkphp学习笔记5-模块化设计 1.模块结构 完整的ThinkPHP用用围绕模块/控制器/操作设计,并支持多个入口文件盒多级控制.ThinkPHP默认PATHINFO模式,如下: htt ...

  8. App 组件化/模块化之路——使用SDK的思路进行模块化设计接口

    在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...

  9. 基于layui的框架模版,采用模块化设计,接口分离,组件化思想

    代码地址如下:http://www.demodashi.com/demo/13362.html 1. 准备工作 编辑器vscode,需要安装liveServer插件在前端开启静态服务器 或者使用hbu ...

  10. Swift之xib模块化设计

    一.解决问题 Xib/Storybarod可以方便.可视化的设置约束,在开发中也越来越重要.由于Xib不能组件化,使得封装.重用都变得不可行.本文将介绍一种解决方案,来实现Xib组件化. 二.模型块原 ...

随机推荐

  1. python爬虫值requests模块

    - 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在 ...

  2. 【转】Linux中的LVM

    转自:http://www.cnblogs.com/net2012/p/3365904.html 逻辑卷管理器,通过将另外一个硬盘上的分区加到已有文件系统,来动态地向已有文件系统添加空间的方法. 逻辑 ...

  3. python gdal 数组生成图片

    cols = array.shape[1]rows = array.shape[0]originX = rasterOrigin[0]originY = rasterOrigin[1]driver = ...

  4. 图解TCP/IP笔记(2)——数据链路

    [转载请注明]https://www.cnblogs.com/igoslly/p/9396066.html ——终端节点之间的包传递 MAC寻址(物理寻址).介质共享.非公有网络.分组交换.环路检测. ...

  5. [Windows Server 2003] 还原SQL Server数据库

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:SQL Ser ...

  6. 显示log里的ansi codecs颜色字符

    方法: vim AnsiEsc插件 http://www.vim.org/scripts/script.php?script_id=302 less -r cat和tail命令都可以正常显示,而且ta ...

  7. 扩增子图表解读6韦恩图:比较组间共有和特有OTU或分类单元

    韦恩图 Venn Diagram Venn Diagram,也称韦恩图.维恩图.文氏图,用于显示元素集合重叠区域的图示.   韦图绘制工具 常用R语言的VennDiagram包绘制,输出PDF格式方便 ...

  8. Node.js 命令行程序开发教程 ---------http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html

    五.yargs 模块 shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数.它也需要安装. $ npm install --save yargs yarg ...

  9. CAD直接打印,不出现打印对话框(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::Mx_Print 直接打印,不出现打印对话框,详细说明如下: 参数 说明 double ptLBx 打印的范围左下角x double ...

  10. C++ 中 字符数组 和 指针 区别

    char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; c ...