一种动态适应及加载预编译的Nginx模块的方法及系统转让专利

申请号 : CN202111313350.X

文献号 : CN114237609B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 甄志会杨金全

申请人 : 北京基调网络股份有限公司

摘要 :

本发明涉及计算机技术领域,具体提供了一种动态适应及加载预编译的Nginx模块的方法及系统,包括:根据版本差异及编译选项构造编译对照表格及加载对照表格;利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数及加载功能模块函数,根据加载对照表格匹配相应的功能模块so动态库,并修改动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。利用构造编译对照表格及加载对照表格的方法和动态加载预编译模块的方法,动态适应不同环境的Nginx版本及编译选项,避免了在不同环境下的手工编译模块的复杂性,降低编译模块的次数,减少模块的存储占用空间,降低产品的部署难度。

权利要求 :

1.一种动态适应及加载预编译的Nginx模块的方法,其特征在于,所述方法包括:步骤1,获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;

具体地,使用统一的表格记录并管理其中的差异;

其中,功能模块涉及的Nginx内核结构表包含涉及的头文件名称、涉及的结构名称及涉及的结构字段;

Nginx内核结构变更表包含头文件名称、Nginx版本及变更的结构名称;

功能模块涉及的Nginx版本差异表包含Nginx版本、变更的结构名称及兼容的Nginx版本列表;

功能模块涉及的Nginx编译选项表包含涉及的编译选项、编译选项默认值及编译选项签名位置;

步骤2,根据版本差异及编译选项差异构造编译对照表及加载对照表,其中,构造编译对照表和加载对照表内的动态库名称命名规则需保持一致;

其中,编译对照表生成规则为:筛选出Nginx编译选项表内每个默认值为关闭的编译选项,然后对筛选后的选项循环组合,每个编译选项组合和Nginx版本差异表内每个Nginx版本生成一个按照动态库名称命名规则确定名称的动态库;

加载对照表生成规则为:筛选出Nginx版本差异表内每组相邻的Nginx版本之间的所有版本,同组内所有Nginx版本均可以加载组内最低版本的动态库;

步骤3,按照编译对照表将Nginx功能模块编译为多个so动态库;

步骤4,利用PRE_LOAD及hook机制,在Nginx进程加载功能模块时拦截版本比较函数,以绕过版本比较环节,并根据加载对照表匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。

2.根据权利要求1所述的动态适应及加载预编译的Nginx模块的方法,其特征在于,所述动态库名称命名规则为:Nginx发行版名称+Nginx内核版本号+Nginx编译选项表内默认值为关闭的编译选项编译签名值组合。

3.根据权利要求1所述的动态适应及加载预编译的Nginx模块的方法,其特征在于,所述步骤3具体包括:利用步骤2内生成的编译对照表编写编译脚本,循环对照表内所有的Nginx发行版版本和编译选项组合,将功能模块编译为按照动态库名称命名规则的多个so动态库。

4.根据权利要求1所述的动态适应及加载预编译的Nginx模块的方法,其特征在于,所述步骤4具体包括:利用PRE_LOAD及hook机制,在Nginx进程加载功能模块时拦截版本比较函数,获取当前Nginx进程的发行版名称、当前Nginx进程的内核版本和当前Nginx进程的编译选项签名,然后利用步骤2内生成的加载对照表规则,确定被加载的动态库名称,并修改动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配,最后调用Nginx自带的load_module函数加载动态库。

5.一种动态适应及加载预编译的Nginx模块的系统,其特征在于,包括:

差异获取模块,用于获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;

具体地,使用统一的表格记录并管理其中的差异;

其中,功能模块涉及的Nginx内核结构表包含涉及的头文件名称、涉及的结构名称及涉及的结构字段;

Nginx内核结构变更表包含头文件名称、Nginx版本及变更的结构名称;

功能模块涉及的Nginx版本差异表包含Nginx版本、变更的结构名称及兼容的Nginx版本列表;

功能模块涉及的Nginx编译选项表包含涉及的编译选项、编译选项默认值及编译选项签名位置;

