您的位置:首页 > 运维架构 > Nginx

解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options

2014-10-24 23:48 1191 查看


解剖 Nginx ·自动脚本篇(1)解析配置选项脚本 auto/options

Author: Poechant

Blog: blog.CSDN.net/Poechant

Email: zhongchao.ustc#gmail.com (#->@)

Date: March 4th, 2012

Copyright © 柳大·Poechant

在安装
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_PATH
NGX_LOCK_PATH
,分别对应
configure
参数
--pid-path
--lock-path
,其缺省值分别为
logs/nginx.pid
logs/nginx.lock

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

关于nginx 我测试的是,只有启动nginx后才能出现nginx.pid


8 错误日志文件路径

如果指定了参数
--error-log-path
NGX_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
脚本,所有的配置项已经被正确解析并加载到相应的配置变量中了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: