nginx 0.8.52+ngx_devel_kit 0.2.11+set-misc 0.15

  最近要上线一个基于nginx的应用,正巧0.8的版本树终于进入stable了,各种新功能也不用背负着开发版本的风险上线了。因为有用到set misc第三方模块里面的功能,于是就下载下来,想联编进去。set misc是基于nginx_devel_kit这个第三方模块开发的,因此还需要继续下载它。我下到的最新的版本是0.2.11。三个东西一组合编译,不行,报错。

set-misc-nginx-module/src/ngx_http_set_default_value.c: In function 'ngx_http_set_if_empty':
set-misc-nginx-module/src/ngx_http_set_default_value.c:33: error: 'ndk_set_var_t' undeclared (first use in this function)
set-misc-nginx-module/src/ngx_http_set_default_value.c:33: error: (Each undeclared identifier is reported only once
set-misc-nginx-module/src/ngx_http_set_default_value.c:33: error: for each function it appears in.)
set-misc-nginx-module/src/ngx_http_set_default_value.c:33: error: expected ';' before 'filter'
set-misc-nginx-module/src/ngx_http_set_default_value.c:37: error: 'filter' undeclared (first use in this function)
set-misc-nginx-module/src/ngx_http_set_default_value.c:37: error: 'NDK_SET_VAR_MULTI_VALUE' undeclared (first use in this function)
cc1: warnings being treated as errors
set-misc-nginx-module/src/ngx_http_set_default_value.c:42: warning: implicit declaration of function 'ndk_set_var_multi_value_core'
set-misc-nginx-module/src/ngx_http_set_default_value.c:42: warning: return makes pointer from integer without a cast
make[1]: *** [objs/addon/src/ngx_http_set_default_value.o] Error 1
make[1]: Leaving directory `/home/admin/src/nginx-source/nginx-0.8.52'
make: *** [build] Error 2

  看起来好像是有.h文件没有正确被包含,导致一些定义没有导入。翻了一下代码,发现是devel_kit做了一些升级,同时set misc的config写得有问题,所以就导致了后面编译老出现什么函数内联定义找不到,宏找不到...

  nginx_devel_kit假设基于它开发的第三方包,需要在自己的config里申明所需要的函数包,其中有一些是它默认会包含的,所以就不需要特别申明。而set misc模块的0.15版本中,缺了一些东西。需要补充如下

have=NDK_HASH           . auto/have
have=NDK_UPSTREAM_LIST  . auto/have
have=NDK_SET_VAR        . auto/have
have=NDK_MD5            . auto/have
have=NDK_SHA1           . auto/have
 
USE_OPENSSL=YES
USE_MD5=YES
USE_SHA1=YES

其中增加的是NDK_SET_VAR,NDK_MD5,NDK_SHA1这几个feature的定义,这是看源代码得到的处理方法,否则在config时不会包含必要的定义。NDK_MD5和NDK_SHA1其实是NDK_HASH的子功能,理论上应该统一导入,但是在代码里,它是需要再次判断的,所以只有加上才不会出错。很奇怪的是,原来下面已经有USE_MD5,USE_SHA1的定义,但是却不会正确设置相关的define。如果不加入NDK_MD5和NDK_SHA1的定义,会出现下面的错误。

set-misc-nginx-module/src/ngx_http_set_hash.c: In function 'ngx_http_set_misc_set_sha1':
set-misc-nginx-module/src/ngx_http_set_hash.c:20: warning: implicit declaration of function 'ndk_sha1_hash'
set-misc-nginx-module/src/ngx_http_set_hash.c: In function 'ngx_http_set_misc_set_md5':
set-misc-nginx-module/src/ngx_http_set_hash.c:33: error: 'MD5_DIGEST_LENGTH' undeclared (first use in this function)
set-misc-nginx-module/src/ngx_http_set_hash.c:33: error: (Each undeclared identifier is reported only once
set-misc-nginx-module/src/ngx_http_set_hash.c:33: error: for each function it appears in.)
set-misc-nginx-module/src/ngx_http_set_hash.c:38: warning: implicit declaration of function 'ndk_md5_hash'

加上了这三段,还是不行,因为nginx_devel_kit 0.2.11把ndk_sha1_hash和ndk_md5_hash这两个函数定义修改了一下,第一个入参从char *改到了u_char *,必须要修改set misc模块中的对应的函数调用,否则会报一个申明和使用指针类型不符的错误,导致编译失败。具体修改set misc模块src目录下的文件ngx_http_set_hash.c

p = ngx_palloc(r->pool, SHA_DIGEST_LENGTH * 2);
    if (p == NULL) {
        return NGX_ERROR;
    }
 
    ndk_sha1_hash((u_char *) p, (char *) v->data, v->len);
 
    res->data = p;

    u_char                  *p;
    p = ngx_palloc(r->pool, MD5_DIGEST_LENGTH * 2);
    if (p == NULL) {
        return NGX_ERROR;
    }
 
    ndk_md5_hash((u_char *) p, (char *) v->data, v->len);
 
    res->data = p;

改完后,即可正确配置和编译。

博客日志: 

Submitted by gettyying (not verified) on 2010, October 21 - 07:43

遇到了相似的问题,但是我这边是NDK本身出问题了~

Submitted by gettyying (not verified) on 2010, October 21 - 07:45

对了,楼主是否有用过 Nginx的memc 缓存 echo 合并后的内容?

Submitted by allblue on 2010, October 22 - 13:40

还没试过,有问题么?

Copyright © 2004-2012 allblue All Rights Reserved