本文共 1463 字,大约阅读时间需要 4 分钟。
八九月份找好工作之后,着实懒散了一段时间。现在回想起来,九月份没有做一件有意义的事情,成天都是胡思海想。现在工作基本上定下来了,打算这段时间直到毕业,好好学习几个方面的知识:
后台开发上主要是打算吃透nginx。为了达到这个目的,这段时间会写一系列的nginx源码剖析的文章。由于水平实在有限,可能会写相当长的时间,并且写的时候也会有许多问题。不过我总是会尽自己最大的努力的。
想起来,第一次尝试看nginx是在一年前了。时间过的很快,虽然一年过去了,还是有很多不懂的地方,因此写这个系列的博文主要还是想督促自己把它看透。
nginx是一个轻量级的web服务器。它性能好,设计优雅,因此无论从功能实现,还是架构设计上都值得我们研读。这篇博文从main函数开始。
main函数是服务器启动的入口,总的来说,main主要是做了两件事情。
对于初始化任务,主要都是在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运行时所依赖的资源,有配置文件相关的配置项信息,以及各个模块各自加载的配置项的信息。
转载地址:http://hsqxi.baihongyu.com/