国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Nginx源碼分析】Nginx的編譯

shery / 2663人閱讀

摘要:用來(lái)組織編譯流程。會(huì)構(gòu)造的編譯選項(xiàng)賦值針對(duì)版本操作系統(tǒng)等添加參數(shù)。向?qū)懭胪ㄓ玫念^文件檢查操作系統(tǒng)特性。以下腳本為核心原文件生成的規(guī)則。為不同的系統(tǒng)做了大量的編譯優(yōu)化,充分挖掘性能。代碼量大,手動(dòng)編寫枯燥易出錯(cuò)。

周生政

nginx構(gòu)建
使用shell語(yǔ)言生成makefile,以及ngx_auto_config.h,ngx_auto_headers.h,ngx_modules.c。其中ngx_auto_config.h為各種常量定義,ngx_auto_headers.h為頭文件,ngx_modules.c為nginx模塊。makefile用來(lái)組織編譯流程。
configure主流程

auto/options

根據(jù)configure的參數(shù),初始化和configure參數(shù)相關(guān)的變量值

auto/init

定義自動(dòng)生成的文件名稱

auto/source

定義模塊名稱, 頭文件查找目錄, 頭文件,源文件

auto/cc/conf

選擇編譯器。假設(shè)選擇gcc。會(huì)構(gòu)造gcc的編譯選項(xiàng), 賦值CFLAGS, 針對(duì)gcc版本、操作系統(tǒng)、cpu等添加參數(shù)。

auto/headers

向ngx_auto_headers.h寫入通用的頭文件

auto/os/conf

檢查操作系統(tǒng)特性。以linux,x86為例。
檢查epoll,sendfile, sched_setaffinity, crypt_r, crypt_r等功能

auto/unix

檢查poll,kqueue, crypt, fcntl, posix_fadvise, directio, statfs, dlopen, sched_yield, setsockopt, getsockopt,accept4等特性。定義指針,size_t,time_t長(zhǎng)度,一些typedef,機(jī)器大小端。

auto/modules

根據(jù)用戶編譯參數(shù),定義一些常量;
#ifndef NGX_HAVE_PWRITE
#define NGX_HAVE_PWRITE  1
#endif

#ifndef NGX_SYS_NERR
#define NGX_SYS_NERR  135
#endif
生成ngx_modules.c
extern ngx_module_t  ngx_http_range_body_filter_module;
extern ngx_module_t  ngx_http_not_modified_filter_module;

