微信公众号:郑尔多斯
关注可了解更多的Nginx
知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!nginx
nginx
中configure
脚本在编译nginx
的过程当中是很是重要的,它完成了各个编译参数的配置,路径的配置等功能。从本文开始,分析一下configure
脚本的工做过程。
首先,咱们看一下configure
脚本的构成,以下图所示:
web
configure
过程当中到底发生了什么。
咱们先看一下configure
脚本的源码,以下:数组
1################## nginx/auto/configure #######################
2
3//执行auto/options文件中的命令,行中的“.”表示在当前的sh环境中执行auto/options
4//文件中的命令(与source命令效果同样)不一样于sh命令会致使建立子进程,因为configure
5//文件中命令与options的命令都在同一sh环境下,因此变量在两个文件中都是彼此可见的
6. auto/options //置变量,并将之置空
7. auto/init //初始化一些变量诸如:NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h
8. auto/sources //设置核心模块、平台代码对应的源文件
9
10test -d $NGX_OBJS || mkdir -p $NGX_OBJS
11
12echo > $NGX_AUTO_HEADERS_H
13echo > $NGX_AUTOCONF_ERR
14
15echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H
16
17if [ $NGX_DEBUG = YES ]; then
18 have=NGX_DEBUG . auto/have #设置NGX_DEBUG=1
19fi
20
21.....
22
23. auto/cc/conf //检查编译器相关选项
24
25if [ "$NGX_PLATFORM" != win32 ]; then
26 . auto/headers //检查相关头文件,并将结果输出到ngx_auto_headers.h文件中
27fi
28
29. auto/os/conf //检查系统平台所需的函数
30
31if [ "$NGX_PLATFORM" != win32 ]; then
32 . auto/unix #检查unix环境下一些文件、函数
33fi
34
35. auto/threads
36
37//统计要编译到nginx中的模块信息,建立并初始化ngx_module_t *ngx_modules[]和
38//char *ngx_module_names[]两个数组中(这两个数组在init_cycle中被调用)存放
39//到以前建立的nginx/objs/ngx_modules.c文件中
40. auto/modules
41. auto/lib/conf
42
43.......
44
45//定义变量NGX_SBIN_PATH的值为"\"$NGX_SBIN_PATH\""
46have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define
47have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define
48have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define
复制代码
从上面能够看出来,configure
调用了 auto/options
脚本,从名字能够看出来,这个脚本的做用就是处理传递给 configure
脚本的各个参数,好比 ./configure --with-http_gzip_static_module --prefix=/usr/nginx/
,那么 auto/option
脚本就会处理 configure
后面的参数,本节咱们就分析一下这个脚本的具体做用。服务器
该文件的开始部分是初始化一些变量,没啥能够分析的。最重要的部分就是下面的for
循环部分,这部分负责处理configure
的配置参数。咱们着重分析这部分代码:微信
1// for 后面只有变量的时候,至关于 for var in $*,即至关于把传给文件的全部参数都传了过去
2for option
3do
4 opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"
5
6 case "$option" in
7// 这里会判断若是 $option是以"-"开头,而且中间有"="的话,
8// 好比例子中的 --prefix=/usr/nginx/,那么sed命令会把等号"="以前的全部字符都替换为空,
9// 而后剩下的部分赋值给 value变量。因此上面的语句最后value=/usr/nginx/
10 -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
11 *) value="" ;;
12 esac
13 // 这里根据 $option 的值来进行不一样的判断,咱们例子中的
14// 选项会触发下面的 --prefix=* 以及 --with-http_gzip_static_module,
15// 从而分别设置不一样的变量,这些变量在后面会使用
16 case "$option" in
17 --help) help=yes ;;
18
19 --prefix=) NGX_PREFIX="!" ;;
20 --prefix=*) NGX_PREFIX="$value" ;;
21 --with-http_gzip_static_module) HTTP_GZIP_STATIC=YES ;;
22 *)
23 echo "$0: error: invalid option \"$option\""
24 exit 1
25 ;;
26 esac
27done
复制代码
而后,auto/options
后面紧跟着的脚本是输出帮助信息的,若是咱们执行 ./configure --help
,那么 help
变量就会被设置为yes
,那么就会执行下面的输出信息,纯文本输出,没有什么可说的。app
而后接着:函数
1--without-http) HTTP=NO
2
3if [ $HTTP = NO ]; then
4 HTTP_CHARSET=NO
5 HTTP_GZIP=NO
6 HTTP_SSI=NO
7 HTTP_USERID=NO
8 HTTP_ACCESS=NO
9 HTTP_STATUS=NO
10 HTTP_REWRITE=NO
11 HTTP_PROXY=NO
12 HTTP_FASTCGI=NO
13fi
复制代码
这里会根据 HTTP
变量的值进行一些初始化操做,当咱们在执行configure
脚本的时候,若传递的参数是 --without-http
,那么 HTTP
变量就会设置为 NO
,那么就执行上面的一些初始化代码,可是我并无发现有人用过这个选项。咱们使用nginx就是做为一个HTTP服务器的,为啥要 --without-http
呢?难道是做为邮件服务器吗?oop
剩下的部份内容就是一些变量的初始化了,很简单,你们看一下就明白。
后续的文章会分析其余文件的代码,敬请关注
ui