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文件夹下。主要分成六个部分,如下

  1. -- src
  2. |-- core
  3. |-- event
  4. | `-- modules
  5. |-- http
  6. | `-- modules
  7. | `-- perl
  8. |-- mail
  9. |-- misc
  10. `-- os
  11. `-- 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 = ;
  13. for (i = ; 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 ;
  31. }

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

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

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

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

三、Nginx的模块化管理

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

  1. struct ngx_module_s {
  2. ngx_uint_t ctx_index; //归属主模块的编号
  3. ngx_uint_t index; //模块的主编号
  4.  
  5. ngx_uint_t spare0;
  6. ngx_uint_t spare1;
  7. ngx_uint_t spare2;
  8. ngx_uint_t spare3;
  9.  
  10. ngx_uint_t version;
  11.  
  12. void *ctx; //模块的上下文
  13. ngx_command_t *commands; //处理配置文件上的配置参数
  14. ngx_uint_t type;
  15.  
  16. ngx_int_t (*init_master)(ngx_log_t *log);
  17.  
  18. ngx_int_t (*init_module)(ngx_cycle_t *cycle);
  19.  
  20. ngx_int_t (*init_process)(ngx_cycle_t *cycle);//fork子进程后
  21. ngx_int_t (*init_thread)(ngx_cycle_t *cycle);
  22. void (*exit_thread)(ngx_cycle_t *cycle);
  23. void (*exit_process)(ngx_cycle_t *cycle);
  24.  
  25. void (*exit_master)(ngx_cycle_t *cycle);
  26.  
  27. uintptr_t spare_hook0;
  28. uintptr_t spare_hook1;
  29. uintptr_t spare_hook2;
  30. uintptr_t spare_hook3;
  31. uintptr_t spare_hook4;
  32. uintptr_t spare_hook5;
  33. uintptr_t spare_hook6;
  34. uintptr_t spare_hook7;
  35. };

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

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源码研究一:NGINX模块启动的更多相关文章

  1. Nginx源码研究七:nginx的location指令分析

    在nginx的配置文件nginx.conf中,我们在配置server的时候,会配置一下location指令,这个location指令是提供给用户来配置对于符合指令的http请求,采用该指令内部的处理方 ...

  2. Nginx源码研究六:NGINX的配置文件分析

    上一篇写到nginx的各个模块的配置信息的存储结构,大体描述了对配置信息的配置项生成,定制,初始化过程.这里重点研究实现定制的过程,所谓实现定制,这里指的是,nginx系统提供使用者定义nginx的配 ...

  3. Nginx源码研究五:NGINX的配置信息管理

    配置信息是nginx系统重要的组成部分,配置信息的使用,实际上包含两层,一层是用户针对参数定义了值,例如下面nginx参数文件中的 keepalive_timeout 65,还有一部分是用户没有定义值 ...

  4. Nginx (一)Windows下编译Nginx源码以及安装 nginx for windows方法步骤

    转载自: http://apps.hi.baidu.com/share/detail/11192699#content Nginx介绍: Nginx ("engine x")是一个 ...

  5. Nginx源码研究八:nginx监听socket实现流程

    前面描述了nginx系统分析nginx的配置文件,初始化模块相关参数的过程,这里利用nginx监听socket的实现过程,做一次完整的回顾 1.首先,nginx启动的main函数中,会先初始化cycl ...

  6. Nginx源码研究二:NGINX的事件处理概论

    NGINX作为服务端的应用程序,在客户端发出数据后,服务端在做着这样一些处理,数据先会经过网卡,网卡会和操作系统做交互,经过操作系统的协议栈处理,再和不同的应用程序交互. 在这里面涉及两个概念,一个是 ...

  7. Nginx源码研究三:Epoll在NGINX中的使用

    Web服务器在面对高并发的情况下,网络的IO一般选择IO复用,像apache选择的Select/poll.Nginx在linux 2.6后选择Epoll做网路IO,提高了WEB服务的并发能力. 在本章 ...

  8. [nginx] nginx源码分析--监控检测模块

    描述 HTTP监控检查,是nginx官网推荐使用的第三方模块 https://www.nginx.com/resources/wiki/modules/healthcheck/ https://git ...

  9. Nginx源码研究四:NGINX的内存管理

    关于nginx的内存使用,我们先看代码,下面是nginx_cycle.c中对全局数据结构cycle的初始化过程 pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, ...

随机推荐

  1. COJ 0018 移动盒子

    20605移动盒子 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 你有一行盒子,从左到右依次编号为1,2,3,……,n.可以执 ...

  2. COJ 1008 WZJ的数据结构(八) 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...

  3. Longest Palindromic Substring——LeetCode

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  4. HDOJ 2092 整数解(2次方程整数解公式)

    Problem Description 有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程. ...

  5. 自定义VIew——漂亮的圆形进度条

    package com.example.firstapp; import java.text.DecimalFormat; import android.annotation.SuppressLint ...

  6. IBM Intel 微软

    IBM是全球IT第一巨头,也是一个很奇特也很强大强大的公司,从螺丝钉键盘鼠标到CPU硬盘内存到大型机巨型机,它都可以制造,从软件到硬件到服务,它都可以提供,这在IT历史上,是否绝后我不敢说,空前应该是 ...

  7. Java 8 中新的 Date 和 Time 类入门详解

    这篇文章主要是java8中新的Date和Time API的实战.新的Date和Time类是java开发者社区千呼万唤始出来的.Java8 之前存在的Date类一直都受人诟病,很多人都会选择使用第三方的 ...

  8. HTTP学习笔记4-请求与响应结构例子

    18,HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成.请求消息和响应消息都是由开始行,消息报头(可选的),空行(只有CRLF的行),消息正文(可选的)组成. 19,对于请求消息,开始行就 ...

  9. Java并发编程:线程和进程的创建(转)

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  10. [CSS3] CSS Media Queries

    Using CSS media queries allows you to design responsive layout in your web apps and website. We will ...