第三方模块迁移指南

本文以安装 headers-more-nginx-module-0.37 举例,其他情况类似:

一. 下载第三方包,如:headers-more-nginx-module-0.37.zip

二. 解压缩

 unzip headers-more-nginx-module-0.37.zip

三. 解压后,文件夹名字 headers-more-nginx-module-0.37

四. 拷贝到 njet modules 目录下

cp -fr headers-more-nginx-module-0.37 modules/

五. 进入模块目录

cd modules/headers-more-nginx-module-0.37

六.源代码,修改函数,变量。执行:

1. grep NGINX_ -rl ./* | xargs  sed -i 's/NGINX/NJET/g'
2. grep nginx -rl ./* | xargs  sed -i 's/nginx/njet/g'
3. grep NGX_ -rl ./* | xargs  sed -i 's/NGX_/NJT_/g'
4. grep ngx_ -rl ./* | xargs  sed -i 's/ngx_/njt_/g'
5. grep Nginx -rl ./* | xargs  sed -i 's/Nginx/NJet/g'
6. grep ngx -rl ./* | xargs  sed -i 's/ngx/njt/g'

七. 进入模块源码目录,源文件改名字

cd  src/
for i in ls; do mv -f $i `echo $i | sed 's/^ngx_/njt_/'`; done

八. 返回到njet 目录。

九. 配置编译类型。动态或静态

  1. 静态编译。添加模块路径到 modules_static
 echo "./modules/headers-more-nginx-module-0.37" >> modules_static
  1. 动态编译。 添加模块路径到 modules_dynamic
    echo "./modules/headers-more-nginx-module-0.37" >> modules_dynamic

动态编译的,使用时需要动态加载。 修改 njet.conf 文件

    例如:load_module  modules/njt_http_headers_more_filter_module.so;

十.重新编译njet

./build_cc.sh conf make install

常见问题解决

1.missing initializer for field ‘ref_count’ of ‘njt_http_variable_t

./modules/njet-echo-module/src/njt_http_echo_var.c:20:7: error: missing initializer for field ‘ref_count’ of ‘njt_http_variable_t {aka struct njt_http_variable_s}’ [-Werror=missing-field-initializers]
       NJT_HTTP_VAR_NOCACHEABLE, 0 },
       ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from src/http/njt_http.h:33:0,
                 from ./modules/njet-echo-module/src/ddebug.h:6,
                 from ./modules/njet-echo-module/src/njt_http_echo_var.c:4:
src/http/njt_http_variables.h:48:32: note: ‘ref_count’ declared here
  njt_uint_t                    ref_count;
                                ^~~~~~~~~

遇到此问题的原因是,NJet对njt_http_variable_t结构进行了修改,增加了一个 ref_count字段,在初始化变量时,需要为每个变量多增加一个字段。具体个性参考下面对echo_module的迁移示例。

修改前

static njt_http_variable_t njt_http_echo_variables[] = {

    { njt_string("echo_timer_elapsed"), NULL,
      njt_http_echo_timer_elapsed_variable, 0,
      NJT_HTTP_VAR_NOCACHEABLE, 0 },

// ... ...

    { njt_null_string, NULL, NULL, 0, 0, 0, NJT_VAR_INIT_REF_COUNT}
};

修改后

static njt_http_variable_t njt_http_echo_variables[] = {

    { njt_string("echo_timer_elapsed"), NULL,
      njt_http_echo_timer_elapsed_variable, 0,
      NJT_HTTP_VAR_NOCACHEABLE, 0, NJT_VAR_INIT_REF_COUNT },

// ... ...

    { njt_null_string, NULL, NULL, 0, 0, 0, NJT_VAR_INIT_REF_COUNT}
};