解剖Nginx·模块开发篇(4)模块开发中的命名规则和模块加载与运行流程

1 命名规则

1.1 基本变量

基本变量有三个:

  • ngx_module_t 类型的 ngx_http_foo_bar_module;
  • ngx_command_t 类型的数组 ngx_http_foo_bar_commands;
  • ngx_http_module_t 类型的 ngx_http_foo_bar_module_ctx。

假设你开发了一个 Foo Bar 模块,那么模块名称应该叫:

ngx_http_foo_bar_module

命令集合的名字的命名规则:

ngx_http_foo_bar_commands

上下文的明子的命名规则:

ngx_http_foo_bar_module_ctx

1.2 基本类型

模块配置

ngx_http_foo_bar_<main|srv|loc>_conf_t

2 加载与运行流程

这与 ngx_http_foo_bar_module_ctx 很有关系,它是 ngx_http_module_t 类型的,该类型定义如下:

typedef struct {
    ngx_int_t   (*preconfiguration)(ngx_conf_t *cf);
    ngx_int_t   (*postconfiguration)(ngx_conf_t *cf);

    void       *(*create_main_conf)(ngx_conf_t *cf);
    char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);

    void       *(*create_srv_conf)(ngx_conf_t *cf);
    char       *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);

    void       *(*create_loc_conf)(ngx_conf_t *cf);
    char       *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
} ngx_http_module_t;

2.1 preconfiguration

调用ngx_http_foo_bar_module_ctx.preconfiguration初始化 http 组件和 nginx 其他组件的交互;

2.2 解析配置文件

解析配置文件中的http模块。http包含serverlocation等模块,所以在解析http组件时,会根据具体的配置情况,多次调用ngx_http_foo_bar_module_ctx.create_(srv|loc)_conf,创建 main_conf、srv_conf、loc_conf;

2.3 初始化 http 组件的 main 部分

调用ngx_http_foo_bar_module_ctx.init_main_conf初始化 main 组件;

2.4 merge

调用ngx_http_foo_bar_module_ctx.merge_srv_conf合并那些定义在“http”组件中的“server”组件配置。调用ngx_http_foo_bar_module_ctx.merge_loc_conf合并那些定义在上层组件中的“location”配置;

2.5 postconfiguration

调用ngx_http_foo_bar_module_ctx.postconfigation初始化 http 组件和 nginx 其他组件的交互。

-

时间: 2024-08-15 04:19:35

解剖Nginx·模块开发篇(4)模块开发中的命名规则和模块加载与运行流程的相关文章

【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/49992269 本文出自:[江清清的博客] (一).前言: [好消息]个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org 话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比ListView,GridVi

django开发环境setting.py里面设置debug=false时却成功加载静态文件?

django开发环境setting.py里面设置debug=false时却成功加载静态文件?按理来说应该是加载失败的. 启动服务器,运行正常,但是静态文件如css,js,图片是无法加载的. 问题: 解答:问题在于使用的是谷歌浏览器,默认使用了缓存.导致每次访问同一个url时,都返回的是缓存里面的东西. 通过谷歌浏览器里面的开发者工具network下面的选项能禁用缓存.禁用缓存之后,则在django开发环境里面,运行 python manage.py runserver,如将DEBUG的值设为Tr

别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.ClassLoader源码分析 11.自定义类加载器 12.加载类的三种方式 13.总结 14.特别注意 @ 前言 你是否真的理解java的类加载机制?点进文章的盆友不如先来做一道非常常见的面试题,如果你能做出来,可能你早已掌握并理解了java的类加载机制,若结果出乎你的意料,那就很有必要来了解了解j

解剖Nginx&#183;模块开发篇(5)解读内置非默认模块 ngx_http_stub_status_module

1 Background ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的,所以在编译 Nginx 时要指定加载该模块: --with-http_stub_status_module 当然了,如果你是重新编译,仅仅-s reload是不够的,可能需要用到平滑升级:<高性能Web服务器Nginx的配置与部署研究(14)平滑升级你的Nginx>. 为什么拿它做例子?因为它也

解剖Nginx&#183;自动脚本篇(3)源码相关变量脚本 auto/sources

在configure脚本中,运行完auto/options和auto/init脚本后,接下来就运行auto/soures脚本.这个脚本是为编译做准备的. 目录 核心模块 事件模块 OpenSSL 模块相关变量 事件驱动模块 操作系统相关项 HTTP 模块 邮件模块 Google PerfTools 模块 C++ 测试模块 1 核心模块 1.1 核心模块名称 CORE_MODULES CORE_MODULES变量记录 Nginx 的核心模块,默认包括ngx_core_module.ngx_errl

解剖Nginx&#183;自动脚本篇(1)解析配置选项脚本 auto/options

在安装Nginx之前(即运行make脚本之前),首先是进行安装的配置准备,包括环境检查及生成文件.这些工作是由自动脚本完成的.和绝大多数软件一样,Nginx的自动脚本的入口,同样是名为configure的文件. 除了configure,其他的自动脚本都在auto目录下.通过分析configure脚本源码,我们可以看到,configure首先运行了auto目录下的几个自动脚本,如下: . auto/options . auto/init . auto/sources 其中通过运行auto/opti

解剖Nginx&#183;自动脚本篇(5)编译器相关主脚本

在 Nginx 的自动脚本中,auto/cc目录下的所有脚本都是用于编译器相关配置使用的.Nginx的出色跨平台性(Linux.Darwin.Solaris.Win32 等)就有这些脚本的贡献.该目录下包含如下脚本: 目录 conf:主脚本,配置编译器的基本属性,并根据系统的编译器环境引用不同的脚本. name:与编译器名称相关的处理逻辑在该脚本中. gcc:GNU C 编译器的 Specified 配置. sunc:Sun C 编译器的 Specified 配置. acc:HP ANSI C+

软件开发中的命名规则

对于一个成功的软件项目来说,大到解决方案小到一个属性的命名,不管是对软件的开发,还是对于后期的维护来说都是非常重要的.经过多年的摸索,我发现自己有一点命名恐惧症.为了方便以后的工作的顺利进行,特别对项目开发中的命名进行了一次总结,尽管有些地方不是很完整或者不周,但以后还会进行不断的补充与完善! 1. 解决方案命名:    对于解决方案来说,它的命名一般相对比较固定,多是系统英文全名的简写,如:SPMS,RMG,FinCap等: 2. 项目命名:    项目的命名要体现项目的功能,一般分为2/3/

AngularJS中多个ng-app(手动加载模块)

1.当有多个ng-app时:(首先是要加载angularJS) <div ng-app=""> <p>姓名:<input type="text" ng-model="name" placeholder="请输入姓名" /></p> <p> {{name}} </p> </div> <div ng-app="">