摘要:每個模塊由以下幾部分構成結構體代表模塊本身,其指針被放入數組中。結構體用來表示模塊的配置內容,其中部分成員可以通過配置文件進行配置。調用該中的函數,該函數最終初始化模塊對應的結構體,完成配置。因此,分析源碼中的配置指令,就是分析結構體。
本篇的上篇 Nginx 源碼分析:從模塊到配置(上),建議閱讀本篇前先閱讀上篇。
關于模塊Nginx的架構高度模塊化。每個模塊各司其職,組合在一起完成特定的功能。
Nginx通過configure決定哪些模塊被安裝。所有安裝的模塊在編譯階段靜態生成,其指針被統一放入ngx_modules數組中,供全局使用。
每個模塊由以下幾部分構成:
ngx_module_t結構體:代表模塊本身,其指針被放入ngx_modules數組中。
ngx_
ngx_
ngx_command_t結構體數組:該數組中每一項ngx_command_t對應配置文件中一條指令。
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" */
每種類型對應一種ngx_
雖然模塊類型只有5種,但是模塊數量可以有很多,每個模塊都針對自身有特定的配置內容,這些配置內容中,可以被放到配置文件nginx.conf中的,被包裝成了一條條ngx_command_t指令。這些指令的內容決定了nginx.conf中可以寫入的操作指令。
Nginx初始化時解析nginx.conf配置文件,找到對應的ngx_command_t。調用該ngx_command_t中的函數,該函數最終初始化模塊對應的ngx_
這就是模塊和配置之間的關系。
配置文件、指令談到Nginx的配置,首先想到的肯定是配置文件nginx.conf。
眾所周知,nginx.conf配置文件的結構由一條條Nginx配置指令構成(官方文檔)。
Nginx配置指令可以分為兩種:簡單指令和塊指令。
例如:
worker_processes 1;就是一條簡單指令
events { ... }就是一條塊指令
如果,一個塊指令中含有其他指令,那么稱這個塊指令為上下文(注意區別模塊中的上下文概念)。
例如:
events { use epoll; worker_connections 1024; }
events是塊指令,由于events中包含有指令(簡單指令或塊指令)。因此稱events為events上下文。
常見的上下文還有:http上下文、server上下文、location上下文。整個nginx.conf文件稱為main上下文
源碼中的配置指令前面提到過:Nginx配置文件中的一條指令對應一個ngx_command_t結構體。因此,分析源碼中的配置指令,就是分析ngx_command_t結構體。
ngx_command_t結構體定義:
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;對應的ngx_command_s.name就是worker_processes。
set:函數指針,所以set用來表示,當Nginx解析配置文件,碰到指令時,該執行怎樣的操作。而該操作本身,自然是用來設置本模塊所對應的ngx_
conf:這個變量只在NGX_HTTP_MODULE類型的模塊的ngx_command_t使用。這個變量和今天討論的話題關系不大。暫不討論。
offset:這個變量用來標記ngx_
type:配置指令屬性的集合。例如,worker_processes這條指令對應的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是指,該指令后跟一個參數,例如worker_processes 1;的1就是指后面跟一個參數,這個參數的數目由NGX_CONF_TAKE1指定。
類似用來定義指令類型的宏還有很多,具體可以參考源碼中各個模塊中ngx_command_t的設置。
幾個典型的配置指令 daemon指令Nginx默認是以后臺的形式運行的,這種運行形式被稱為daemon,當然,在調試的時候,為了方便,一般是關掉daemon這種運行形式。
在配置文件中通過daemon指令來打開或關閉。官方文檔對daemon指令說明如下:
Syntax: daemon on | off; Default: daemon on; Context: main
在源碼中(core ginx.c),daemon指令對應的ngx_command_t結構體如下:
{ngx_string("daemon"), // 指令的名字daemon NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG, // 指令的類型 ngx_conf_set_flag_slot, // 指令對應的操作 0, offsetof(ngx_core_conf_t, daemon), NULL }
其中,NGX_MAIN_CONF指,daemon指令的上下文為main上下文。
NGX_DIRECT_CONF指,daemon指令是一條可以直接寫在main上下文的簡單指令。
NGX_CONF_FLAG指,daemon指令是一個開關指令,接收on | off作為指令參數。
Nginx可以在配置文件中通過user指令指定運行時所在的用戶及用戶組。官方文檔對user指令的說明如下:
Syntax: user user [group]; Default: user nobody nobody; Context: main
在源碼中(core ginx.c),user對應的ngx_command_t結構體定義如下:
{ 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個或兩個參數,即Syntax: user user [group];
Nginx中可以指定采用的事件監聽機制類型,比如select、poll、epoll等。
這個指定操作在events指令中完成。這里events指令為塊指令。
官方文檔對events指令的定義如下:
Syntax: events { ... } Default: — Context: main
在源碼中(event gx_event.c),events指令對應的ngx_command_t結構體定義如下:
{ 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是指,該指令不接受參數。
總結
以上三條指令能夠很清楚的說明,在Nginx源碼中是如何組織和管理配置文件中使用的配置指令的。
對于其他指令,可以直接閱讀源碼中該指令的定義。源碼就是最好的文檔。
由于Nginx是高度模塊化的,因而,對Nginx的配置一定是對模塊的配置。
Nginx的每條配置指令對應某模塊中的一條ngx_command_t定義。
每條ngx_command_t一定操作了其所在模塊的ngx_
Nginx初始化時,首先解析配置文件,然后執行對應指令的ngx_command_t中的操作函數,設置ngx_
然后,Nginx根據這些配置,執行啟動流程,進而開始工作。
到此為止。本篇結束。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/39154.html
摘要:結構體數組,用來表示該模塊可以在配置文件中配置的項目,及其操作指令。 源文件路徑 srccore gx_conf_file.h srccore gx_conf_file.c 主要內容 本篇的主要目的在于分析Nginx的配置功能。由于Nginx的配置基本就是對模塊的配置,因此,在討論配置功能之前,需要先分析Nginx的模塊功能。 對于模塊功能,這里的重點不在于某個模塊的細節,而...
摘要:本文將從源碼從此深入分析配置文件的解析,配置存儲,與配置查找。在學習配置文件的解析過程之前,需要先了解一下模塊與指令的一些基本知識。 運營研發團隊 李樂 配置文件是nginx的基礎,對于學習nginx源碼甚至開發nginx模塊的同學來說更是必須深究。本文將從源碼從此深入分析nginx配置文件的解析,配置存儲,與配置查找。 看本文之前讀者可以先思考兩個問題: 1.nginx源碼中隨處可以...
摘要:四監聽套接字的使用假設此處我們使用作為事件處理模塊在增加事件時用戶可以使用中的字段當事件發生時該字段也會帶回。在創建監聽套接字時將結構分為級監聽套接字地址各級都是一對多的關系。 施洪寶 一. 基礎 nginx源碼采用1.15.5 后續部分僅討論http中的listen配置解析以及優化流程 1.1 概述 假設nginx http模塊的配置如下 http{ server { ...
摘要:關于有一套設計良好的源碼,以供分析,本文從結構體來分析源碼結構。總結初次閱讀源碼,先從結構體開始學習,開篇之作,再接再厲。 關于 nginx有一套設計良好的源碼,以供分析,本文從ngx_module_t結構體來分析nginx源碼結構。ngx_module_t是整個nginx的關鍵,它提供了整個nginx的模塊化的基礎。因此,看懂ngx_module_t結構體才能開始入門nginx源碼閱...
摘要:請注意這里的和是全局變量,而和是模塊的靜態變量是模塊級的全局變量,這一點很重要,后面會詳細分析。當編譯進一個模塊的時候,就被賦值為當前模塊的處理函數。所以整體看來,就像用全局變量組成的一條單向鏈表。 最近開始使用Nginx的第三方擴展解決實際的問題,對Nginx的擴展開發產生了一些興趣,在閱讀第三方代碼時產生了一些心得和體會。本文詳細分析了進行Nginx過濾器開發的時候,Nginx提供...
閱讀 1469·2021-11-22 14:44
閱讀 2848·2021-11-16 11:44
閱讀 3214·2021-10-13 09:40
閱讀 1993·2021-10-08 10:04
閱讀 2368·2021-09-24 10:28
閱讀 2916·2021-09-06 15:02
閱讀 2965·2019-08-30 15:52
閱讀 2400·2019-08-30 13:20