ngx_module_t *ngx_modules[] = {
    &ngx_core_module,
    &ngx_errlog_module,
    &ngx_conf_module,

auto/lib/conf

pcre, openssl, md5,libgd,zlib等庫(kù)

auto/make

創(chuàng)建makefile腳本

auto/lib/make

依賴庫(kù)makefile

auto/install

makefile的install部分

auto/summary

匯總一些檢查信息

makefile 分析

nginx精簡(jiǎn)版makefile

CC =    cc
CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g -ggdb3 -O0 -Wno-error
CPP =    cc -E
LINK =    $(CC)


ALL_INCS = -I src/core 
    -I src/event 
    ...
    -I src/mail


CORE_DEPS = src/core/nginx.h 
    src/core/ngx_config.h 
    ...
    src/core/ngx_palloc.h 
CORE_INCS = -I src/core 
    -I src/event 
    ...
    -I objs

HTTP_DEPS = src/http/ngx_http.h 
    src/http/ngx_http_request.h 
    ...
    src/http/modules/ngx_http_ssi_filter_module.h

HTTP_INCS = -I src/http 
    -I src/http/modules

objs/nginx:    objs/src/core/nginx.o 
    objs/src/core/ngx_log.o 
    ...
    objs/src/core/ngx_palloc.o 
    $(LINK) -o objs/nginx 
    ...
    objs/src/core/ngx_log.o  
    -lpthread -lcrypt -lpcre -lcrypto -lcrypto -lz

objs/ngx_modules.o:    $(CORE_DEPS) 
    objs/ngx_modules.c
    $(CC) -c $(CFLAGS) $(CORE_INCS) 
        -o objs/ngx_modules.o 
        objs/ngx_modules.c

objs/src/http/modules/ngx_http_upstream_keepalive_module.o:    $(CORE_DEPS) $(HTTP_DEPS) 
    src/http/modules/ngx_http_upstream_keepalive_module.c
    $(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) 
        -o objs/src/http/modules/ngx_http_upstream_keepalive_module.o 
        src/http/modules/ngx_http_upstream_keepalive_module.c


objs/src/http/modules/ngx_http_stub_status_module.o:    $(CORE_DEPS) $(HTTP_DEPS) 
    src/http/modules/ngx_http_stub_status_module.c
    $(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) 
        -o objs/src/http/modules/ngx_http_stub_status_module.o 
        src/http/modules/ngx_http_stub_status_module.c
生成makefile的循環(huán)腳本

在makefile中有很多objs/src/*.o為target的規(guī)則,是通過(guò)腳本批量生成。
以下腳本為核心原文件生成makefile的規(guī)則。

# the core sources

for ngx_src in $CORE_SRCS
do
    ngx_src=`echo $ngx_src | sed -e "s///$ngx_regex_dirsep/g"`
    ngx_obj=`echo $ngx_src 
        | sed -e "s#^(.*.)cpp$#$ngx_objs_dir1$ngx_objext#g" 
              -e "s#^(.*.)cc$#$ngx_objs_dir1$ngx_objext#g" 
              -e "s#^(.*.)c$#$ngx_objs_dir1$ngx_objext#g" 
              -e "s#^(.*.)S$#$ngx_objs_dir1$ngx_objext#g"`

    cat << END                                                >> $NGX_MAKEFILE

$ngx_obj:    $(CORE_DEPS)$ngx_cont$ngx_src
    $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX

END

done

在auto/make中一共會(huì)有四個(gè)大循環(huán),來(lái)自動(dòng)化生成大量的規(guī)則。

核心源文件

http源文件

mail源文件

misc源文件

采用shell編寫的原因

nginx是模塊化開(kāi)發(fā),有大量的模塊可供用戶選擇。nginx為不同的系統(tǒng)做了大量的編譯優(yōu)化,充分挖掘性能。nginx代碼量大,手動(dòng)編寫makefile枯燥易出錯(cuò)。基于以上原因,nginx的configure采用shell腳本開(kāi)發(fā),只編譯選擇模塊,為不同系統(tǒng)提供不同編譯參數(shù),手動(dòng)生成makefile規(guī)則。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40199.html

相關(guān)文章

  • Nginx源碼:利用C語(yǔ)言tricky構(gòu)建函數(shù)鏈

    摘要:請(qǐng)注意這里的和是全局變量,而和是模塊的靜態(tài)變量是模塊級(jí)的全局變量,這一點(diǎn)很重要,后面會(huì)詳細(xì)分析。當(dāng)編譯進(jìn)一個(gè)模塊的時(shí)候,就被賦值為當(dāng)前模塊的處理函數(shù)。所以整體看來(lái),就像用全局變量組成的一條單向鏈表。 最近開(kāi)始使用Nginx的第三方擴(kuò)展解決實(shí)際的問(wèn)題,對(duì)Nginx的擴(kuò)展開(kāi)發(fā)產(chǎn)生了一些興趣,在閱讀第三方代碼時(shí)產(chǎn)生了一些心得和體會(huì)。本文詳細(xì)分析了進(jìn)行Nginx過(guò)濾器開(kāi)發(fā)的時(shí)候,Nginx提供...

    wind5o 評(píng)論0 收藏0
  • Nginx源碼分析Nginx內(nèi)存管理

    摘要:而對(duì)于堆內(nèi)存,通常需要程序員進(jìn)行管理。我們通常說(shuō)的內(nèi)存管理亦是只堆空間內(nèi)存管理。內(nèi)存管理整體可以分為個(gè)部分,第一部分是常規(guī)的內(nèi)存池,用于進(jìn)程平時(shí)所需的內(nèi)存管理第二部分是共享內(nèi)存的管理。將內(nèi)存塊按照的整數(shù)次冪進(jìn)行劃分最小為最大為。 施洪寶 一. 概述 應(yīng)用程序的內(nèi)存可以簡(jiǎn)單分為堆內(nèi)存,棧內(nèi)存。對(duì)于棧內(nèi)存而言,在函數(shù)編譯時(shí),編譯器會(huì)插入移動(dòng)棧當(dāng)前指針位置的代碼,實(shí)現(xiàn)棧空間的自管理。而對(duì)于...

    raise_yang 評(píng)論0 收藏0
  • Nginx 源碼分析:從模塊到配置(上)

    摘要:結(jié)構(gòu)體數(shù)組,用來(lái)表示該模塊可以在配置文件中配置的項(xiàng)目,及其操作指令。 源文件路徑 srccore gx_conf_file.h srccore gx_conf_file.c 主要內(nèi)容 本篇的主要目的在于分析Nginx的配置功能。由于Nginx的配置基本就是對(duì)模塊的配置,因此,在討論配置功能之前,需要先分析Nginx的模塊功能。 對(duì)于模塊功能,這里的重點(diǎn)不在于某個(gè)模塊的細(xì)節(jié),而...

    gotham 評(píng)論0 收藏0
  • Nginx 源碼分析:從模塊到配置(下)

    摘要:每個(gè)模塊由以下幾部分構(gòu)成結(jié)構(gòu)體代表模塊本身,其指針被放入數(shù)組中。結(jié)構(gòu)體用來(lái)表示模塊的配置內(nèi)容,其中部分成員可以通過(guò)配置文件進(jìn)行配置。調(diào)用該中的函數(shù),該函數(shù)最終初始化模塊對(duì)應(yīng)的結(jié)構(gòu)體,完成配置。因此,分析源碼中的配置指令,就是分析結(jié)構(gòu)體。 本篇的上篇 Nginx 源碼分析:從模塊到配置(上),建議閱讀本篇前先閱讀上篇。 關(guān)于模塊 Nginx的架構(gòu)高度模塊化。每個(gè)模塊各司其職,組合在一...

    Chao 評(píng)論0 收藏0
  • Debian9(Stretch) 下編譯安裝LNMP環(huán)境

    摘要:下源碼安裝一前言之前,我的開(kāi)發(fā)環(huán)境是。重新加載權(quán)限表將確保所有到目前為止所做的更改將立即生效。然后,和注意,如果是使用二進(jìn)制包安裝了及相應(yīng)的開(kāi)發(fā)庫(kù),不需要指定路徑。五參考資料入門教程編譯安裝編譯安裝 Debian9下源碼安裝LNMP 一、前言 之前,我的開(kāi)發(fā)環(huán)境是Windows-10+PHP-7.1+Nginx-1.10+MariaDB-10.1。 后面開(kāi)發(fā)需要使用到memcached...

    ideaa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

shery

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<