nginx启动显然是由main函数驱动的,main函数在在core/nginx.c文件中,其源代码解析如下,涉及到的数据结构在本节仅指出其作用,将在第二节中详细解释。
nginx main函数的流程图如下:
需要说明的:
以errno为下标,元素就是对应的错误提示信息。
2.获取命令行参数,保存在全局变量中
可以设置的命令行参数如下表所示
4.初始化cycle结构,创建内存池
5.保存命令行参数到几个全局的变量中
将命令行参数保存到ngx_os_argv、ngx_argc以及ngx_argv这几个全局的变量中。这算是一个备份存储,方便以后master进程做热代码替换之用。
6.用命令行参数初始化cycle
用命令行参数得来的全局变量初始化cycle的conf_prefix(配置文件所在路径的前缀)、prefix(nginx可执行文件所在路径)、conf_file(配置文件名)和conf_param(通过命令行-g选项指定的全局配置信息)
信息会被保存到一些全局变量中,如页大小ngx_pagesize, CPU cacheline
初始化一个做循环冗余校验的表,由此可以看出后续的循环冗余校验将采用高效的查表法
通过环境变量NGINX完成socket的继承,继承来的socket将会放到init_cycle的listening数组中。同时可以读取master进程传递的平滑升级信息等等
初始化所有模块的index信息,即对所有模块进行编号,ngx_modules数却是在自动编译的时候生成的,位于objs/ngx_modules.c文件中
用上面收集的init_cycle信息初始化ngx_cycle,这行代码是nginx启动过程中最重要的一个步骤,在第3节将详细展开。
12.获取配置项
9)ccf 为ngx_core_conf_t 将在第2节给出详细定义,这个地方需要解释下
ccf->master是从配置文件中解析master_process配置项所得的值,初始化为NGX_CONF_UNSET(-1),在配置项中,
如果flag类型的配置项master_process被设置为on,则其值为1,
如果为off,则其值为0,
ngx_process为全局变量,用于记录要采用的工作模式,未被初始化,因此初始值是0(uint型全局变量会被系统默认初始化为0),相关宏定义如下:
#define NGX_PROCESS_SINGLE 0
#define NGX_PROCESS_MASTER 1
#define NGX_PROCESS_SIGNALLER 2
#define NGX_PROCESS_WORKER 3
#define NGX_PROCESS_HELPER 4
因此,下面的if判断语句的含义就是:用来处理一种特殊情况,即如果在配置项中未设置master_process配置项或者是设置为打开,ngx_process未被设置,采用默认值0,这个时候要采用master工作模式。因为master_process优先级高,且nginx默认采用master模式如果在配置项中设置master_process为off,那么if依据不会执行。最终nginx工作模式取决于ngx_proces的初值0,即采用单进程模式。
13.初始化信号
初始化信号;主要完成信号处理程序的注册
14.创建守护进程
无继承sockets,且设置了守护进程标志,则创建守护进程
非NGX_PROCESS_MASTER=1进程,不创建该文件
根据ngx_process确定启动单进程模式还是多进程模式
/**********************************witch*****************************/
http://blog.csdn.net/witch_soya
/**********************************2015年9月10日 15:11:16*****************************/