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

資訊專欄INFORMATION COLUMN

分析Nginx 源碼 - ngx_module_t接口總結(jié)

sunnyxd / 2202人閱讀

摘要:關(guān)于有一套設(shè)計良好的源碼,以供分析,本文從結(jié)構(gòu)體來分析源碼結(jié)構(gòu)。總結(jié)初次閱讀源碼,先從結(jié)構(gòu)體開始學習,開篇之作,再接再厲。

關(guān)于

nginx有一套設(shè)計良好的源碼,以供分析,本文從ngx_module_t結(jié)構(gòu)體來分析nginx源碼結(jié)構(gòu)。ngx_module_t是整個nginx的關(guān)鍵,它提供了整個nginx的模塊化的基礎(chǔ)。因此,看懂ngx_module_t結(jié)構(gòu)體才能開始入門nginx源碼閱讀。

ngx_module_t結(jié)構(gòu)體介紹

該結(jié)構(gòu)體描述了整個模塊的所有信息,為核心模塊進行初始化和調(diào)用提供了接口,整個結(jié)構(gòu)體的初始化源碼如下:

struct ngx_module_s {
    ngx_uint_t            ctx_index;
    ngx_uint_t            index;

    char                 *name;

    ngx_uint_t            spare0;
    ngx_uint_t            spare1;

    ngx_uint_t            version;
    const char           *signature;

    void                 *ctx;
    ngx_command_t        *commands;
    ngx_uint_t            type;

    ngx_int_t           (*init_master)(ngx_log_t *log);

    ngx_int_t           (*init_module)(ngx_cycle_t *cycle);

    ngx_int_t           (*init_process)(ngx_cycle_t *cycle);
    ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);
    void                (*exit_thread)(ngx_cycle_t *cycle);
    void                (*exit_process)(ngx_cycle_t *cycle);

    void                (*exit_master)(ngx_cycle_t *cycle);

    uintptr_t             spare_hook0;
    uintptr_t             spare_hook1;
    uintptr_t             spare_hook2;
    uintptr_t             spare_hook3;
    uintptr_t             spare_hook4;
    uintptr_t             spare_hook5;
    uintptr_t             spare_hook6;
    uintptr_t             spare_hook7;
};

ngx_module_s的關(guān)鍵部分在于中間的幾個函數(shù)指針,以ngx_core_module核心模塊為例:

ngx_module_t  ngx_core_module = {
    NGX_MODULE_V1,
    &ngx_core_module_ctx,                  /* module context */
    ngx_core_commands,                     /* module directives */
    NGX_CORE_MODULE,                       /* module type */
    NULL,                                  /* init master */
    NULL,                                  /* init module */
    NULL,                                  /* init process */
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};

關(guān)于NGX_MODULE_V1NGX_MODULE_V1_PADDING2個關(guān)鍵字是2個宏定義,主要用于快速聲明而已,剩下的屬性可以分為4類:模塊類型、模塊命令、模塊上下文、預留接口。我們可以先了解模塊命令結(jié)構(gòu)體(ngx_command_s)

模塊命令結(jié)構(gòu)體(ngx_command_s)

ngx_command_s結(jié)構(gòu)體是用來分析整個配置文件關(guān)鍵字的工具,源碼如下:

struct ngx_command_s {
    ngx_str_t             name;
    ngx_uint_t            type;
    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
    ngx_uint_t            conf;
    ngx_uint_t            offset;
    void                 *post;
};
ngx_module_t結(jié)構(gòu)體接口位置 init_master接口

字面意思是初始化master進程時候進行調(diào)用,但是暫未找到接口位置。

init_module接口

該接口是在模塊初始化的時候調(diào)用,調(diào)用位置在于ngx_init_cycle>ngx_init_modules的代碼中:

ngx_int_t
ngx_init_modules(ngx_cycle_t *cycle)
{
    ngx_uint_t  i;

    for (i = 0; cycle->modules[i]; i++) {
        if (cycle->modules[i]->init_module) {
            if (cycle->modules[i]->init_module(cycle) != NGX_OK) {
                return NGX_ERROR;
            }
        }
    }

    return NGX_OK;
}
init_process接口

該接口分別在ngx_worker_process_initngx_single_process_cycle,2者會在不同的模式下運行,所以只會初始化一次。我們以多進程模式為例,其路徑在:ngx_master_process_cycle>ngx_start_worker_processes>ngx_worker_process_cycle,關(guān)鍵代碼如下:

