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

資訊專欄INFORMATION COLUMN

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

Chao / 2167人閱讀

摘要:每個模塊由以下幾部分構(gòu)成結(jié)構(gòu)體代表模塊本身,其指針被放入數(shù)組中。結(jié)構(gòu)體用來表示模塊的配置內(nèi)容,其中部分成員可以通過配置文件進(jìn)行配置。調(diào)用該中的函數(shù),該函數(shù)最終初始化模塊對應(yīng)的結(jié)構(gòu)體,完成配置。因此,分析源碼中的配置指令,就是分析結(jié)構(gòu)體。

本篇的上篇 Nginx 源碼分析:從模塊到配置(上),建議閱讀本篇前先閱讀上篇。

關(guān)于模塊

Nginx的架構(gòu)高度模塊化。每個模塊各司其職,組合在一起完成特定的功能。

Nginx通過configure決定哪些模塊被安裝。所有安裝的模塊在編譯階段靜態(tài)生成,其指針被統(tǒng)一放入ngx_modules數(shù)組中,供全局使用。

每個模塊由以下幾部分構(gòu)成:

ngx_module_t結(jié)構(gòu)體:代表模塊本身,其指針被放入ngx_modules數(shù)組中。

ngx__conf_t結(jié)構(gòu)體:用來表示模塊的配置內(nèi)容,其中部分成員可以通過配置文件進(jìn)行配置。

ngx__module_t結(jié)構(gòu)體:模塊上下文,保存了一組操作,Nginx初始化階段調(diào)用這些操作,初始化ngx__conf_t中的成員。

ngx_command_t結(jié)構(gòu)體數(shù)組:該數(shù)組中每一項ngx_command_t對應(yīng)配置文件中一條指令。

Nginx的模塊雖然有很多。但是基本類型只有5種:CORF、CONF、EVNT、HTTP、MAIL

#define NGX_CORE_MODULE      0x45524F43  /* "CORE" */
#define NGX_CONF_MODULE      0x464E4F43  /* "CONF" */
#define NGX_EVENT_MODULE     0x544E5645  /* "EVNT" */
#define NGX_HTTP_MODULE      0x50545448  /* "HTTP" */
#define NGX_MAIL_MODULE      0x4C49414D  /* "MAIL" */

每種類型對應(yīng)一種ngx__module_t上下文結(jié)構(gòu)體。Nginx在初始化(主要在ngx_init_cycle函數(shù)中)時根據(jù)不同的模塊類型,調(diào)用不同的上下文中的操作,完成其配置內(nèi)容的初始化。

雖然模塊類型只有5種,但是模塊數(shù)量可以有很多,每個模塊都針對自身有特定的配置內(nèi)容,這些配置內(nèi)容中,可以被放到配置文件nginx.conf中的,被包裝成了一條條ngx_command_t指令。這些指令的內(nèi)容決定了nginx.conf中可以寫入的操作指令。

Nginx初始化時解析nginx.conf配置文件,找到對應(yīng)的ngx_command_t。調(diào)用該ngx_command_t中的函數(shù),該函數(shù)最終初始化模塊對應(yīng)的ngx__conf_t結(jié)構(gòu)體,完成配置。

這就是模塊和配置之間的關(guān)系。

配置文件、指令

談到Nginx的配置,首先想到的肯定是配置文件nginx.conf

眾所周知,nginx.conf配置文件的結(jié)構(gòu)由一條條Nginx配置指令構(gòu)成(官方文檔)。
Nginx配置指令可以分為兩種:簡單指令和塊指令。

例如:

worker_processes 1;就是一條簡單指令

events { ... }就是一條塊指令

如果,一個塊指令中含有其他指令,那么稱這個塊指令為上下文(注意區(qū)別模塊中的上下文概念)。
例如:

 events {
      use epoll;
      worker_connections  1024;
 }

events是塊指令,由于events中包含有指令(簡單指令或塊指令)。因此稱eventsevents上下文

常見的上下文還有:http上下文、server上下文、location上下文整個nginx.conf文件稱為main上下文

源碼中的配置指令

前面提到過:Nginx配置文件中的一條指令對應(yīng)一個ngx_command_t結(jié)構(gòu)體。因此,分析源碼中的配置指令,就是分析ngx_command_t結(jié)構(gòu)體。

ngx_command_t結(jié)構(gòu)體定義:

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;
};

各成員含義如下:

name:本條指令的名字,例如worker_processes 1;對應(yīng)的ngx_command_s.name就是worker_processes

set:函數(shù)指針,所以set用來表示,當(dāng)Nginx解析配置文件,碰到指令時,該執(zhí)行怎樣的操作。而該操作本身,自然是用來設(shè)置本模塊所對應(yīng)的ngx__conf_t結(jié)構(gòu)體。

conf:這個變量只在NGX_HTTP_MODULE類型的模塊的ngx_command_t使用。這個變量和今天討論的話題關(guān)系不大。暫不討論。

offset:這個變量用來標(biāo)記ngx__conf_t中某成員變量的偏移量,純粹是為使用方便。

type:配置指令屬性的集合。例如,worker_processes這條指令對應(yīng)的type定義為:

NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1

其中,各個宏定義如下:

