Nginx配置编译脚本篇- 解析配置选项脚本auto/options
Posted 彼方丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx配置编译脚本篇- 解析配置选项脚本auto/options相关的知识,希望对你有一定的参考价值。
nginx编译配置脚本篇(1)- 解析配置选项脚本auto/options
1、相关文章
由于学习本文需要Nginx
源码及搭建相关的编译环境,所以建议大家按以下文章顺序阅读
2、前言
本文将分析Nginx
的解析配置选项脚本auto/options
,该脚本是在configure
文件中被调用的,要看懂该文件需要一定的Shell
编程基础,不过语法不是很难,本文将详细分析里面的内容。
(configure
文件将在最后一篇关于Nginx
脚本配置文件的文章中讲解)
3、auto/options文件详解
3.1、初始化变量
auto/options
开头是声明了一堆的变量,大家可以稍微浏览一下定义了哪些变量,其中有一个比较重要的语法,就是CC=${CC:-cc}
,此句的作用是当CC
为空时,在命令行用cc
替换CC=${CC:-cc}
,即当CC
为空时,上述命令变为CC=cc
,其他类似的指令如下表
命令 | 作用 |
---|---|
${var:-string} | 若变量var为空,则在命令行中用string替换${var:-string},这个过程中并不改变var本身的值 |
${var:=string} | 若变量var为空,则在命令行中用string替换${var:=string},并且将var的值也改为string |
${var:+string} | 若变量var不为空,则在命令行中用string替换${var:+string},这个过程中并不改变var本身的值 |
${var:?string} | 若变量var为空,则把string输出到标准错误去,并从脚本中退出,若var不为空,则在命令行中用var替换${var:?string} |
3.2、读取传入配置参数
因为auto/options
是在configure
中被调用的,所以解析的参数也就是用户在执行configure
脚本所传入的参数。其中最重要的部分是从这段开始的,代码如下:
opt=
for option
do
...
done
代码有所省略,这段主要的作用是循环解析我们运行configure
时传入的参数选项,for
循环每次对应一个参数选项option
,例如./configure --user=haha --group=hehe
,则会循环两次,第一次是–user=haha
,第二次是–group=hehe
,要注意的是最上面有一个全局变量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
的值设为空。
接下来的case-esac
语句用来匹配参数的类型,如下:
case "$option" in
--help) help=yes ;;
--prefix=) NGX_PREFIX="!" ;;
--prefix=*) NGX_PREFIX="$value" ;;
--sbin-path=*) NGX_SBIN_PATH="$value" ;;
--modules-path=*) NGX_MODULES_PATH="$value" ;;
--conf-path=*) NGX_CONF_PATH="$value" ;;
--error-log-path=*) NGX_ERROR_LOG_PATH="$value";;
--pid-path=*) NGX_PID_PATH="$value" ;;
--lock-path=*) NGX_LOCK_PATH="$value" ;;
--user=*) NGX_USER="$value" ;;
--group=*) NGX_GROUP="$value" ;;
...
esac
可以看到,各匹配的分支语句中进行配置变量的赋值,这些变量在auto/options
最开始处已经被赋予默认值了,在这里再根据脚本的传入参数对这些进行赋值。需要注意的是,如果option
并不匹配这些任意一个,也就是用户使用configure
脚本的时候传入的参数错误,则会匹配以下语句:
*)
echo "$0: error: invalid option \\"$option\\""
exit 1
;;
从而提示用户参数错误,并使脚本退出。如果没有出现错误,进过多次循环,就结束for-do-done
3.3、设置NGX_CONFIGURE变量的值
处理完全部option
之后,上面提到的那个opt
就被赋值到NGX_CONFIGURE
变量里去了,代码如下:
NGX_CONFIGURE="$opt"
3.4、显示帮助信息
根据前面的help
变量的值选择是否显示帮助信息,help变量是在前面的for-do-done
里面设置的,代码如下:
if [ $help = yes ]; then
cat << END
--help print this message
--prefix=PATH set installation prefix
--sbin-path=PATH set nginx binary pathname
--modules-path=PATH set modules path
--conf-path=PATH set nginx.conf pathname
--error-log-path=PATH set error log pathname
--pid-path=PATH set nginx.pid pathname
--lock-path=PATH set nginx.lock pathname
--user=USER set non-privileged user for
worker processes
--group=GROUP set non-privileged group for
worker processes
...
END
exit 1
fi
3.5、设置NGX_WINE变量的值
如果前面显示指定了–crossbuild
参数,则变量NGX_PLATFORM
会被赋予传入的参数值,一般考虑在Windows平台使用时才会用到该参数,如下:
if [ ".$NGX_PLATFORM" = ".win32" ]; then
NGX_WINE=$WINE
fi
3.6、设置各类文件路径
接下来会设置部分参数,这些参数都是和文件路径相关的,只有当我们前面没有指定这些参数值时,才会根据下面的内容去设置,代码如下,注释里面介绍了各个路径的用途(需要注意的是这些路径是相对于安装路径的,而不是绝对路径的)
NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx} # 设置nginx可执行文件的路径
NGX_MODULES_PATH=${NGX_MODULES_PATH:-modules} # 设置nginx模块文件路径
NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf} # 设置nginx配置文件路径
NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH` # 获取nginx配置文件所在目录
NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid} # 设置nginx PID文件路径
NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock} # 设置nginx锁文件路径
# 设置错误日志文件路径
if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then
NGX_ERROR_LOG_PATH=
else
NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}
fi
NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log} # 设置日志文件路径
# HTTP相关各路径设置
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}
# perl模块路径设置
case ".$NGX_PERL_MODULES" in
./*)
;;
.)
;;
*)
NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES
;;
esac
4、总结
通过运行auto/options
脚本,所有的配置项已经就被正确解析并加载到相应的配置变量中了。因为我们在执行configure
文件时,传入的配置项都是在这个文件处理的,所以当我们需要开启某一功能又不知道怎么配置时,可以先不急着百度,来这个文件找一找也是可以的。
以上是关于Nginx配置编译脚本篇- 解析配置选项脚本auto/options的主要内容,如果未能解决你的问题,请参考以下文章
Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf