nginx编译成静态库

编译成静态库主要是为了在 nginx 外部测试用,不建议用于实际项目,静态库生成的可执行文件太庞大。

自己下载好 nginx 最新版源代码,然后解压缩后进入该目录,把 src/core/nginx.c 的 main 函数名改成 ngx_main,然后进行编译。

wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar -xvf nginx-1.14.0.tar.gz

cd nginx-1.14.0
./configure

#记住,此时要把 nginx.c 里面的main函数名改了,免得后面链接的时候有两个 main 函数
#还有就是为了调试方便,最好关掉编译优化,修改 auto/cc/gcc 里 NGX_GCC_OPT="-O0"

make

然后把所有的 .o 文件打包成静态库,然后复制到默认的库搜索路径,本人 centos7 64位为 /usr/lib64。

ar -rc libnginx.a `find objs -name *.o`

cp libnginx.a /usr/lib64/

接下来把所有的头文件复制到 /usr/include/nginx。

mkdir /usr/include/nginx

cp `find src -name *.h` /usr/include/nginx/

接下来编写 main.c 来测试

#include <ngx_core.h>

int main(){
    ngx_rbtree_t      tree;      //声明红黑树
    ngx_rbtree_node_t sentinel;  //声明哨兵节点
 
    //初始化
    ngx_rbtree_init(&tree, &sentinel, ngx_str_rbtree_insert_value);
 
    ngx_str_node_t strNode[5];
 
    //这里的 key 我们一般会取字符串的 hash 值
    //这里为了方便,直接使用随意数字代替
    ngx_str_set(&strNode[0].str, "abc0");
    strNode[0].node.key = ngx_crc32_long(strNode[0].str.data, strNode[0].str.len);  
 
    ngx_str_set(&strNode[1].str, "abc1");
    strNode[1].node.key = ngx_crc32_long(strNode[1].str.data, strNode[1].str.len);
 
    ngx_str_set(&strNode[2].str, "abc2");
    strNode[2].node.key = ngx_crc32_long(strNode[2].str.data, strNode[2].str.len);

    ngx_str_set(&strNode[3].str, "abc35");
    strNode[3].node.key = ngx_crc32_long(strNode[3].str.data, strNode[3].str.len);
 
    ngx_str_set(&strNode[4].str, "abd4");
    strNode[4].node.key = ngx_crc32_long(strNode[4].str.data, strNode[4].str.len);

    //遍历加入到红黑树
    ngx_int_t i;
    for (i = 0; i < 5; ++i){
		ngx_rbtree_insert(&tree, &strNode[i].node);
    }

	ngx_str_node_t *tmpnode;
    //查找红黑树中最小节点
    tmpnode = (ngx_str_node_t *)ngx_rbtree_min(tree.root, &sentinel);

    //超找特定的字符串
    tmpnode = (ngx_str_node_t *)ngx_str_rbtree_lookup(&tree, &strNode[0].str, 8);
}
gcc main.c -lnginx -lpthread -lpcre -lssl -lcrypto -lz -lcrypt -ldl -I /usr/include/nginx/

编译通过。

上一篇: nginx 内置模块解析 - ngx_http_static_module
下一篇: nginx http模块开发(1) - 基础
作者邮箱: 203328517@qq.com