编译模块,用于根据版本差异及编译选项差异构造编译对照表及加载对照表,其中,构造编译对照表和及加载对照表内的动态库名称命名规则需保持一致;并按照编译对照表将Nginx功能模块编译为多个so动态库;

其中,编译对照表生成规则为:筛选出Nginx编译选项表内每个默认值为关闭的编译选项,然后对筛选后的选项循环组合,每个编译选项组合和Nginx版本差异表内每个Nginx版本生成一个按照动态库名称命名规则确定名称的动态库;

加载对照表生成规则为:筛选出Nginx版本差异表内每组相邻的Nginx版本之间的所有版本,同组内所有Nginx版本均可以加载组内最低版本的动态库;

匹配模块,用于利用PRE_LOAD及hook机制,在Nginx进程加载功能模块时拦截版本比较函数,以绕过版本比较环节,并根据加载对照表匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。

6.一种电子设备,其特征在于,包括存储器、处理器,所述处理器用于执行存储器中存储的计算机管理类程序时实现如权利要求1‑4任一项所述的动态适应及加载预编译的Nginx模块的方法的步骤。

7.一种计算机可读存储介质,其特征在于,其上存储有计算机管理类程序,所述计算机管理类程序被处理器执行时实现如权利要求1‑4任一项所述的动态适应及加载预编译的Nginx模块的方法的步骤。

说明书 :

一种动态适应及加载预编译的Nginx模块的方法及系统

技术领域

[0001] 本发明涉及计算机技术领域,具体涉及一种动态适应及加载预编译的Nginx模块的方法及系统。

背景技术

[0002] 部署Nginx及第三方功能模块时有通常两种方式:第一种方式是下载源码进行编译,一次性将Nginx源码和第三方功能模块的源码全部编译完毕,然后再将编译后的二进制文件拷贝到对应的环境。另外一种方式是采用系统自带的yum、apt‑get等软件包管理工具安装预编译的Nginx二进制包。
[0003] 由于不同版本Nginx有不同的结构定义,编译选项不同也会造成引用的条件编译指令不一致,Nginx内核为了保证软件整体运行的稳定性,在编译功能模块的so动态库时,会将编译期间的Nginx版本信息存储到so动态库的常量区,并将编译选项影响的条件编译指令编码为一个静态的编译签名字符串存储到so动态库的常量区。Nginx内核在加载功能模块时,会检测该功能模块的编译版本信息和编译签名字符串,如果功能模块的编译版本和编译签名与当前运行的Nginx内核的编译版本或编译签名不一致,则认为是不兼容的功能模块不予加载。
[0004] 所以,默认情况下,当需要在原有已成功部署的Nginx环境上追加新的功能模块时,必须采用和原有Nginx版本一致的Nginx源码,并且使用相同的编译选项编译新的功能模块,才能将新的功能模块追加到已有Nginx环境中。
[0005] 然而,在实际环境中,由于部署Nginx的环境多样性,经常会出现不同的Nginx环境的版本不一致、编译选项不一致的情况,如果需要在多个Nginx环境下添加同一功能模块,必须构建多个Nginx环境并使用相应的编译选项进行多次编译,无法简单的将预编译好的功能模块添加到已有的Nginx环境中,尤其是在非源码发布功能模块的情况下,维护环境对应的预编译模块变的非常复杂。

发明内容

