解剖Nginx·自動指令碼篇(1)解析配置選項指令碼 auto/options
解剖 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}
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
指令碼,所有的配置項已經被正確解析並載入到相應的配置變數中了。
-
轉載請註明來自“柳大的CSDN部落格”:blog.csdn.net/Poechant
-
相關文章
- 解剖Nginx·自動指令碼篇(3)原始碼相關變數指令碼 auto/sourcesNginx指令碼原始碼變數
- 解剖Nginx·自動指令碼篇(2)設定初始變數指令碼 auto/initNginx指令碼變數
- 解剖Nginx·自動指令碼篇(4)工具型指令碼系列Nginx指令碼
- 解剖Nginx·自動指令碼篇(6)編譯器名稱變數指令碼 auto/cc/nameNginx指令碼編譯變數
- 精讀Nginx原始碼·自動指令碼篇(1)如何讀取配置選項?Nginx原始碼指令碼
- 解剖Nginx·自動指令碼篇(7)型別相關指令碼系列Nginx指令碼型別
- 解剖Nginx·自動指令碼篇(5)編譯器相關主指令碼Nginx指令碼編譯
- 精讀Nginx原始碼·自動指令碼篇(2)設定初始變數指令碼 auto/initNginx原始碼指令碼變數
- 精讀 Nginx 原始碼·自動指令碼篇(3)原始碼相關變數指令碼 auto/sourcesNginx原始碼指令碼變數
- 精讀 Nginx·自動指令碼篇(4)工具型指令碼系列Nginx指令碼
- 自動配置php、mysql、nginx的指令碼PHPMySqlNginx指令碼
- 精讀Nginx·自動指令碼篇(5)編譯器相關主指令碼Nginx指令碼編譯
- Ubuntu自動啟動配置指令碼Ubuntu指令碼
- 自動ftp指令碼FTP指令碼
- 使用shell生成orabbix自動化配置指令碼指令碼
- Linux管理指令碼之自動執行指令碼Linux指令碼
- specjvm自動化指令碼JVM指令碼
- 自動備份指令碼指令碼
- docker指令碼自動化Docker指令碼
- LNMP自動部署指令碼LNMP指令碼
- awr自動收集指令碼指令碼
- 自動化RMAN指令碼指令碼
- 建立自啟動檔案指令碼的例項指令碼
- 自動化指令碼安裝mysql shell指令碼範例指令碼MySql
- [指令碼例項]——統計系統資訊指令碼指令碼
- CentOS7 nginx啟動指令碼CentOSNginx指令碼
- LINUX 自動執行指令碼的命令配置Linux指令碼
- ssh自動輸入密碼指令碼 切換目錄指令碼密碼指令碼
- 指令碼1指令碼
- nginx重啟指令碼Nginx指令碼
- Nginx 重啟指令碼Nginx指令碼
- 網路卡自動啟動指令碼指令碼
- Dockerfile---指令碼自動化Docker指令碼
- Linux自啟動指令碼Linux指令碼
- Ceph 自動reweight指令碼指令碼
- hadoop自動提交指令碼Hadoop指令碼
- MySQL自動備份指令碼MySql指令碼
- 自動生成Statspack的指令碼指令碼