既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
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=
![img](https://img-blog.csdnimg.cn/img_convert/4e2b21d1d1e4f6df8f0a5e131f5330ad.png)
![img](https://img-blog.csdnimg.cn/img_convert/fa28b421742ee38a45e216f25e40f1b2.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**