[0006] 鉴于现有技术中存在的技术缺陷和技术弊端,本发明实施例提供克服上述问题或者至少部分地解决上述追加预编译的Nginx功能模块时的适配难度高的问题的一种,具体方案如下:
[0007] 本发明提供了一种动态适应及加载预编译的Nginx模块的方法,包括步骤1,获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;
[0008] 步骤2,根据版本差异及编译选项差异构造编译对照表格,并加载所述编译对照表格,其中,构造编译对照表和加载该编译对照表内的动态库名称命名规则需保持一致;
[0009] 步骤3,按照编译对照表格将Nginx功能模块编译为多个so动态库;
[0010] 步骤4,利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数,以绕过版本比较环节,并根据编译对照表格匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。
[0011] 优选地,所述步骤1中的“并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异”具体包括:
[0012] 使用统一的表格记录并管理其中的差异;
[0013] 其中,功能模块涉及的Nginx内核结构表包含涉及的头文件名称、涉及的结构名称及涉及的结构字段;
[0014] Nginx内核结构变更表包含头文件名称、Nginx版本及变更的结构名称;
[0015] 功能模块涉及的Nginx版本差异表包含Nginx版本、变更的结构名称及兼容的Nginx版本列表;
[0016] 功能模块涉及的Nginx编译选项表包含涉及的编译选项、编译选项默认值及编译选项签名位置。
[0017] 优选地,所述步骤2中编译对照表生成规则为:筛选出Nginx编译选项表内每个默认值为关闭的编译选项,然后对筛选后的选项循环组合,每个编译选项组合和Nginx版本差异表内每个Nginx版本生成一个按照动态库名称命名规则确定名称的动态库。
[0018] 优选地,所述步骤2中加载对照表生成规则为:筛选出Nginx版本差异表内每组相邻的Nginx版本之间的所有版本,同组内所有Nginx版本均可以加载组内最低版本的动态库。
[0019] 优选地,所述动态库名称命名规则为:Nginx发行版名称+Nginx内核版本号+Nginx编译选项表内默认值为关闭的编译选项编译签名值组合。
[0020] 优选地,所述步骤3具体包括:利用步骤2内生成的编译对照表编写编译脚本,循环对照表内所有的Nginx发行版版本和编译选项组合,将功能模块编译为按照动态库名称命名规则的多个so动态库。
[0021] 优选地,所述步骤4具体包括:利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数,获取当前Nginx进程的发行版名称、当前Nginx进程的内核版本和当前Nginx进程的编译选项签名,然后利用步骤2内生成的加载对照表规则,确定被加载的动态库名称,并修改动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配,最后调用Nginx自带的load_module函数加载动态库。
[0022] 本发明还提供了一种动态适应及加载预编译的Nginx模块的系统,包括:
[0023] 差异获取模块,用于获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;
[0024] 编译模块,用于根据版本差异及编译选项差异构造编译对照表格,并加载所述编译对照表格,其中,构造编译对照表和加载该编译对照表内的动态库名称命名规则需保持一致;并按照编译对照表格将Nginx功能模块编译为多个so动态库;
[0025] 匹配模块,用于利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数,以绕过版本比较环节,并根据编译对照表格匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。
[0026] 本发明还提供了一种电子设备,包括存储器、处理器,所述处理器用于执行存储器中存储的计算机管理类程序时实现如权利要求1‑7任一项所述的动态适应及加载预编译的Nginx模块的方法的步骤。
[0027] 本发明还提供了一种计算机可读存储介质,其上存储有计算机管理类程序,所述计算机管理类程序被处理器执行时实现如权利要求1‑7任一项所述的动态适应及加载预编译的Nginx模块的方法的步骤。
[0028] 本发明具有以下有益效果:
[0029] 本发明的一种动态适应及加载预编译的Nginx模块的方法及系统,其中方法包括步骤1,获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;步骤2,根据版本差异及编译选项差异构造编译对照表格,并加载所述编译对照表格;步骤3,按照编译对照表格将Nginx功能模块编译为多个so动态库;步骤4,利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数,以绕过版本比较环节,并根据编译对照表格匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。
[0030] 该方案可以大大降低追加预编译的Nginx功能模块时的适配难度。利用构造编译对照表格及加载对照表格的方法和动态加载预编译模块的方法,动态适应不同环境的Nginx版本及编译选项,避免了在不同环境下的手工编译模块的复杂性,降低编译模块的次数,减少模块的存储占用空间,降低产品的部署难度。

附图说明

[0031] 图1为本发明动态适应及加载预编译的Nginx模块的方法原理流程图;
[0032] 图2为本发明提供的一种可能的电子设备的硬件结构示意图;
[0033] 图3为本发明提供的一种可能的计算机可读存储介质的硬件结构示意图。

具体实施方式

