解剖 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 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 fi5 是否指定運行于 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_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}8 錯誤日志文件路徑
如果指定了參數--error-log-path則NGX_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} fi9 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;; esac11 小結
通過運行auto/options腳本,所有的配置項已經被正確解析并加載到相應的配置變量中了。
-
轉載請注明來自“柳大的CSDN博客”:blog.csdn.net/Poechant
總結
以上是生活随笔為你收集整理的解剖 Nginx ·自动脚本篇(1)解析配置选项脚本 auto/options的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: configure脚本分析
- 下一篇: Linux性能评测工具之一:gprof篇