• 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 optiondo...
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…
ENDexit 1
fi

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

4 是否关闭 HTTP 功能

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

if [ $HTTP = NO ]; thenHTTP_CHARSET=NOHTTP_GZIP=NOHTTP_SSI=NOHTTP_USERID=NOHTTP_ACCESS=NOHTTP_STATUS=NOHTTP_REWRITE=NOHTTP_PROXY=NOHTTP_FASTCGI=NO
fi

5 是否指定运行于 Windows 平台

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

if [ ".$NGX_PLATFORM" = ".win32" ]; thenNGX_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" ]; thenNGX_ERROR_LOG_PATH=
elseNGX_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脚本,所有的配置项已经被正确解析并加载到相应的配置变量中了。

-

转载请注明来自“柳大的CSDN博客”:blog.csdn.net/Poechant

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

  1. 脚本修改linux网络配置,用脚本实现Linux的网络配置

    写了一个用脚本实现用交互模式实现网络地址的修改的bash脚本,给大家分享一下 #!/bin/bash read -p "qing shu ru ni xiang she zhi de wan ...

  2. Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules

    Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules 1.相关文章 2.前言 3.auto/module脚本文件详解 3.1.设置ngx_var的值 3.2.当ngx_module_ ...

  3. Nginx 自动url decode探究及如何避免url decode

    场景 有个查询项目详情接口 /projects/{name},正好我们要查询名称为 root/name 的项目,此时我们不能直接访问 /projects/root/name,这样会被系统误认为是要查询 ...

  4. lua脚本php,phpStudy中起用lua脚本_PHP教程

    phpStudy集成了多种web服务的综合配置,如经典的apache+mysql.nginx+mysql等,在使用apache+mysql时,希望能够使用lua脚本,于是利用配置选项,启用lua模块, ...

  5. linux自动配置bond0脚本、bond0和bond1双链路脚本、批量配置bond脚本步骤

    文章目录 说明[必看] 双bond脚本 执行成功的界面如下 bond脚本内容 删除已配置的bond方法 遍历执行过程 说明 遍历脚本代码 执行查看效果 批量拷贝bond脚本代码 执行查看效果 批量执行 ...

  6. 【实用篇】Nginx的配置文件以及案例详细配置实现

    [实用篇]Nginx的配置文件以及案例配置实现 一.nginx 的配置文件 二.配置实例-反向代理 反向代理实例 1 反向代理实例 2 补充:关于 location 指令的说明 三.配置实例-负载均衡 ...

  7. Nginx自动安装脚本

    如下脚本为Nginx自动安装脚本,仅供参考,可以根据实际情况修改,这里使用case方式,真实环境安装可以去掉case这种模式,全自动安装. #!/bin/sh ###nginx install she ...

  8. AD9364 测试平台开发——第六篇,SPI配置内容解析

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 AD9364 测试平台开发--第六篇,SPI配置内容解析 以下为个人的一些理解,有一些东西可能不一定理解透彻了,可能有错误,请指正和见 ...

  9. 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)

    解剖SQLSERVER 第四篇  OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几 ...

最新文章

  1. 4.4MSSQLServer常用版本介绍
  2. 关于面向对象的总结和疑惑(转载可乐冰
  3. 【nodejs爬虫】使用async控制并发写一个小说爬虫
  4. python list超出范围_使用lxmldjango/python-list索引超出范围
  5. git合并多个commit成为一个commit
  6. autojsui界面关闭_autojs 第九次 ui界面交互获取
  7. CTL_CODE说明
  8. Flash与数学:圆(2)
  9. 软件开发实践的24条军规
  10. 把一个web项目改名后复制,再把改名后的web项目发布到tomcat,访问出现404错误的解决办法
  11. android自动挂掉电话,Android-实现电话自动接听/电话自动挂断功能
  12. 通用即插即用监视器驱动下载_大楚云控下载-大楚云控电脑客户端1.0.7 官方版...
  13. 测试 - 用例篇 - 细节狂魔
  14. CQI related
  15. 数十万互联网从业者的共同关注!
  16. 代码片段plus ??? 打工神器: 飞冰物料库
  17. python在线查题_知到题目在线答案查询
  18. 苹果Mac电脑怎么删除文件
  19. Java多线程:Lambda 表达式
  20. Vue过滤器的介绍和使用

热门文章

  1. ubuntu安装samba
  2. 使用Custom.pll修改标准Form的LOV
  3. CodeForces - 1537E2 Erase and Extend (Hard Version)(扩展KMP-比较两个前缀无限循环后的字典序大小)
  4. CodeForces - 351E Jeff and Permutation(贪心)
  5. UVALive - 7511 Multiplication Table(暴力+模拟)
  6. CodeForces - 1321D Navigation S.ystem(最短路+思维)
  7. (转)网络流-最大流 SAP算法(模板)
  8. CodeForces - 91B Queue(单调队列+二分)
  9. python哈夫曼树_python霍夫曼树
  10. DCN RepPoints解读