在安装Nginx之前(即运行make脚本之前),首先是进行安装的配置准备,包括环境检查及生成文件。这些工作是由自动脚本完成的。和绝大多数软件一样,Nginx的自动脚本的入口,同样是名为configure的文件。

除了configure,其他的自动脚本都在auto目录下。通过分析configure脚本源码,我们可以看到,configure首先运行了auto目录下的几个自动脚本,如下:

. auto/options
. auto/init
. auto/sources

其中通过运行auto/options脚本,来设定配置选项。下面将逐步分析auto/options脚本是如何工作的。

1 读取configure配置参数

开始先声明了 N 多变量,然后最主要的部分从这段开始:

opt=

for option
do
...
done

这段实际上是处理运行./configure的时候携带的参数选项,for循环每次对应一个参数选项 option。要注意for循环体上面有一个全局的opt变量。这个循环体内的第一个语句是最重要是,它是:

opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"

通过循环运行该语句后,opt的值就是一个由空格来分隔的参数列表。然后在循环体中接下来是一个case-esac,用来得到参数值,如下:

case "$option" in
-*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
*) value="" ;;
esac

其含义是将value赋值为参数选项值,如果选项值不与-*=*的模式匹配,则value值为""。接下来的case-esac语句用来匹配参数的类型。

    case "$option" in
--help) help=yes ;;
--prefix=) NGX_PREFIX="!" ;;
--prefix=*) NGX_PREFIX="$value" ;;
--sbin-path=*) NGX_SBIN_PATH="$value" ;;
--conf-path=*) NGX_CONF_PATH="$value" ;;
...
esac

各匹配的分支语句中进行配置变量的赋值。这些变量在auto/options脚本的最开始处赋以默认值,其中那些模块配置变量被赋以YES的表示默认开启,赋以NO的表示默认关闭。但它们开启与否由这个auto/options中的case-esac语句来决定。还有一些是安装相关的选项变量也在这里被赋值,比如:

  • prefix参数值被赋予NGX_PREFIX
  • sbin-path参数值被赋予NGX_SBIN_PATH
  • conf-path参数值被赋予NGX_CONF_PATH
  • error-log-path参数值被赋予NGX_ERROR_LOG_PATH
  • pid-path参数值被赋予NGX_PID_PATH
  • lock-path参数值被赋予NGX_LOCK_PATH

如果option并不符合预设的这些匹配,也就是用户使用configure脚本的时候携带的参数错误,则auto/options会匹配该语句:

*)
echo "$0: error: invalid option \"$option\""
exit 1

从而提示用户参数错误,并使脚本退出运行。经过多次循环,for-do-done就结束。

2 设定NGX_CONFIGURE变量

处理完所有option后,opt就如我们上面提到的,成为由空格分割的配置项值,并被赋给NGX_CONFIGURE变量:

NGX_CONFIGURE="$opt"

3 是否显示configure的帮助信息

再看下面这句:

if [ $help = yes ]; then
cat << END

END
exit 1
fi

默认情况下$help变量值在初始化时就为no。如果configure选项中指定了help参数,则$help参数为yes,则会运行cat命令,显示大段的帮助信息,然后退出。

4 是否关闭 HTTP 功能

默认情况下HTTP的一些基本功能是被开启的,如果用户指定了--without-http参数,则变量HTTP会被赋值为NO,则下面这段代码if-fi中的语句会被执行:

if [ $HTTP = NO ]; then
HTTP_CHARSET=NO
HTTP_GZIP=NO
HTTP_SSI=NO
HTTP_USERID=NO
HTTP_ACCESS=NO
HTTP_STATUS=NO
HTTP_REWRITE=NO
HTTP_PROXY=NO
HTTP_FASTCGI=NO
fi

5 是否指定运行于 Windows 平台

如果显式指定了--crossbuild参数,则变量NGX_PLATFORM会被赋予当前for-do-done循环中的"$value"值,也就是--crossbuild的参数值,一般在考虑在Windows平台使用时才会用到,看下面的语句:

