Chinaunix首页 | 论坛 | 博客
  • 博客访问: 129442
  • 博文数量: 24
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-14 15:19
文章分类

全部博文(24)

文章存档

2014年(6)

2008年(3)

2007年(15)

我的朋友

分类: 架构设计与优化

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_cycle_t *cycle)

这个函数相对简单 :

ngx_master_process_cycle()
     --->  注册信号处理函数
     ---> 调用 ngx_start_worker_processes()函数创建worker进程
     ---> 调用 ngx_start_cache_manager_processes()函数创建cache manager进程
     ---> 进入forever 循环,等待外部信号。
     ---> done!

当master进程完成worker进程的创建后就可以退居幕后了,剩下的事情就交给worker进程完成吧。



























  

阅读(633) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~