[0034] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0035] 本发明实施例提供了一种动态适应及加载预编译的Nginx模块的方法,包括步骤1,获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;步骤2,根据版本差异及编译选项差异构造编译对照表格,并加载所述编译对照表格;步骤3,按照编译对照表格将Nginx功能模块编译为多个so动态库;步骤4,利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数,以绕过版本比较环节,并根据编译对照表格匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。
[0036] 即,根据版本差异及编译选项构造编译对照表格及加载对照表格;利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数及加载功能模块函数,根据加载对照表格匹配相应的功能模块so动态库,并修改动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。
[0037] 该方案可以大大降低追加预编译的Nginx功能模块时的适配难度。利用构造编译对照表格及加载对照表格的方法和动态加载预编译模块的方法,动态适应不同环境的Nginx版本及编译选项,避免了在不同环境下的手工编译模块的复杂性,降低编译模块的次数,减少模块的存储占用空间,降低产品的部署难度。
[0038] Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx模块:Nginx内部结构是由Nginx核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。通常所说的Nginx模块指对Nginx功能进行扩展的功能模块。
[0039] 在一个具体的实施场景中,下面将结合示例对本发明作进一步的详细描述,示例中,我们假设Nginx功能模块实现的功能为在http请求头内追加一个名称为“X‑REQ”的请求头,且在http响应头内追加一个名称为“X‑REP”的响应头。
[0040] (1),整理Nginx功能模块涉及的Nginx内核结构,并根据涉及的内核结构整理版本差异、整理Nginx功能模块涉及的编译选项。
[0041] 所有Nginx模块均涉及ngx_core.h头文件内ngx_http_core_main_conf_t结构。
[0042] 追加请求头及响应头,涉及操作ngx_http_request.h头文件ngx_http_request_t结构的headers_in和headers_out涉及的编译选项包括:NGX_HTTP_GZIP,NGX_HTTP_X_FORWARDED_FOR,NGX_HTTP_REALIP,NGX_HTTP_HEADERS,NGX_HTTP_DAV,NGX_HTTP_CACHE。
[0043] 其中,各种表格具体结构如下;
[0044] 功能模块涉及的Nginx内核结构表(11):
[0045]
[0046] Nginx内核结构变更表(12):
[0047]
[0048] Nginx从1.11.5以上才支持动态加载功能模块,目前已有1.11.5‑1.20.1总共68个小版本。功能模块涉及的Nginx版本差异表(13):
[0049]
[0050]
[0051] Nginx目前共有34个编译选项。功能模块涉及的Nginx编译选项表(14):
[0052]涉及的编译选项 编译选项默认值 编译选项签名位置
NGX_HTTP_GZIP ON 26
NGX_HTTP_X_FORWARDED_FOR ON 28
NGX_HTTP_REALIP OFF 29
NGX_HTTP_HEADERS OFF 30
NGX_HTTP_DAV OFF 31
NGX_HTTP_CACHE ON 32
[0053] (2)根据版本差异及编译选项构造编译对照表格及加载对照表格。
[0054] 筛选出Nginx编译选项表内每个默认值为关闭的编译选项,当前示例为NGX_HTTP_REALIP,NGX_HTTP_HEADERS,NGX_HTTP_DAV三个编译选项。
[0055] 动态库名称命名规则为:Nginx发行版名称+Nginx内核版本号+Nginx编译选项编译签名值的第29位到31位,对应编译选项开启时为1,关闭时为0。
[0056] 编译对照表生成:对筛选后的编译选项循环组合,共有:全无,NGX_HTTP_REALIP,NGX_HTTP_HEADERS,NGX_HTTP_DAV,NGX_HTTP_REALIP+NGX_HTTP_HEADERS,NGX_HTTP_HEADERS+NGX_HTTP_DAV,NGX_HTTP_REALIP+NGX_HTTP_DAV,NGX_HTTP_REALIP+NGX_HTTP_HEADERS+NGX_HTTP_DAV八种组合,每个编译选项组合和Nginx版本差异表内每个Nginx版本生成一个按照动态库名称命名规则确定名称的动态库。
[0057] 加载对照表生成规则为:筛选出Nginx版本差异表内每组相邻的Nginx版本之间的所有版本,同组内所有Nginx版本均可以加载组内最低版本的动态库。
[0058] 加载对照表的编译签名组合获取规则:截取Nginx编译选项表内NGX_HTTP_REALIP,NGX_HTTP_HEADERS,NGX_HTTP_DAV编译选项所在的编译选项签名第29位到31位的字符串。
[0059] 编译对照表(21):
[0060]
[0061]
[0062]
[0063] 加载对照表(22):
[0064]
[0065]
[0066]
[0067] (3)按照编译对照表格将功能模块编译为多个so动态库。循环对照表内Nginx 6个版本和8个编译选项组合,将功能模块编译为48个so动态库。
[0068] (4)利用PRE_LOAD及hook机制,在Nginx进程加载功能模块时拦截ngx_conf_parse函数,在此函数回调函数内,获取当前Nginx进程的发行版名称、当前Nginx进程的内核版本和当前Nginx进程的编译选项签名,截取编译选项签名第29位到31位的字符串,然后利用步骤(2)内生成的加载对照表(22)规则,从48个so动态库种选择被加载的动态库,并修改动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配,最后调用Nginx自带的load_module函数加载动态库。
[0069] 最终,本方案将实际环境中68个版本34种编译选项最大可能68*2^34种情况的扩展模块精简为48个so动态库,并实现了按需动态加载,降低编译模块的次数,减少模块的存储占用空间,降低产品的部署难度。
[0070] 本发明实施例还提供了一种动态适应及加载预编译的Nginx模块的系统,包括:
[0071] 差异获取模块,用于获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;
[0072] 编译模块,用于根据版本差异及编译选项差异构造编译对照表格,并加载所述编译对照表格,其中,构造编译对照表和加载该编译对照表内的动态库名称命名规则需保持一致;并按照编译对照表格将Nginx功能模块编译为多个so动态库;
[0073] 匹配模块,用于利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数,以绕过版本比较环节,并根据编译对照表格匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。
[0074] 该系统用于实施前述的动态适应及加载预编译的Nginx模块的方法,适用上述任一种动态适应及加载预编译的Nginx模块的方法,在此不再赘述。
[0075] 请参阅图2为本发明实施例提供的电子设备的实施例示意图。如图2所示,本发明实施例提了一种电子设备,包括存储器1310、处理器1320及存储在存储器1310上并可在处理器1320上运行的计算机程序1311,处理器1320执行计算机程序1311时实现以下步骤:步骤1,获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;
[0076] 步骤2,根据版本差异及编译选项差异构造编译对照表格,并加载所述编译对照表格,其中,构造编译对照表和加载该编译对照表内的动态库名称命名规则需保持一致;
[0077] 步骤3,按照编译对照表格将Nginx功能模块编译为多个so动态库;
[0078] 步骤4,利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数,以绕过版本比较环节,并根据编译对照表格匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。
[0079] 请参阅图3为本发明提供的一种计算机可读存储介质的实施例示意图。如图3所示,本实施例提供了一种计算机可读存储介质1400,其上存储有计算机程序1411,该计算机程序1411被处理器执行时实现如下步骤:步骤1,获取Nginx功能模块涉及的Nginx内核结构,并根据涉及的Nginx内核结构获取版本差异以及Nginx功能模块涉及的编译选项差异;
[0080] 步骤2,根据版本差异及编译选项差异构造编译对照表格,并加载所述编译对照表格,其中,构造编译对照表和加载该编译对照表内的动态库名称命名规则需保持一致;
[0081] 步骤3,按照编译对照表格将Nginx功能模块编译为多个so动态库;
[0082] 步骤4,利用PRE_LOAD及hook机制,在Nginx进程启动时拦截版本比较函数,以绕过版本比较环节,并根据编译对照表格匹配相应的功能模块so动态库,修改so动态库内储存的版本常量及编译选项签名常量,使之与当前Nginx进程的常量匹配。
[0083] 有益效果:
[0084] 利用构造编译对照表格及加载对照表格的方法和动态加载预编译模块的方法,动态适应不同环境的Nginx版本及编译选项,避免了在不同环境下的手工编译模块的复杂性,降低编译模块的次数,减少模块的存储占用空间,降低产品的部署难度。
[0085] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。