我是靠谱客的博主 害怕墨镜,最近开发中收集的这篇文章主要介绍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出错,所以慎用

转载于:https://blog.51cto.com/memory73/1841571

最后

以上就是害怕墨镜为你收集整理的nginx-如何将自己的HTTP模块编译进nginx的全部内容,希望文章能够帮你解决nginx-如何将自己的HTTP模块编译进nginx所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部