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

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。