分类: 架构设计与优化
2014-11-06 16:13:43
nginx的核心初始化过程非常清晰,基本上全部集中在函数ngx_init_cycle()中。
ngx_init_cycle(old_cycle) :
---> ngx_timezone_update() : 时区初始化
---> ngx_time_update() : 时间初始化
---> ngx_create_pool() : 创建新的内存pool
---> 基于此pool,分配新的ngx_cycle_t
---> 初始化cycle的prefix, conf_prefix, conf_file,conf_param
---> 初始化 cycle->paths,这是一个nginx 数组结构,用来管理存储在cycle->paths 中的ngx_path_t数据结构,初始化数组长度为10
---> 初始化cycle->open_files管理结构
---> 初始化共享内存管理结构
---> 初始化reusable_connections_queue
---> 初始化配置上下文 conf_ctx
---> 初始化hostname
---> 初始化modules
---> 配置文件解析,主要由ngx_conf_param函数,ngx_conf_parse函数来完成,包括了调用module中的配置初始化函数,在处理配置文件的过程中,nignx用到了一个临时的pool用来存储配置文件。
---> 测试lock 文件
---> 创建文件路径
---> 为各个module注册的共享内存进行分配工作, 需要注意的是,共享内存并不是所有的模块都需要,只有特殊的模块的特性才需要shared memory作为cache使用,这个需要在配置文件中指定。
---> 处理listening sockets, open them and configure them
---> 最后清除不再需要的临时或者过期的资源。
---> 返回全局的cycle
个人感觉nginx初始化过程的理解非常重要,其中nginx的配置文件处理部分可能不是很好理解,需要仔细研读代码。
相对核心数据结构的初始化而言,nginx的核心进程/线程初始化比较简单。
nginx的主进程(或者叫主控进程)为master进程, 所有workder进程都由master进程创建,其具体函数为 : ngx_master_process_cycle(ngx_cycle_t *cycle)
这个函数相对简单 :
ngx_master_process_cycle()
---> 注册信号处理函数
---> 调用 ngx_start_worker_processes()函数创建worker进程
---> 调用 ngx_start_cache_manager_processes()函数创建cache manager进程
---> 进入forever 循环,等待外部信号。
---> done!
当master进程完成worker进程的创建后就可以退居幕后了,剩下的事情就交给worker进程完成吧。