Nginx网络epoll多进程系列:Nginx源码研究一:NGINX模块启动
2018-02-13 17:03
357 查看
http://www.cnblogs.com/yimuren/p/4063164.html
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文件夹下。主要分成六个部分,如下
关于这些文件夹,其中Core文件夹下: 主要是处理nginx的入口,nginx设计的数据结构等Event文件夹:处理网络IO情况http文件夹:处理http请求mail文件夹:提供邮件处理功能Os文件夹:操作系统相关Misc文件夹: 二、nginx的程序入口Nginx的入口文件在src/core/nginx.c中,
入口程序在开始处理命令行传入的参数,例如nginx –V,nginx –t等;处理时间的初始化;日志的初始化等;这里不做详细描述。Main函数里面比较重要的是两个部分第一部分是nginx的核心数据结构cycle的初始化第二部分是选择启动模式。Nginx有两种启动模式,一种是单进程,一种是多进程,多进程采用master-work模式,master进程负责管理work进程,不处理http请求,work进程处理http请求 Nginx的cycle数据结构是核心数据结构,会单独列出一章来研究;我们知道NGINX支持的功能非常的多,而且可定制,那么如何管理这些功能,NGINX将这些功能分隔成各个模块,在主流程上放置钩子,达到模块的订制效果。那么先看看NGINX的模块化管理 三、Nginx的模块化管理我们先看一下NGINX的模块类型
一个模块的结构主要包含三部分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
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
相关文章推荐
- Nginx网络epoll多进程系列:Nginx源码研究二:NGINX的事件处理概论
- Nginx网络epoll多进程系列:Nginx源码研究三:Epoll在NGINX中的使用
- Nginx网络epoll多进程系列:Nginx源码研究八:nginx监听socket实现流程
- Nginx网络epoll多进程系列:Nginx深入详解之多进程网络模型,用共享锁解决惊群问题
- Nginx网络epoll多进程系列:tcp服务器仿nginx多进程和多路IO的实现
- Nginx网络epoll多进程系列:应用层协议实现系列(一)——HTTP服务器之仿nginx多进程和多路IO的实现
- Nginx网络epoll多进程系列:应用层协议实现系列(二)——HTTP服务器之http协议解析
- Nginx网络epoll多进程系列:应用层协议实现系列(三)——FTP服务器之设计与实现
- Nginx网络epoll多进程系列:应用层协议实现系列(四)——DNS服务器之设计与实现
- nginx 源码学习笔记(二十二)—— event 模块(三) ——epoll模块
- Nginx 源码阅读笔记8 epoll 模块
- nginx事件模块之ngx_epoll_module源码分析
- Nginx源码分析-Epoll模块
- Nginx源码分析 - Event事件篇 - epoll事件模块
- Spring原理与源码分析系列(三)- Spring IoC容器启动过程分析(下)
- Nginx学习之七-模块ngx_epoll_module详解(epoll机制在nginx中的实现)
- Nginx源码分析:3张图看懂启动及进程工作原理
- Nginx源码分析1--------编写Nginx扩展模块
- 入门到放弃node系列之网络模块(一)
- Tomcat8源码分析系列-启动分析(二) Catalina初始化