作者原創,轉載請聯系作者
一 Nginx簡介
Nginx("engine x") 是一個高性能的HTTP和反向代理器,也是一個IMAP/POP3/SMTP服務器。Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的,第一個公開版本0.1.0發布于2004年10月4日。其將源代碼以類BSD許可證的形式發布,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
Nginx的設計優點自不必多說,其實現的代碼也非常優秀。Nginx完全用C語言從頭寫成,已經移植到許多體系結構和操作系統,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函數庫,并且除了zlib、PCRE和OpenSSL之外,標準模塊只使用系統C庫函數。
關于Nginx設計,有興趣可以參考《深入理解Nginx --模塊開發與架構解析》
二 Nginx編譯安裝
1. 相關基礎軟件安裝
由于nginx在編譯時默認的 http rewrite(使用正則表達式對請求進行重寫) 模塊依賴PCRE(Perl Compatible Regular Expressions)庫,官網:http://www.pcre.org,所以需要先安裝PCRE。如果沒有安裝PCRE,如果未安裝,編譯時會提示如下:
sh configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
安裝PCRE的命令如下:
tar xvzf pcre-8.33.tar.gz
cd pcre-8.12
sudo ./configure --prefix=/usr/local
sudo make
sudo make install
2. Nginx編譯安裝
安裝nginx大致是過程,
$ tar xvzf nginx-1.11.6.tar.gz
$ cd nginx-1.11.6
$ sudo sh configure
$ sudo make
$ sudo make install
安裝簡介如下:
Configuration summary
using system PCRE library
OpenSSL library is not used
md5: using system crypto library
sha1: using system crypto library
using system zlib library
......
三 Nginx調試
1. GDB簡介
GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但如果你是在UNIX平臺下做軟件,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。
一般來說,GDB主要幫忙你完成下面四個方面的功能:
1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發生的事。
4、動態的改變你程序的執行環境。
GDB可以在命令行進行調試,GDB常用命令:
命令 | 描述 |
---|---|
backtrace(或bt) | 查看各級函數調用及參數 |
finish | 連續運行到當前函數返回為止,然后停下來等待命令 |
frame(或f) 幀編號 | 選擇棧幀 |
info(或i) locals | 查看當前棧幀局部變量的值 |
list(或l) | 列出源代碼,接著上次的位置往下列,每次列10行 |
list 行號 | 列出從第幾行開始的源代碼 |
list 函數名 | 列出某個函數的源代碼 |
next(或n) | 執行下一行語句 |
print(或p) | 打印表達式的值,通過表達式可以修改變量的值或者調用函數 |
quit(或q) | 退出gdb調試環境 |
set var | 修改變量的值 |
start | 開始執行程序,停在main函數第一行語句前面等待命令 |
step(或s) | 執行下一行語句,如果有函數調用則進入到函數中 |
2. 調試準備工作
1, 修改nginx源代碼目錄下子目錄/auto/cc中的conf文件,將ngx_compile_opt="-c"改為ngx_compile_opt="-c -g"
2, 在編譯的時候加上debug選項,nginx的安裝腳本如下:
./configure --user=www --group=www --prefix=/export/lx/servers/nginx-debug --add-module=../ngx_cache_purge-1.2 --with-debug --with-pcre --with-http_sub_module --with-http_stub_status_module --with-http_ssl_module
make -j 4
make install
3,修改安裝完畢之后生成的nginx配置文件:nginx.conf,加入error_log /export/lx/servers/nginx_debug/logs/error.log debug;配置項如果是做模塊開發,則需要將nginx設置為單進程模式才可以調試開發的模塊中的代碼加入如下幾句配置項:
worker_processes 1;
master_process off; # 單進程模式
daemon off;
3.采用GDB調試Nginx
1, 首先我們切換工作目錄至:.../nginx-1.11.9.-/objs/,然后在終端中啟動GDB調試器:
sudo gdb -q -tui(q選項是以安靜模式啟動,不顯示GDB版本等信息。tui選項可以顯示代碼界面)
2, 在GDB中啟動nginx:
shell ./nginx
3, 在shell下查看nginx的進場號
ps -ef | grep nginx
4, attach命令來跟蹤子進程
attach Pid
5, 使用GDB的命令進行調試,如我們知道,子進程即worker進程在運行后會停留在epoll_wait處等待相應的事件發生,而這個函數調用被封裝在ngx_process_events_and_timers 中。于是我們在這個函數出設置一個斷點:b ngx_process_events_and_timers,然后采用命令c,使得nginx一直運行,直到遇到第一個斷點。
6, 示范圖如下:
3.采用Xcode調試Nginx
目前nginx是使用makefile進行工程管理,而C/C++的編程利器Clion只支持CMake,還不支持makefile。而Clion自帶生成CMakefile.txt還不能從Nginx的makefile自動轉換Cmakefile.txt,因此Clion無法使用。
而在Mac下,開發C語言的利器是XCode,故下面講解Xcode如何導入Nginx代碼,并進行調試代碼。
1,新建項目,選擇Command Line Tool。(其實選擇其他都可以,不過千萬別選擇External build system ,因為如果選擇了這個,將會失去智能提示與定義跳轉)。
2,按Next,然后選擇目錄,我選擇在原有的軟件Ngin目錄下,Nginx會自動Nginx目錄下創建一個與項目名稱相同的目錄。千萬別別與原來的軟件在同一目錄下并和原有軟件相同的名字,要不然xcode會把原來的目錄內容刪除。
3, 添加項目的所有文件到xcode 項目中。請記得選擇(Create groups for any added folders),要不然加入項目后的文件。不能做智能提示和跳轉定義。做不了這些功能的還要IDE干嘛,直接用sublime就好了。是否選擇使用Copy items into destination group’s folder(if needed),這個根據你項目存放路徑和需要。
4, 在項目中點擊“Add Target…”
5, 選擇“External Build System” ,然后填寫內容。點擊Finish。后,需要在nginx這個target的setting做設置,主要是Directory這個目錄。需要填寫你項目的makefile所在的路徑。如果你的makefile與你的xcode project文件同一路徑是不需要更改。由于我的makefile在project文件的上一層目錄,所以使用了”../”。也可以使用絕對路徑,不過還是建議使用相對路徑比較好。這時候就設置好了,可以選擇tager Nginx進行編譯運行。
6, 在編譯的時候如果發現有錯誤,不能點擊錯誤,定位到錯誤在什么文件與那一行。這個是路徑的問題。我編譯的時候是在最上層的makefile,而makefile是通過cd命令進入各個目錄中,再進行make的命令操作。所以xcode不知道是那個目錄下有該文件,只會在根makefile所在的目錄下進行尋找。解決方法是:新添加多一個target–nginx,nginx的Makefile Directory指向../nginx/。
7, 想要單步調試,經過摸索發現,可在debug->attach to process by Pid or Name ,然后填寫nginx或者nginx的Pid,這樣就可以進行單步調試了
8, 然后采用step over, step in可以單步跟蹤,在調試框里面有自動變量值顯示,在concle中可以采用GDB的相關命令進行操作,比如打印 p 變量名等,見下圖:
9, 然后各位就根據自己的需要進行調試各個流程!