前言
? ? ? ?一直打算深入學習一下開源項目喧伞,這一個月來的任務西饵,對于修改IPMI開源軟件也確實增長了對于開源項目的認識插掂,期間碰到與解決的問題也讓我收獲不小问潭。這一塊可以說是為我學習Nginx開了個好頭找蜜。
? ? ? ?為什么學習Nginx饼暑?當然是隨主流,畢竟群眾的眼睛是雪亮的」眩基本上彰居,我能搜到的被推薦的開源項目,Nginx基本都在推薦之列撰筷。不猶豫陈惰,就是它了。
Configure詳解
? ? ? ?在編譯安裝Nginx時闭专,我們需要使用configure命令做大量"幕后“工作奴潘,包括檢測操作系統(tǒng)內(nèi)核和已經(jīng)安裝的軟件,參數(shù)解析影钉,中間目錄生成以及根據(jù)各種參數(shù)生成的.c文件画髓、Makefile文件等。
一平委、命令參數(shù)(略)
? ? ? ?Configure包含的參數(shù)使用以下命令查看:
? ? ? ?./configure --help
? ? ? ?主要分為五大類:1奈虾,路徑相關;2廉赔,編譯相關肉微;3,依賴軟件相關蜡塌;4碉纳,模塊相關;5馏艾,其他劳曹;
二、Configrue執(zhí)行流程
? ? ? ? Configure本身是一個Shell腳本琅摩,中間會調(diào)用<nginx-source-path>/auto/目錄下別的腳本執(zhí)行铁孵。其內(nèi)容如下:
#!/bin/sh
# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.
# 設置環(huán)境變量。這里是為了去除所有本地化設置房资,讓命令正確執(zhí)行
LC_ALL=C
export LC_ALL
# 處理configure命令的參數(shù)蜕劝。options腳本將會定義后續(xù)工作將會用到的變量,之后進行相應設置轰异。
. auto/options
# 初始化后續(xù)產(chǎn)生的文件路徑岖沛。比如Makefile,默認情況下<nginx-source-path>/objs/
. auto/init
# 分析nginx源碼結(jié)構(gòu)搭独,構(gòu)造后續(xù)的Makefile文件
. auto/sources
# 編譯過程中所有生成目標文件存放的文件夾
test -d $NGX_OBJS || mkdir $NGX_OBJS
# 建立ngx_auto_hearder.h烫止、autoconf.err等必要的編譯文件
echo > $NGX_AUTO_HEADERS_H
echo > $NGX_AUTOCONF_ERR
# 向ngx_auto_config.h文件寫入命令行帶的參數(shù)
echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H
# 判斷DEBUG標志,如果有戳稽,則在ngx_auto_config.h中寫入DEBUG宏
if [ $NGX_DEBUG = YES ]; then
? ? have=NGX_DEBUG . auto/have
fi
# 開始檢查操作系統(tǒng)參數(shù)是否支持后續(xù)編譯
if test -z "$NGX_PLATFORM"; then
? ? echo "checking for OS"
? ? NGX_SYSTEM=`uname -s 2>/dev/null`
? ? NGX_RELEASE=`uname -r 2>/dev/null`
? ? NGX_MACHINE=`uname -m 2>/dev/null`
# 輸出操作系統(tǒng)名稱馆蠕、內(nèi)核版本期升、32/64內(nèi)核
? ? echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"
? ? NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";
? ? case "$NGX_SYSTEM" in
? ? ? ? MINGW32_*)
? ? ? ? ? ? NGX_PLATFORM=win32
? ? ? ? ;;
? ? esac
else
? ? echo "building for $NGX_PLATFORM"
? ? NGX_SYSTEM=$NGX_PLATFORM
fi
# 檢查并設置編譯器,如gcc時候安裝互躬,gcc版本時候支持后續(xù)編譯nginx
. auto/cc/conf
# 對于非Windows系統(tǒng)定義一些必要頭文件播赁,并檢查其是否存在,以此決定configure后續(xù)步驟是否可執(zhí)行吼渡。
# 注: 檢查某頭文件是否存在或者某特性的類似操作容为,這里都是通過生成一個最簡單的main函數(shù)C程序,該程序包含響應的頭文件寺酪,然后編譯檢查其是否通過坎背。具體的結(jié)果記錄在autoconf.err文件中。
if [ "$NGX_PLATFORM" != win32 ]; then
? ? . auto/headers
fi
# 對于當前操作系統(tǒng)寄雀,定義特定的操作系統(tǒng)相關方法并檢查當前環(huán)境是否支持得滤。比如對于linux,設置進程優(yōu)先級盒犹,使用sendfile系統(tǒng)調(diào)用
. auto/os/conf
# 定義類UNIX操作系統(tǒng)的頭文件和系統(tǒng)調(diào)用等懂更,并檢查當前環(huán)境是否支持
if [ "$NGX_PLATFORM" != win32 ]; then
? ? . auto/unix
fi
# !<卑颉沮协!重要!W可慷暂!
# 生成ngx_modules.c文件,此文件會被編譯進nginx晨雳,它唯一定義ngx_modules數(shù)組行瑞。此數(shù)組指明nginx運行期間有哪些模塊會參與到請求處理中。數(shù)組中的順序就是模塊優(yōu)先級的順序悍募。?
. auto/modules
# 檢查nginx在鏈接期間需要連接的第三方靜態(tài)庫、動態(tài)庫或目標文件是否存在
. auto/lib/conf
# 處理nginx安裝后的路徑
case ".$NGX_PREFIX" in
? ? .)
? ? ? ? NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx}
? ? ? ? have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define
? ? ;;
? ? .!)
? ? ? ? NGX_PREFIX=
? ? ;;
? ? *)
? ? ? ? have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define
? ? ;;
esac
# 處理nginx安裝后conf文件的路徑
if [ ".$NGX_CONF_PREFIX" != "." ]; then
? ? have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define
fi
# 處理nginx安裝后洋机,二進制文件坠宴、pid、lock等其他文件路徑
have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define
have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define
have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define
have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define
have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define
have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define
have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""
. auto/define
have=NGX_HTTP_PROXY_TEMP_PATH value="\"$NGX_HTTP_PROXY_TEMP_PATH\""
. auto/define
have=NGX_HTTP_FASTCGI_TEMP_PATH value="\"$NGX_HTTP_FASTCGI_TEMP_PATH\""
. auto/define
have=NGX_HTTP_UWSGI_TEMP_PATH value="\"$NGX_HTTP_UWSGI_TEMP_PATH\""
. auto/define
have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\""
. auto/define
# 創(chuàng)建編譯時使用的Makefile文件
. auto/make
# 為Makefile加入需要鏈接的第三方靜態(tài)庫绷旗、動態(tài)庫或者目標文件
. auto/lib/make
# 為Makefile加入install功能
. auto/install
# STUB 在ngx_auto_config.h中加入NGX_SUPPRESS_WARN喜鼓、NGX_SMP宏
. auto/stubs
# 在ngx_auto_config.h文件指定NGX_USER和NGX_GROUP宏,如果執(zhí)行configure時無指定參數(shù)衔肢,則默認nobody庄岖,即默認以nobody用戶運行進程
have=NGX_USER value="\"$NGX_USER\"" . auto/define
have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define
# 顯示configure執(zhí)行結(jié)果
. auto/summary
三、Configure生成文件
? ? ? ? Configure執(zhí)行成功會生成objs目錄角骤,如下圖:
? ? ? ?重點在ngx_modeles.c文件隅忿,其中定義了ngx_modules數(shù)組心剥,它指明每個模塊在Nginx中的優(yōu)先級。當一個請求同時符合多個模塊處理規(guī)則時背桐,將按照此數(shù)組中的順序選擇最靠前的模塊優(yōu)先處理优烧。
總結(jié)
? ? ? ?Configurex所做工作:尋找Nginx所依賴軟件,針對不同操作系統(tǒng)做的優(yōu)化链峭,生成Makefile畦娄,ngx_XXX.h文件,ngx_modules.c文件弊仪。其中熙卡,ngx_modules.c文件決定運行時所有模塊的優(yōu)先級。對于不需要的模塊励饵,即不會加入ngx_modules數(shù)組驳癌,也就不會編進Nginx中,體現(xiàn)了其輕量級概念曲横。
主要參考:
《深入理解Nginx》
---------------------
作者:時間文盲
來源:CSDN
原文:https://blog.csdn.net/fzy0201/article/details/17683883
版權(quán)聲明:本文為博主原創(chuàng)文章喂柒,轉(zhuǎn)載請附上博文鏈接!