nginx-如何将自己的HTTP模块编译进nginx

上一篇博客讲解了nginx相关的数据结构。

这一篇主要交接如何将自己的模块编译进nginx;

  1. 一种常用的简单方法:

    1)首先把源代码文件全部放大一个目录下,然后在改目录中编写一个config用于通知Nginx如何编译本模块,这个文件名必须为config。

  2. 在configure脚本执行时加入参数--add-module=PATH(上面源码,config的保存目录)

  3. 执行正常安装流程是完成Nginx的编译工作。




ps:还有一种复杂方式,就是修改configure脚本执行后生成的obj/Makefile和obj/ngx_module.c文件。

  以后进行讲解

-------------------------------------------------------------------------------------------


2.config的写法:

    其实config就是一个shell脚本,若是只想开发一个HTTP模块,需要定义3个变量

    1.ngx_addon_name:仅在configure执行时使用,一般设置为模块名称。

    2.HTTP_MODULES:保存所有HTTP模块名称,空格符相连。重新设置时不要覆盖,只需要添加

    例:&HTTP_MODULES ngx_http_my_test_module

    3.NGC_ADDON_SRCS:用于指定模块的源代码,空格符相连。

    ps:设置时可以使用&ngx_addon_dir变量,等价于configure执行时的--add-module=PATH.

    例:

    ngx_addon_name=ngx_http_mytest_module

    HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_modue"

    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c"


下面声明一个重点:

    以上的3个变量并不是唯一可以再config中自定义的部分,如果开发一个HTTP过滤模块,则需要用HTTP_FILTER_MODULES替代HTTP_MODULES

    $CORE_MODULES:核心模块。

    $EVENT_MODULES:事件模块

    $HTTP_MODULES:HTTP模块

    $HTTP_FILTER_MODULES:HTTP过滤模块

    $HTTP_HEADERS_FILTER_MODULES:HTTP头部过滤模块.

    等。$NGX_ADDON_DEPS:指定模块依赖路径。

-------------------------------------------------------------------------------------------


3.利用configure脚本将制定的模块加入nginx中

    首先nginx是通过configure生成程序的

    在configure中。

    .auto/modules

    .auto/make

    这2行代码是讲第三方模块加入到nginx中

    

 1)configure如何利用config文件加入nginx中

    --add-module=*)    NGX_ADDONS="$NGX_ADDONS $value" ;;

  

   在configure命令执行到auto/modules脚本时,将生成ngx_modules.c文件中加入制定的第三方模块。

下面是部分源码:

if test -n "$NGX_ADDONS";then
    
    echo configuring addtional  modules
    
    for ngx_addon_dir in $NGX_ADDONS
    do
        echo "adding module in $ngx_addon_dir"
        
        if test -f $ngx_addon_dir/config; then
            .$ngx_addon_dir/config
            
            echo "+ $nginx_addon_name was configured"
        
        else
            echo "错误信息"
            exit 1
         fi
    done
fi

当遍历config文件后。就会在ngx_modules.c中定义一个ngx_module_t *ngx_modules[]数组,通过处理请求时的循环访问数组确定该用哪一个模块来处理。

最后就是auto/make把相关模块编译进nginx。

-------------------------------------------------------------------------------------------

4.直接修改Makefile文件

 适用于我们需要重新决定ngx_module* ngx_modules[]数组中各模块的顺序,或者在编译源代码时需要加入一些独特的编译选项,那么可以再执行完configure后,对objs/ngx_modules.c和objs/Makefile文件直接进行修改


首先,当我们要修改ngx_modules.c时候,需要加上一行代码

    extern ngx_module_t ngx_http_mytypes_module;

然后主动加上ngx_modules数组中

ngx_modules_t *ngx_modules[] = {
    ...
    &ngx_http_upstream_ip_hash_module,
    &ngx_http_mytest_module,
    $ngx_http_write_filter_module,
    ...
    NULL
};

注意我么模块加入的顺序十分重要,因为nginx中模块调用顺序是正序所需

最后就是修改Makefile.

obj/addon/httpmodule/ngx_http_mytest_modules.0:$(ADDON_DEPS)\
    ../sample/httpmodule/ngx_http_mytest_modules.c
    $(CC) -c $(CFLAGS) $(ALL_INCS) \
           -o objs/addon/httpmdoule/ngx_http_mytest_module.o\
           ../sample/httpmodule//ngx_http_mytest_module.c

然后把目标文件链接到Nginx中

objs/nginx:   objs/src/core/nginx.o
...
    objs/addon/httpmodule/ngx_http_mytest_module.o\
    objs/ngx_modules.o
    
    $(LINK) -o objs/nginx\
    objs/src/core/nginx.o\
    ...
    objs/addon/httpmodule/ngx_http_mytest_module.o\
    objs/ngx_modules.o\
    -lpthread -lcrypt -lpcre -lcrypto -lcrypto -lz

这个是修改文件,所以不正确的修改可能导致nginx出错,所以慎用

本文出自 “剩蛋君” 博客,转载请与作者联系!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值