nginx源码剖析--从main函数开始

八九月份找好工作之后,着实懒散了一段时间。现在回想起来,九月份没有做一件有意义的事情,成天都是胡思海想。现在工作基本上定下来了,打算这段时间直到毕业,好好学习几个方面的知识:

  1. 后台开发
  2. 数据存储

后台开发上主要是打算吃透nginx。为了达到这个目的,这段时间会写一系列的nginx源码剖析的文章。由于水平实在有限,可能会写相当长的时间,并且写的时候也会有许多问题。不过我总是会尽自己最大的努力的。

想起来,第一次尝试看nginx是在一年前了。时间过的很快,虽然一年过去了,还是有很多不懂的地方,因此写这个系列的博文主要还是想督促自己把它看透。


nginx是一个轻量级的web服务器。它性能好,设计优雅,因此无论从功能实现,还是架构设计上都值得我们研读。这篇博文从main函数开始。

main函数是服务器启动的入口,总的来说,main主要是做了两件事情。

  1. 初始化服务器的一些全局变量
  2. 启动各个IO事件进程

对于初始化任务,主要都是在ngx_init_cycle函数中完成。这个函数主要是完成对ngx_cycle_t结构体的初始化。Nginx所有动作都是围绕着ngx_cycle_t结构体进行的。Nginx的高度灵活性,主要就是来自于它的高可配置性,也就是说,在不需要改变源代码,只需要改变配置文件的情况下,就可以实现不同的功能。这是系统设计中的一个很重要的方法。而ngx_cycle_t结构体就是和可配置性息息相关的。

可以说,ngx_cycle_t是配置文件通往nginx实际运行的桥梁,配置文件可以通过改变ngx_cycle_t结构体中的相关值来改变nginx的实际运行行为

ngx_cycle_t结构体的介绍我们留给下一篇。

初始化完成之后,下面就是启动IO处理进程了,这是web服务器的核心。Nginx使用的也是多路IO复用+reactor的范式。Nginx提供了单进程和多进程的模式:

    if (ngx_process == NGX_PROCESS_SINGLE) {
        ngx_single_process_cycle(cycle);

    } else {
        ngx_master_process_cycle(cycle);
    }
ngx_single_process_cycle

就是只启动一个IO进程来处理服务器IO事件。

ngx_master_process_cycle

启动多个worker进程处理IO事件,同时有一个master进程管理这些worker进程。

深入到每个IO进程里面,我们就会发现每个IO进程都会有一个类似这样的死循环:

for ( ;; ) {
    ......
    ngx_process_events_and_timers(cycle);
    ......
}

这里就是IO事件循环,它的核心工作主要是处理IO事件和定时器事件。
我们看到这里把cycle作为参数传递到事件处理器中,就验证我们前面所说,Nginx主要是围绕这个结构体运行的。它会影响nginx如何做事件处理。


本篇我粗糙讲了一下nginx服务器启动的流程,主要包括初始化和事件循环启动。nginx提供多进程和单进程的事件处理逻辑。Nginx的运行主要是围绕ngx_cycle_t结构体,因此初始化部分主要是对它进行初始化。下一篇我们将会深入了解一下这个NGINX的核心结构体。这个结构体上面有nginx运行时所依赖的资源,有配置文件相关的配置项信息,以及各个模块各自加载的配置项的信息。

猜你喜欢

转载自blog.csdn.net/swartz2015/article/details/78142351