本文是学习《深入理解nginx -- 模块开发与架构解析》的读书笔记

nginx的模块分为4个大类型的模块:

事件模块

HTTP模块

邮件代理相关的mail模块

其他模块

开发HTTP模块流程

这里的HTTP模块是最简单最经常编写的模块,开发一个完整的简单的HTTP模块需要下面几个步骤(以模块名为ngx_http_mytest_module为例):

1 编写config文件(这是为了让nginx在configure过程能找到编写的模块)

下面是编写具体的模块代码结构

2 编写模块结构 ngx_http_mytest_module

这个是模块结构,其中起的作用是:

定义了模块的上下文结构

定义了模块命令结构

3 编写模块上下文结构 ngx_http_mytest_module_ctx

这个结构的意思就是nginx在触发了模块运行的时候,如何处理已经在其他http,server,location定义过的上下文

4 编写模块命令结构 ngx_http_mytest_commands

这个结构的意思就是nginx在配置文件中触发了哪些命令,其中指定了:

触发命令的回调函数

5 触发命令的回调函数 ngx_http_mytest

这个回调函数中可以设置对http请求的具体处理方法

6 对http请求的具体处理方法 ngx_http_mytest_handler

这个方法的参数中可以获取http请求结构,并且可以设置http返回

至此,一个http模块就可以完成了。

对应的各个步骤说明:

1 编写config文件

示例:

ngx_addon_name=ngx_http_mytest_module 
HTTP_MODULES="HTTPMODULESngxhttpmytestmodule"NGXADDONSRCS="HTTPMODULESngxhttpmytestmodule"NGXADDONSRCS="NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c"

HTTP_MODULES是设置HTTP需要加载的模块列表,在具体编译的时候会生成modules的数组,然后根据数组的先后顺序一个一个加载

2 ngx_http_mytest_module的结构类型是ngx_module_t

它的结构说明看:

https://github.com/jianfengye/nginx-1.0.14_comment/blob/master/src/core/ngx_conf_file.h

里面的ngx_module_s的结构

最主要记得是要设置上下文结构ctx和命令集commands

3 某块上下文ngx_http_mytest_module_ctx的结构类型是ngx_http_module_t

它的结构说明看:

https://github.com/jianfengye/nginx-1.0.14_comment/blob/master/src/http/ngx_http_config.h

这个结构是如果需要的话在读取,重载配置文件的时候定义的8个阶段

create_main_conf 
create_srv_conf 
create_loc_conf 
preconfiguration 
init_main_conf 
merge_srv_conf 
merge_loc_conf 
postconfiguration

4 ngx_http_mytest_commands 是一个ngx_command_s的数组

ngx_command_s的结构说明看:

它的结构说明看:

https://github.com/jianfengye/nginx-1.0.14_comment/blob/master/src/core/ngx_conf_file.h

里面碰到的set回调函数,这个回调函数可以使用nginx预设的14个解析配置方法,或者使用自定义的方法

14个预设的解析配置方法有:

ngx_conf_set_flag_slot

ngx_conf_set_str_slot

ngx_conf_set_str_array_slot

ngx_conf_set_keyval_slot

ngx_conf_set_num_slot

ngx_conf_set_size_slog

ngx_conf_set_off_slot

ngx_conf_set_msec_slot

ngx_conf_set_sec_slot

ngx_conf_set_bufs_slot

ngx_conf_set_enum_slot

ngx_conf_set_bitmask_slot

ngx_conf_set_acccess_slot

ngx_conf_set_path_slot

5 触发命令的回调函数的解析配置方法格式如下:

char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

如果使用了上面的14个解析配置方法,就可以不用自己写这个方法了

如果是自己写这个配置解析方法,就需要写第六步

ngx_http_mytest_handler

它的函数定义如下:

static ngx_init_t ngx_http_mytest_handler(ngx_http_request_t *r)

使用ngx_http_request_t指针输入

在ngx_http_request指针中也可以设置HTTP返回

它的结构说明看:

https://github.com/jianfengye/nginx-1.0.14_comment/blob/master/src/http/ngx_http_request.h

一个具体的例子:

https://github.com/jianfengye/MyWorks/tree/master/nginx_module_mytest

本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2013/06/10/3130890.html,如需转载请自行联系原作者

