Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf
Posted 彼方丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf相关的知识,希望对你有一定的参考价值。
nginx编译配置脚本篇(9)- 动态库配置脚本auto/lib/conf
1、相关文章
由于学习本文需要Nginx
源码及搭建相关的编译环境,且本文与前面的文章有先后呼应关系,所以建议大家按以下文章顺序阅读
- CentOS 7使用源码编译安装Nginx,以及配置使用autoindex模块
- Nginx配置编译脚本篇(1)- 解析配置选项脚本auto/options
- Nginx编译配置脚本篇(2)- Makefile初始化脚本auto/init
- Nginx编译配置脚本篇(3)- 源码相关变量脚本auto/sources
- Nginx编译配置脚本篇(4)- 工具型脚本系列
- Nginx编译配置脚本篇(5)- 编译器相关脚本
- Nginx编译配置脚本篇(6)- 系统环境相关脚本
- Nginx编译配置脚本篇(7)- UNIX环境脚本auto/unix
- Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules
2、前言
Nginx
的编译是需要依赖一些第三方库的,比如说openssl
、zlib
等等,本文将介绍Nginx
是如何使用脚本文件去配置这些第三方库的引用信息的。
3、auto/lib/conf脚本文件详解
代码如下:
if [ $USE_PCRE = YES -o $PCRE != NONE ]; then
. auto/lib/pcre/conf
else
if [ $USE_PCRE = DISABLED -a $HTTP = YES -a $HTTP_REWRITE = YES ]; then
cat << END
$0: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option or you have to enable the PCRE support.
END
exit 1
fi
fi
if [ $USE_OPENSSL = YES ]; then
. auto/lib/openssl/conf
fi
if [ $USE_ZLIB = YES ]; then
. auto/lib/zlib/conf
fi
if [ $USE_LIBXSLT != NO ]; then
. auto/lib/libxslt/conf
fi
if [ $USE_LIBGD != NO ]; then
. auto/lib/libgd/conf
fi
if [ $USE_PERL != NO ]; then
. auto/lib/perl/conf
fi
if [ $USE_GEOIP != NO ]; then
. auto/lib/geoip/conf
fi
if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then
. auto/lib/google-perftools/conf
fi
if [ $NGX_LIBATOMIC != NO ]; then
. auto/lib/libatomic/conf
fi
从代码中可以看出以下几点信息:
- 该脚本是一个整合的脚本,其本身不做什么处理,而是根据条件去调用对应的脚本文件(
auto/lib/
目录下的每一个子目录表示一个动态库) auto/lib/conf
脚本里面用到的那些作为判断条件的变量,例如USE_PCRE
、USE_OPENSSL
、USE_ZLIB
等等,都是在auto/modules
里面设置的,建议没看过这篇文章 Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules 的读者倒回去看一下- 由于各个动态库的配置过程大致相同,下面就以
auto/lib/openssl/conf
为例去讲解一下配置过程,其它的读者可以自行查阅源码
4、auto/lib/openssl/conf脚本文件详解
4.1、OPENSSL的值不为NONE的情况
从这篇文章 Nginx配置编译脚本篇(1)- 解析配置选项脚本auto/options 可以知道,OPENSSL
的值是根据我们传入脚本的参数来设置的,默认为NONE
。
代码如下:
if [ $OPENSSL != NONE ]; then
case "$CC" in
cl | bcc32)
have=NGX_OPENSSL . auto/have
have=NGX_SSL . auto/have
CFLAGS="$CFLAGS -DNO_SYS_TYPES_H"
CORE_INCS="$CORE_INCS $OPENSSL/openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/openssl/include/openssl/ssl.h"
if [ -f $OPENSSL/ms/do_ms.bat ]; then
# before OpenSSL 1.1.0
CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib"
CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib"
else
# OpenSSL 1.1.0+
CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libssl.lib"
CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libcrypto.lib"
fi
# libeay32.lib requires gdi32.lib
CORE_LIBS="$CORE_LIBS gdi32.lib"
# OpenSSL 1.0.0 requires crypt32.lib
CORE_LIBS="$CORE_LIBS crypt32.lib"
;;
*)
have=NGX_OPENSSL . auto/have
have=NGX_SSL . auto/have
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
CORE_LIBS="$CORE_LIBS $NGX_LIBPTHREAD"
if [ "$NGX_PLATFORM" = win32 ]; then
CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32"
fi
;;
esac
从代码中可以看出以下几点信息:
- 代码中有个选择语句,是根据编译器的不同选择执行对应的代码的
- 以下面那个通用的分支为例,可以看到首先是使用
auto/have
将两个宏NGX_OPENSSL
和NGX_SSL
写入到头文件里(auto/have
的内容前面的文章有讲到,这里就不赘述了) - 然后在
CORE_INCS
变量后面添加openssl
头文件目录,在CORE_DEPS
变量后面添加openssl
相关头文件,在CORE_LIBS
变量后面添加openssl
相关的静态库,从这里可以看出OPENSSL
参数实际上是指定了openssl
静态库的存放目录,只要我们主动设置了OPENSSL
的参数,后续程序中链接的就是openssl
的静态库了 CORE_INCS
、CORE_DEPS
、CORE_LIBS
这几个变量之前在介绍auto/module
的时候也出现过,到目前为止这几个变量还没有写入到对应的文件中,后续会有脚本使用他们的
4.2、OPENSSL的值为NONE的情况
- 首先,先判断当前平台是不是
win32
,必须不是win32
才能执行下面的代码。可以看到这里也是使用到了auto/feature
这个脚本(不懂auto/feature
的可以看下这篇文章 Nginx编译配置脚本篇(4)- 工具型脚本系列 ),这里就和上面的情况不同了,使用的是动态库的链接方式。
else
if [ "$NGX_PLATFORM" != win32 ]; then
OPENSSL=NO
ngx_feature="OpenSSL library"
ngx_feature_name="NGX_OPENSSL"
ngx_feature_run=no
ngx_feature_incs="#include <openssl/ssl.h>"
ngx_feature_path=
ngx_feature_libs="-lssl -lcrypto $NGX_LIBDL $NGX_LIBPTHREAD"
ngx_feature_test="SSL_CTX_set_options(NULL, 0)"
. auto/feature
- 如果上面的代码测试失败,也就是
ngx_found
的值为no
的情况,执行下面的代码,这是FreeBSD
系统的特化版本,代码和上面的差不多,不过链接的是FreeBSD
的openssl
库而已
if [ $ngx_found = no ]; then
# FreeBSD port
ngx_feature="OpenSSL library in /usr/local/"
ngx_feature_path="/usr/local/include"
if [ $NGX_RPATH = YES ]; then
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto"
else
ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto"
fi
ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
. auto/feature
fi
- 和上面的情况类似,是
NetBSD
系统的特化版本
if [ $ngx_found = no ]; then
# NetBSD port
ngx_feature="OpenSSL library in /usr/pkg/"
ngx_feature_path="/usr/pkg/include"
if [ $NGX_RPATH = YES ]; then
ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lssl -lcrypto"
else
ngx_feature_libs="-L/usr/pkg/lib -lssl -lcrypto"
fi
ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
. auto/feature
fi
- 和上面的情况类似,是
Mac
系统的特化版本
if [ $ngx_found = no ]; then
# MacPorts
ngx_feature="OpenSSL library in /opt/local/"
ngx_feature_path="/opt/local/include"
if [ $NGX_RPATH = YES ]; then
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lssl -lcrypto"
else
ngx_feature_libs="-L/opt/local/lib -lssl -lcrypto"
fi
ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
. auto/feature
fi
- 这里和前面的链接静态库那里差不多,不过少设置了一个
NGX_OPENSSL
宏
if [ $ngx_found = yes ]; then
have=NGX_SSL . auto/have
CORE_INCS="$CORE_INCS $ngx_feature_path"
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
OPENSSL=YES
fi
fi
- 最后如果
openssl
库相关的内容设置失败,则输出报错信息然后退出配置文件
if [ $OPENSSL != YES ]; then
cat << END
$0: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.
END
exit 1
fi
fi
5、总结
本文主要介绍了与动态库配置脚本相关的内容,从文中可以看出这些脚本并没有往文件里写入很重要的信息,只是写了几个宏到头文件里而已,但是其和auto/module
做了类似的工作,
就是往CORE_INCS
、CORE_DEPS
、CORE_LIBS
等变量里面添加了和动态库相关的内容,这些变量将会在之后被其它脚本所使用。
以上是关于Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf的主要内容,如果未能解决你的问题,请参考以下文章
Nginx配置编译脚本篇- 解析配置选项脚本auto/options
Nginx编译配置脚本篇- 源码相关变量脚本auto/sources