if [ ".$NGX_PLATFORM" = ".win32" ]; then
NGX_WINE=$WINE
fi

如果指定--crossbuild=win32,则NGX_WINE就会被赋值了。

6 Nginx 配置文件路径

在加载configure的参数时,如果没有指定了--conf-path参数,则$NGX_CONF_PATH变量是没有值的,则下面的语句会为NGX_CONF_PATH赋以conf/nginx.conf的缺省值。不过我在想老毛子 Igor Sysoev 同学完全可以在auto/options开始处和其他参数一样先指定NGX_CONF_PATH的默认值。

NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}

然后获取配置文件所在目录的:

NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`

如果指定参数--conf-path=/home/michael/nginx/conf/nginx.conf,则NGX_CONF_PREFIX的值就是/home/michael/nginx/conf

7 Nginx 进程 ID 文件和锁文件路径

下面是同样的方式初始化NGX_PID_PATHNGX_LOCK_PATH,分别对应configure参数--pid-path--lock-path,其缺省值分别为logs/nginx.pidlogs/nginx.lock

NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}
NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}

8 错误日志文件路径

如果指定了参数--error-log-pathNGX_ERROR_LOG_PATH变量的值会被指定,根据下面的语句,如果指定的是stderr则将NGX_ERROR_LOG_PATH修改为空,即不需要错误日志文件。如果不是标准输出,且其值为空,则设置为缺省值logs/error.log

if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then
NGX_ERROR_LOG_PATH=
else
NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}
fi

9 HTTP 相关各路径

NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log}
NGX_HTTP_CLIENT_TEMP_PATH=${NGX_HTTP_CLIENT_TEMP_PATH:-client_body_temp}
NGX_HTTP_PROXY_TEMP_PATH=${NGX_HTTP_PROXY_TEMP_PATH:-proxy_temp}
NGX_HTTP_FASTCGI_TEMP_PATH=${NGX_HTTP_FASTCGI_TEMP_PATH:-fastcgi_temp}
NGX_HTTP_UWSGI_TEMP_PATH=${NGX_HTTP_UWSGI_TEMP_PATH:-uwsgi_temp}
NGX_HTTP_SCGI_TEMP_PATH=${NGX_HTTP_SCGI_TEMP_PATH:-scgi_temp}

10 Perl 模块

如果指定了--with-perl_modules_path参数,则NGX_PERL_MODULES变量即被设定。如果指定的值为一个绝对路径或未指定(空),则当做相对路径来处理,设定为$NGX_PREFIX/$NGX_PERL_MODULES

case ".$NGX_PERL_MODULES" in
./*)
;; .)
;; *)
NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES
;;
esac

11 小结

通过运行auto/options脚本,所有的配置项已经被正确解析并加载到相应的配置变量中了。

-

解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options的更多相关文章

  1. 解剖Nginx·自动脚本篇(5)编译器相关主脚本

    在 Nginx 的自动脚本中,auto/cc目录下的所有脚本都是用于编译器相关配置使用的.Nginx的出色跨平台性(Linux.Darwin.Solaris.Win32 等)就有这些脚本的贡献.该目录 ...

  2. 解剖Nginx·自动脚本篇(4)工具型脚本系列

    目录 auto/have 向自动配置头文件追加可用宏定义(objs/ngx_auto_config.h) auto/nohave 向自动配置头文件追加不可用宏定义(objs/ngx_auto_conf ...

  3. 解剖Nginx·自动脚本篇(3)源码相关变量脚本 auto/sources

    在configure脚本中,运行完auto/options和auto/init脚本后,接下来就运行auto/soures脚本.这个脚本是为编译做准备的. 目录 核心模块 事件模块 OpenSSL 模块 ...

  4. 解剖Nginx·自动脚本篇(2)设置初始变量脚本 auto/init

    在configure中运行完auto/options脚本后,接着运行auto/init脚本,其中所做的工作如下. 1 Makefile文件名变量 默认情况下是: objs/Makefile 代码如下: ...

  5. 解剖Nginx·自动脚本篇(6)编译器名称变量脚本 auto/cc/name

    回顾变量 CC 最初是在auto/options脚本中初始化的: CC=${CC:-gcc} 1 C Compiler 的 feature Windows 平台的编译器叫做MSVC,其他平台的都统称为 ...

  6. 解剖Nginx·自动脚本篇(7)类型相关脚本系列

    1 auto/types/sizeof 该脚本的功能,是通过测试程序获知给定的ngx_type的大小. 1.1 显示提示信息 echo $ngx_n "checking for $ngx_t ...

  7. 解剖Nginx·模块开发篇(4)模块开发中的命名规则和模块加载与运行流程

    1 命名规则 1.1 基本变量 基本变量有三个: ngx_module_t 类型的 ngx_http_foo_bar_module: ngx_command_t 类型的数组 ngx_http_foo_ ...

  8. 解剖Nginx·模块开发篇(5)解读内置非默认模块 ngx_http_stub_status_module

    1 Background ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的 ...

  9. 解剖Nginx·模块开发篇(3)ngx_http_hello_world_module 模块的基本函数实现

    还记得我们定义过一个结构体如下吗? typedef struct { ngx_str_t output_words; } ngx_http_hello_world_loc_conf_t; 它就是 He ...

随机推荐

  1. 转发 GSLB概要和实现原理

    What is GSLB Global Server Load Balancing 中文:全局负载均衡 SLB(Server load balancing)是对集群内物理主机的负载均衡,而GSLB是对 ...

  2. bzoj 4036 按位或 —— min-max容斥+FMT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 min-max容斥:https://blog.csdn.net/ez_2016gdgz ...

  3. 浅谈splay

    \(BST\) 二叉查找树,首先它是一颗二叉树,其次它里面每个点都满足以该点左儿子为根的子树里结点的值都小于自己的值,以该点右儿子为根的子树里结点的值都大于自己的值.如果不进行修改,每次查询都是\(O ...

  4. bzoj1040(ZJOI2008)骑士——基环树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1040 基环树的模板. 套路就是把环断开,先把一端作为根节点,强制不选:再把另一端作为根节点, ...

  5. (转)Android DiskLruCache完全解析,硬盘缓存的最佳方案

    摘自:http://blog.csdn.net/guolin_blog/article/details/28863651 转载请注明出处: http://blog.csdn.net/guolin_bl ...

  6. MFC程序如何修改icon图标

    场景: Visual Studio写MFC应用程序,默认的程序左上角图标是自带的(如下图),虽说也不丑,但是对于程序员来说,还是缺乏个性了. 你知道,C.C++.java系程序员最常干的事情就是定义. ...

  7. WebStorm ES6 语法支持设置

    ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0.ES6的目标,是使得JavaS ...

  8. javascript数组的申明方式以及常用方法

    数组的定义: 方法1. var mycars=new Array()mycars[0]="Saab"mycars[1]="Volvo"mycars[2]=&qu ...

  9. css3 box-shadow阴影(外阴影与外发光)讲解

    基础说明:     外阴影:box-shadow: X轴  Y轴  Rpx  color;     属性说明(顺序依次对应): 阴影的X轴(可以使用负值)    阴影的Y轴(可以使用负值)    阴影 ...

  10. 用户从手机的浏览器访问www.baidu.com,看到的可能跟桌面PC电脑,是不太一样的网页效果,会更适合移动设备使用。请简要分析一下,实现这种网页区分显示的原因及技术原理。

    手机的网速问题.屏幕大小.内存.CPU等.通过不同设备的特征,实现不同的网页展现或输出效果.根据useragent.屏幕大小信息.IP.网速.css media Query等原理,实现前端或后端的特征 ...