#define NGX_MAIN_CONF        0x01000000
#define NGX_DIRECT_CONF      0x00010000
#define NGX_CONF_TAKE1       0x00000002

NGX_MAIN_CONF是指,該指令用于main上下文

NGX_DIRECT_CONF是指,該指令是用于main上下文的簡單指令

NGX_CONF_TAKE1是指,該指令后跟一個參數(shù),例如worker_processes 1;1就是指后面跟一個參數(shù),這個參數(shù)的數(shù)目由NGX_CONF_TAKE1指定。

類似用來定義指令類型的宏還有很多,具體可以參考源碼中各個模塊中ngx_command_t的設(shè)置。

幾個典型的配置指令 daemon指令

Nginx默認(rèn)是以后臺的形式運行的,這種運行形式被稱為daemon,當(dāng)然,在調(diào)試的時候,為了方便,一般是關(guān)掉daemon這種運行形式。

在配置文件中通過daemon指令來打開或關(guān)閉。官方文檔對daemon指令說明如下:

Syntax:     daemon on | off;
Default:    daemon on;
Context:    main

在源碼中(core ginx.c),daemon指令對應(yīng)的ngx_command_t結(jié)構(gòu)體如下:

     {ngx_string("daemon"),                              // 指令的名字daemon
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,       // 指令的類型
      ngx_conf_set_flag_slot,                            // 指令對應(yīng)的操作
      0,
      offsetof(ngx_core_conf_t, daemon),
      NULL }

其中,NGX_MAIN_CONF指,daemon指令的上下文為main上下文
NGX_DIRECT_CONF指,daemon指令是一條可以直接寫在main上下文的簡單指令。
NGX_CONF_FLAG指,daemon指令是一個開關(guān)指令,接收on | off作為指令參數(shù)。

user指令

Nginx可以在配置文件中通過user指令指定運行時所在的用戶及用戶組。官方文檔對user指令的說明如下:

Syntax:     user user [group];
Default:    user nobody nobody;
Context:    main

在源碼中(core ginx.c),user對應(yīng)的ngx_command_t結(jié)構(gòu)體定義如下:

    { ngx_string("user"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE12,
      ngx_set_user,
      0,
      0,
      NULL },

其中NGX_MAIN_CONFNGX_DIRECT_CONF的含義與daemon指令的含義相同。
NGX_CONF_TAKE12是指該指令接收1個或兩個參數(shù),即Syntax: user user [group];

events指令

Nginx中可以指定采用的事件監(jiān)聽機(jī)制類型,比如select、poll、epoll等。
這個指定操作在events指令中完成。這里events指令為塊指令

官方文檔對events指令的定義如下:

Syntax:     events { ... }
Default:    —
Context:    main

在源碼中(event gx_event.c),events指令對應(yīng)的ngx_command_t結(jié)構(gòu)體定義如下:

    { ngx_string("events"),
      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
      ngx_events_block,
      0,
      0,
      NULL }

其中,NGX_MAIN_CONF的含義與daemon指令相同。
NGX_CONF_BLOCK是指,這是一條塊指令
NGX_CONF_NOARGS是指,該指令不接受參數(shù)。

總結(jié)

以上三條指令能夠很清楚的說明,在Nginx源碼中是如何組織和管理配置文件中使用的配置指令的。
對于其他指令,可以直接閱讀源碼中該指令的定義。源碼就是最好的文檔。

關(guān)于模塊和配置的總結(jié)

由于Nginx是高度模塊化的,因而,Nginx的配置一定是對模塊的配置

Nginx的每條配置指令對應(yīng)某模塊中的一條ngx_command_t定義。

每條ngx_command_t一定操作了其所在模塊的ngx__conf_t結(jié)構(gòu)體中某些項。

Nginx初始化時,首先解析配置文件,然后執(zhí)行對應(yīng)指令的ngx_command_t中的操作函數(shù),設(shè)置ngx__conf_t中的某些項,完成配置工作。

然后,Nginx根據(jù)這些配置,執(zhí)行啟動流程,進(jìn)而開始工作。

到此為止。本篇結(jié)束。

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

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

相關(guān)文章

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

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

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

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

    JasonZhang 評論0 收藏0
  • Nginx源碼分析Nginx的listen處理流程分析

    摘要:四監(jiān)聽套接字的使用假設(shè)此處我們使用作為事件處理模塊在增加事件時用戶可以使用中的字段當(dāng)事件發(fā)生時該字段也會帶回。在創(chuàng)建監(jiān)聽套接字時將結(jié)構(gòu)分為級監(jiān)聽套接字地址各級都是一對多的關(guān)系。 施洪寶 一. 基礎(chǔ) nginx源碼采用1.15.5 后續(xù)部分僅討論http中的listen配置解析以及優(yōu)化流程 1.1 概述 假設(shè)nginx http模塊的配置如下 http{ server { ...

    yuanzhanghu 評論0 收藏0
  • 分析Nginx 源碼 - ngx_module_t接口總結(jié)

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

    sunnyxd 評論0 收藏0
  • Nginx源碼:利用C語言tricky構(gòu)建函數(shù)鏈

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

    wind5o 評論0 收藏0

發(fā)表評論

0條評論

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