摘要:每個模塊由以下幾部分構(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_
ngx_
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_
雖然模塊類型只有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_
這就是模塊和配置之間的關(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中包含有指令(簡單指令或塊指令)。因此稱events為events上下文。
常見的上下文還有: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:這個變量只在NGX_HTTP_MODULE類型的模塊的ngx_command_t使用。這個變量和今天討論的話題關(guān)系不大。暫不討論。
offset:這個變量用來標(biāo)記ngx_
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ù)。
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_CONF及NGX_DIRECT_CONF的含義與daemon指令的含義相同。
NGX_CONF_TAKE12是指該指令接收1個或兩個參數(shù),即Syntax: user user [group];
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源碼中是如何組織和管理配置文件中使用的配置指令的。
對于其他指令,可以直接閱讀源碼中該指令的定義。源碼就是最好的文檔。
由于Nginx是高度模塊化的,因而,對Nginx的配置一定是對模塊的配置。
Nginx的每條配置指令對應(yīng)某模塊中的一條ngx_command_t定義。
每條ngx_command_t一定操作了其所在模塊的ngx_
Nginx初始化時,首先解析配置文件,然后執(zhí)行對應(yīng)指令的ngx_command_t中的操作函數(shù),設(shè)置ngx_
然后,Nginx根據(jù)這些配置,執(zhí)行啟動流程,進(jìn)而開始工作。
到此為止。本篇結(jié)束。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/39154.html
摘要:結(jié)構(gòu)體數(shù)組,用來表示該模塊可以在配置文件中配置的項目,及其操作指令。 源文件路徑 srccore gx_conf_file.h srccore gx_conf_file.c 主要內(nèi)容 本篇的主要目的在于分析Nginx的配置功能。由于Nginx的配置基本就是對模塊的配置,因此,在討論配置功能之前,需要先分析Nginx的模塊功能。 對于模塊功能,這里的重點不在于某個模塊的細(xì)節(jié),而...
摘要:本文將從源碼從此深入分析配置文件的解析,配置存儲,與配置查找。在學(xué)習(xí)配置文件的解析過程之前,需要先了解一下模塊與指令的一些基本知識。 運營研發(fā)團(tuán)隊 李樂 配置文件是nginx的基礎(chǔ),對于學(xué)習(xí)nginx源碼甚至開發(fā)nginx模塊的同學(xué)來說更是必須深究。本文將從源碼從此深入分析nginx配置文件的解析,配置存儲,與配置查找。 看本文之前讀者可以先思考兩個問題: 1.nginx源碼中隨處可以...
摘要:四監(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 { ...
摘要:關(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源碼閱...
摘要:請注意這里的和是全局變量,而和是模塊的靜態(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提供...
閱讀 1460·2021-11-22 14:44
閱讀 2843·2021-11-16 11:44
閱讀 3206·2021-10-13 09:40
閱讀 1980·2021-10-08 10:04
閱讀 2363·2021-09-24 10:28
閱讀 2909·2021-09-06 15:02
閱讀 2957·2019-08-30 15:52
閱讀 2392·2019-08-30 13:20