nginx的HTTP模块编写相关推荐

  1. Nginx自定义模块编写:根据post参数路由到不同服务器

    Nginx可以轻松实现根据不同的url 或者 get参数来转发到不同的服务器,然而当我们需要根据http包体来进行请求路由时,Nginx默认的配置规则就捉襟见肘了,但是没关系,Nginx提供了强大的自 ...

  2. nginx自定义模块编写-实时统计模块--转载

    原文:http://www.vimer.cn/2012/05/nginx%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99- ...

  3. nginx 加路由时报错_Nginx自定义模块编写:根据post参数路由到不同服务器

    Nginx可以轻松实现根据不同的url 或者 get参数来转发到不同的服务器,然而当我们需要根据http包体来进行请求路由时,Nginx默认的配置规则就捉襟见肘了,但是没关系,Nginx提供了强大的自 ...

  4. nginx详细文档 – 安装配置,深入源码,模块编写,编译器参数,系统函数

    nginx文档 吴东 April 28, 2009 Contents 1前言 5 2基本配置 7 2.1安装------- 7 2.2配置说明------. 10 2.3启动和控制------ 25 ...

  5. 温度转换java小程序_利用easygui模块编写的华氏温度与摄氏温度转换的小程序

    -*- coding:utf-8 -*- #Author:'Lmc' #DATE: 2019/4/23/0023 下午 4:23:08 #FileName:tem_compare_gui.PY imp ...

  6. java centos 缩略图_使用 Nginx 的 image_filter 模块来构建动态缩略图服务器

    原标题:使用 Nginx 的 image_filter 模块来构建动态缩略图服务器 在以前我们实现缩略图机制通常是在当用户上传一张图片后,后端程序会固定将图片生成前端页面需要的不同大小缩略图.不管前端 ...

  7. Nginx-接入层Nginx架构及模块介绍

    文章简介: 1)帮助大家对Nginx有一定的认识 2)熟悉Nginx有哪些应用场景 3)熟悉Nginx特点和架构模型以及相关流程 4)熟悉Nginx定制化开发的几种模块分类 文章相关视频讲解: C/C ...

  8. Nginx集成FastDFS模块实现图片上传

    提示:如果在这里还没有安装Fastdfs的话可以参考:censtos下安装FastDFS 一.FastDFS的Nginx模块 资料: https://pan.baidu.com/s/14YQCvuMI ...

  9. 1. nginx扩展——ngx_lua 模块简介、安装

    1. 简介 ​ lua-nginx-module(ngx_lua module)把 Lua5.1 的解释器 或 LuaJIT 2.0/2.1 的解释器嵌入到 nginx 中,将强大的 Lua 线程(L ...

最新文章

  1. mongodb数据合并设计_MongoDB:如何将来自多个集合的数据合并成一个.?
  2. SpringBoot与quartz框架实现分布式定时任务
  3. 算法学习之路|打印排名
  4. 使用 Blazor 开发内部后台(三):登录
  5. 一文彻底读懂优秀开源产品MyBatis一级缓存设计!
  6. C#中将DataTable中数据导出到csv文件中
  7. 新车入手,美利达公爵500
  8. C++函数重载与引用的较好的练习实例
  9. STC学习:可切换内容的电子音乐
  10. php变量控制结构与函数,LAMP兄弟连原创视频教程(PHP笔记一--变量,流程控制结构,函数)...
  11. 照片怎么转换成jpg?常见渠道一览
  12. 高通驱动开发参考(二)
  13. os.system() 和os.popen()的区别
  14. 看完这篇文章,再也不怕 Elasticsearch 索引设计
  15. TI 达芬奇系列 开发错误解析
  16. echarts 仪表盘 文字位置_ECharts 使用series.title.offsetCenter设置仪表盘标题位置
  17. PMBOK(第五版)学习笔记 —— ITTO(输入、工具与技术及输出)汇总
  18. TimeGen 软件的实用
  19. 为什么我的Linux ls命令不能用了?
  20. ValueError: need at least one array to concatenate

热门文章

  1. mysql性能监控qps,tps,iops
  2. 转: 浅析Fusion-IO和Intel SSD
  3. Exchange2007 中Send as 与Send on behalf of 讲解
  4. 我的Dll(动态链接库)学习笔记
  5. 一个人就需要对象之js中八种创建对象方式
  6. 五个超酷Linux命令
  7. 73款阿里巴巴开源软件详解
  8. 树莓派/香橙派自建本地DNS加速解析
  9. 跟小博老师一起学Servlet ——Servlet之HttpServletResponse
  10. Java编程之正则表达式