乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      nginx源碼分析-源碼結(jié)構(gòu) — 記錄/分享/……

       jijo 2009-06-23

      作者:張立冰
      出處:http://www./2009/02/27/understand-nginx-source-code-directory.html

      本文主要簡單介紹nginx源碼目錄結(jié)構(gòu)、程序編譯流程、如何構(gòu)建學(xué)習(xí)nginx的環(huán)境等。
      本文以及后續(xù)nginx源碼分析文章是基于nginx當前(2009-02-27)的穩(wěn)定版本0.6.35進行的分析,該版本的src目錄下共有96615行代碼,共記234個源碼文件。

      注:本系統(tǒng)的文章為本人學(xué)習(xí)做筆記用,為源碼分析,而非模塊的編寫,可能會存在問題。

      1.1 源碼目錄簡述
      nginx的源碼目錄結(jié)構(gòu)層次明確,從自動編譯腳本到各級的源碼,層次都很清晰,是一個大型服務(wù)端軟件構(gòu)建的一個范例。以下是源碼目錄結(jié)構(gòu)說明:

      ├─auto         自動編譯安裝相關(guān)目錄
      │  ├─cc       針對各種編譯器進行相應(yīng)的編譯配置目錄,包括Gcc、Ccc等
      │  ├─lib      程序依賴的各種庫,包括md5,openssl,pcre等
      │  ├─os       針對不同操作系統(tǒng)所做的編譯配置目錄
      │  └─types
      ├─conf         相關(guān)配置文件等目錄,包括nginx的配置文件、fcgi相關(guān)的配置等
      ├─contrib
      ├─html         index.html
      └─src         源碼目錄
      ├─core    核心源碼目錄,包括定義常用數(shù)據(jù)結(jié)構(gòu)、體系結(jié)構(gòu)實現(xiàn)等
      ├─event   封裝的事件系統(tǒng)源碼目錄
      ├─http    http服務(wù)器實現(xiàn)目錄
      ├─mail    郵件代碼服務(wù)器實現(xiàn)目錄
      ├─misc    該目錄當前版本只包含google perftools包
      └─os      nginx對各操作系統(tǒng)下的函數(shù)進行封裝以及實現(xiàn)核心調(diào)用的目錄。

      1.2 程序編譯流程
      nginx有許多值得學(xué)習(xí)的地方,它的編譯腳本也不例外。nginx的編譯腳本非由autoconf等相關(guān)工具生成,都是由作者手工編寫的。
      列舉幾個與后續(xù)開發(fā)相關(guān)的目錄并做說明:
      src/auto/modules 根據(jù)configure和編譯環(huán)境的條件生成相應(yīng)的模塊信息。見:ngx_modules.c
      src/auto/sources 定義了不同的模塊的生成規(guī)則,包括相關(guān)的源文件、依賴等,最終編譯過程中會生成相應(yīng)的庫文件。
      nginx在編譯安裝的過程中會生成objs目錄,其中包括編譯過程中生成的庫文件,以及相關(guān)的配置文件,進入目錄會存在以下文件:

      ngx_auto_config.h 生成的與程序運行相關(guān)的宏
      ngx_modules.c 由編譯生成的模塊相關(guān)的定義
      src 該目錄下有許多生成的庫文件,作為最終生成nginx使用

      1.3 構(gòu)建nginx學(xué)習(xí)環(huán)境
      分析nginx源碼的目的是學(xué)習(xí)nginx高效的處理能力的體系結(jié)構(gòu),并能將其思想,甚至于nginx的框架借用于服務(wù)端的開發(fā)。從可擴展的模塊機制、內(nèi)存管理、事件系統(tǒng)等各個方面都有許多值得學(xué)習(xí)的地方。
      但nginx的源代碼的核心包間的關(guān)聯(lián)度較高,其它核心的幾個數(shù)據(jù)結(jié)構(gòu),包括ngx_connection\ngx_array\ngx_buf\ngx_command等等幾乎存在于代碼每一個角落,我在第一次看0.1.0的時候(0.1.0是網(wǎng)上能找到的nginx的最早版本),發(fā)現(xiàn)很難將它們獨立出來去對這些數(shù)據(jù)結(jié)構(gòu)進行測試和學(xué)習(xí),于是總結(jié)出自己學(xué)習(xí)的一些方法如下:

      學(xué)習(xí)和熟悉核心數(shù)據(jù)結(jié)構(gòu)的方法:
      1、先熟悉常用的數(shù)據(jù)結(jié)構(gòu)的使用,包括以下:
      ngx_pool\ngx_connection\ngx_array\ngx_buf\
      ngx_command\ngx_log\ngx_event\ngx_cycle\ngx_str等
      對于這些數(shù)據(jù)結(jié)構(gòu)的使用方法的原理基本熟悉,學(xué)習(xí)的方法就是看他們的實現(xiàn)以及http和mail中的使用,熟能生巧。
      2、刪除nginx.c中main函數(shù)的主體,在1的基礎(chǔ)上學(xué)習(xí)其它內(nèi)容,這樣就不需要過多關(guān)注nginx的復(fù)雜的編譯腳本就能學(xué)習(xí)到相應(yīng)的知識。

      附帶基于nginx-0.1.0框架實現(xiàn)的簡單echo服務(wù)端,程序讀取用戶輸入內(nèi)容,然后將該內(nèi)容輸出,定時斷開連接。

      終端:

      -bash-3.2# !te
      telnet 127.0.0.1 80
      Trying 127.0.0.1...
      Connected to 127.0.0.1.
      Escape character is ''^]''.
      ops init connection
      test
      test
      connection timedout
      Connection closed by foreign host.

      目錄結(jié)構(gòu):

      ├─core
      ├─event
      │  └─modules
      ├─ops
      │  ├─ngx_ops.c
      │  └─ngx_ops.h
      └─os
      └─unix

      如果需要該部分代碼的朋友可以留下Email地址。
      下一節(jié)準備對nginx的啟動流程做分析。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多