博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx源码研究一:NGINX模块启动
阅读量:4358 次
发布时间:2019-06-07

本文共 3501 字,大约阅读时间需要 11 分钟。

     Nginx 是一个轻量级,但是高性能的 HTTP 和 代理 服务器,也是一个 IMAP/POP3/SMTP代理服务器。 它的第一个版本0.1.0是由俄罗斯的工程师Igor Sysoev与2004年10月4日发出。而本次研究是基于1.4.5版本

 

      Nginx是采用模块化开发,对于支持的功能都是封装在各个模块下,我们也可以改造nginx,增加新的模块,在安装前使用 ./configure --add-module=path 增加在path目录下新开发的模块。可以仔细看一下configure配置文件,对于Nginx支持的模块,会生成一个ngx_modules.c文件,该文件会对支持的module做声明,并且生成一个数组ngx_module_t *ngx_modules[] 统一管理各个模块。

 

一、Ngnix的源码组织

     我们先看Nginx的源码组织,Nginx的源码放在src文件夹下。主要分成六个部分,如下

-- src    |-- core    |-- event    |   `-- modules    |-- http    |   `-- modules    |       `-- perl    |-- mail    |-- misc    `-- os        `-- unix

     关于这些文件夹,其中

Core文件夹下: 主要是处理nginx的入口,nginx设计的数据结构等

Event文件夹:处理网络IO情况

http文件夹:处理http请求

mail文件夹:提供邮件处理功能

Os文件夹:操作系统相关

Misc文件夹:

 

二、nginx的程序入口

Nginx的入口文件在src/core/nginx.c中,

1 int ngx_cdecl    2 main(int argc, char *const *argv) 3 { 4     ngx_int_t         i; 5     ngx_log_t        *log; 6     ngx_cycle_t      *cycle, init_cycle; 7     ngx_core_conf_t  *ccf; 8  9     ………10 11     //对nginx支持的模块编号,统一管理12     ngx_max_module = 0;13     for (i = 0; ngx_modules[i]; i++) {14         ngx_modules[i]->index = ngx_max_module++;15     }16 17     //nginx核心数据结构cycle的初始化18     cycle = ngx_init_cycle(&init_cycle);19 20 ……21 22 //选择启动模式23     if (ngx_process == NGX_PROCESS_SINGLE) {24         ngx_single_process_cycle(cycle);25 26     } else {27         ngx_master_process_cycle(cycle);28     }29 30     return 0;31 }

入口程序在开始处理命令行传入的参数,例如nginx –V,nginx –t等;处理时间的初始化;日志的初始化等;这里不做详细描述。Main函数里面比较重要的是两个部分

第一部分是nginx的核心数据结构cycle的初始化

第二部分是选择启动模式。Nginx有两种启动模式,一种是单进程,一种是多进程,多进程采用master-work模式,master进程负责管理work进程,不处理http请求,work进程处理http请求

     Nginx的cycle数据结构是核心数据结构,会单独列出一章来研究;我们知道NGINX支持的功能非常的多,而且可定制,那么如何管理这些功能,NGINX将这些功能分隔成各个模块,在主流程上放置钩子,达到模块的订制效果。那么先看看NGINX的模块化管理

 

三、Nginx的模块化管理

我们先看一下NGINX的模块类型

struct ngx_module_s {    ngx_uint_t            ctx_index; //归属主模块的编号    ngx_uint_t            index;  //模块的主编号    ngx_uint_t            spare0;    ngx_uint_t            spare1;    ngx_uint_t            spare2;    ngx_uint_t            spare3;    ngx_uint_t            version;    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);//fork子进程后    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;};

     一个模块的结构主要包含三部分

1、 模块的上下文:  生成模块配置信息关心的参数,初始化配置信息关心的参数

2、 模块的commands: 将用户定制的参数写入,管理子模块

3、 模块配置信息:确定模块关心的配置信息

      Nginx有非常多的模块,同时如果有需要,可以自己定制一些模块,整体上,模块之间的关系可以按照下图所示:

     从图中,我们可以看出,模块按类型做了区分。图中第一排是核心模块,二三排可以称作功能模块,但是功能模块都有一个功能核心模块(第二排),一般情况下,模块中的init master,init module,init process,init thread,exit thread,exit process,exit master操作放在功能核心模块中,对于这些操作,其中init process如果采用的是master-work的工作模式,将会在fork子进程后,在子进程中处理

     如此,我们看一下模块的启动过程

第一阶段,配置信息的生成,分析配置文件,对配置信息如果在配置文件中没有设置,则做初始化。简单如下图所示:

    在配置信息设置后,会接着对module做初始化操作

 

第二阶段是在fork子进程后,在子进程中,将会调用所有模块的init process操作

以上基本是整个模块的管理过程

 

总结:文章主要考虑NGINX的文件结构,启动入口和模块化管理,从整体上认识NGINX

 

转载于:https://www.cnblogs.com/yimuren/p/4063164.html

你可能感兴趣的文章
Web字体(链接)嵌入
查看>>
switch… case 语句的用法
查看>>
day07补充-数据类型总结及拷贝
查看>>
语言、数据和运算符
查看>>
正则表达式30分钟入门教程
查看>>
sqlserver try catch·
查看>>
怎么在三维世界里叙述五维故事
查看>>
css技巧
查看>>
代码优化(一)
查看>>
为什么JSP会比Beetl慢
查看>>
移动端rem的用法
查看>>
php-laravel中间件使用
查看>>
myslq 表与表之前的数据转移
查看>>
python学习日志
查看>>
微信自媒体账号涉违规大规模被封
查看>>
35.数组中的逆序对
查看>>
HDU 1811 Rank of Tetris
查看>>
绑定 前台
查看>>
由当前日期计算相应的周一和周日
查看>>
Silverlight Excel Release process
查看>>