static void
ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker)
{
 ... ...
    for (i = 0; cycle->modules[i]; i++) {
        if (cycle->modules[i]->init_process) {
            if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) {
                /* fatal */
                exit(2);
            }
        }
    }
 ... ...
}
init_thread接口

字面意思是初始化線程進程時候進行調(diào)用,但是暫未找到接口位置。

exit_thread接口

字面意思是退出線程進程時候進行調(diào)用,但是暫未找到接口位置。

exit_process接口

該接口于init_process接口對應(yīng),其路徑在:ngx_master_process_cycle>ngx_start_worker_processes>ngx_worker_process_exit,條件是在出現(xiàn)中斷,或者沒有時間片的時候退出線程并調(diào)用。關(guān)鍵代碼如下:

static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
    ngx_int_t worker = (intptr_t) data;

    ngx_process = NGX_PROCESS_WORKER;
    ngx_worker = worker;

    ngx_worker_process_init(cycle, worker);

    ngx_setproctitle("worker process");

    for ( ;; ) {

        if (ngx_exiting) {
            if (ngx_event_no_timers_left() == NGX_OK) {
                ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");
                ngx_worker_process_exit(cycle);
            }
        }

        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");

        ngx_process_events_and_timers(cycle);

        if (ngx_terminate) {
            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");
            ngx_worker_process_exit(cycle);
        }
    }
    ... ...
}
exit_master接口

該接口是當master進程退出時調(diào)用,其路徑在:ngx_master_process_cycle>ngx_master_process_exit,關(guān)鍵代碼如下:

void
ngx_master_process_cycle(ngx_cycle_t *cycle)
{
    ... ...

    for ( ;; ) {
        ... ...
        
        if (!live && (ngx_terminate || ngx_quit)) {
            ngx_master_process_exit(cycle);
        }

        ... ...
    }
}

等于當出現(xiàn)退出或中斷信號,或者進程不再存活的時候,進行退出操作。

總結(jié)

初次閱讀nginx源碼,先從結(jié)構(gòu)體開始學習,開篇之作,再接再厲。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/39652.html

相關(guān)文章

  • Nginx 源碼分析:從模塊到配置(上)

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

    gotham 評論0 收藏0
  • Nginx源碼分析Nginx的編譯

    摘要:用來組織編譯流程。會構(gòu)造的編譯選項賦值針對版本操作系統(tǒng)等添加參數(shù)。向?qū)懭胪ㄓ玫念^文件檢查操作系統(tǒng)特性。以下腳本為核心原文件生成的規(guī)則。為不同的系統(tǒng)做了大量的編譯優(yōu)化,充分挖掘性能。代碼量大,手動編寫枯燥易出錯。 周生政 nginx構(gòu)建 使用shell語言生成makefile,以及ngx_auto_config.h,ngx_auto_headers.h,ngx_modules.c。其中n...

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

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

    Chao 評論0 收藏0
  • Nginx源碼分析Nginx配置文件解析(一)

    摘要:本文將從源碼從此深入分析配置文件的解析,配置存儲,與配置查找。在學習配置文件的解析過程之前,需要先了解一下模塊與指令的一些基本知識。 運營研發(fā)團隊 李樂 配置文件是nginx的基礎(chǔ),對于學習nginx源碼甚至開發(fā)nginx模塊的同學來說更是必須深究。本文將從源碼從此深入分析nginx配置文件的解析,配置存儲,與配置查找。 看本文之前讀者可以先思考兩個問題: 1.nginx源碼中隨處可以...

    JasonZhang 評論0 收藏0
  • nginx架構(gòu)

    摘要:反向代理反向代理反向代理負載均衡鑒權(quán)限流等邏輯架構(gòu)在邏輯上分為入口層,模塊化的功能處理層,系統(tǒng)調(diào)用層。多個共同監(jiān)聽事件并處理,反向代理會把請求轉(zhuǎn)發(fā)給后端服務(wù)。 一.概述 本文將深入剖析nginx的架構(gòu)。 第一部分介紹nginx現(xiàn)有框架,用典型的4+1視圖闡述,包括邏輯架構(gòu),開發(fā)架構(gòu),運行架構(gòu),物理架構(gòu),功能用例,nginx為單機服務(wù),不考慮物理架構(gòu)。其中功能用例概述nginx功能;邏輯...

    smartlion 評論0 收藏0

發(fā)表評論

0條評論

sunnyxd

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<