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

全部博文(24)

文章存档

2014年(6)

2008年(3)

2007年(15)

我的朋友

分类: 架构设计与优化

2014-11-03 22:49:52

概述


Nginx是著名的WEB服务器与负载均衡软件,在全世界范围内得到了非常广泛的应用。本文将从软件架构的层次上面队Nginx进行分析, 从而帮助自己或者其他有需要的朋友从代码的角度更好的理解Nginx。
本文以nginx-1.6.2的版本为例进行分析。

Nginx的代码组织结构

nginx的主要代码目录如下: 

    auto  ---》 辅助目录,在
    conf  ---》 配置文件目录
    configure  ---》 安装预处理文件
    contrib  ---》 辅助目录
    html    ---》 辅助目录,html示例
    Makefile  ---》 Makefile
    man ---》 man files
     objs ---》 临时目录,在执行configure后被创建,保存真正的Makefile与编译后的可执行文件
    src ---》 主代码目录,nginx所有的C代码都在此目录中

Nginx 代码架构


Nginx的main函数处理流程


Nginx的main函数在文件 ./src/core/nginx.c中。 其处理流程为 : 

main() --->    
    ---> ngx_debug_init()        :    debug init, 在linux环境下未定义
    ---> ngx_strerror_init()     :    出错代码初始化,将错误代码保存在预分配的内存中
    ---> ngx_get_options()     :     处理nginx启动时的附加参数
    ---> ngx_time_init()           :     初始化时间,注意不是timer,是time
    ---> ngx_regex_init()        :     初始化正则表达式引擎
    ---> 取得pid
    ---> ngx_log_init()            :     初始化log系统, open log文件
    ---> ngx_ssl_init()            :      初始化SSL
    ---> 初始化nginx的主要控制数据结构 init_cycle 
        ---> 关联log
        ---> ngx_create_pool()            :        创建内存pool
        ---> ngx_save_argv(0             :         保存启动参数
        ---> ngx_process_options()    :        处理nginx启动参数,将其与cycles关联
    ---> ngx_os_init()                    :        平台相关的系统级初始化
    ---> ngx_crc32_table_init()      :        CRC32校验和初始化
        ---> ngx_add_inherited_sockets()        :        取得已有的继承的sockets, 发生在reload 配置文件时候
        ---> ngx_init_cycle()                            :        初始化cycle的其他部分
            ---> ngx_timezone_update()            :        初始化timezone
            ---> ngx_create_pool()                    :         创建新的pool与cycle数据结构,拷贝数据,从旧的cycle到新的cycle机构
           ---> ngx_list_init()                            :         初始化用到的列表
            ---> ngx_queue_init()                       :         初始化用到的队列
            ---> handle the conf file                   :         处理配置文件
            ---> ngx_test_lockfile()                    :        
            ---> ngx_create_paths()                  :          
            ---> ngx_log_open_default()            :          打开新的log文件
            ---> 创建并初始化共享内存
            ---> 处理sockets
            ---> 处理old cycles 遗留的垃圾
        ---> 信号处理初始化
        ---> ngx_daemon()                            : 创建daemon
        ---> ngx_create_pidfile()                    : 创建pid文件
        ---> ngx_single_process_cycle() OR ngx_master_process_cycle()    :    进入主处理流程
        ---> ngx_single_process_cycle()        :            SINGLE 模式
            ---> ngx_process_events_and_timers()    :    处理全部的事件,timer也是事件的一种
                ---> ngx_process_psoted()        :         处理网络数据到达事件
        ---> ngx_master_process_cycle()      :            MASTER 模式
            ---> ngx_start_worker_processes()            :     启动worker进程,可能有多个worker进程,默认为一个
                ----> ngx_worker_process_cycle()          :     worker process 处理程序
                    ---> ngx_create_thread()                    :     创建worker线程
                        ---> ngx_worker_thread_cycle()     :      worker线程处理函数
                            ---> ngx_event_thread_process_posted()        :        调用event->handler, 处理POSTED 事件

                    ---> 进入 worker的 forever 循环,等待处理事件

            ---> ngx_start_cache_manager()                :     启动cache manager 进程

            ---> forever 循环, 进入master的 forever 循环,等待信号输入

综述

总体架构上,nginx是多进程架构(也可以启动多线程,但默认不会启动线程), master是控制进程,负责初始化,控制等管理工作,具体的网络事件处理由一个或者多个worker进程负责。
nginx也可以以单进程的方式工作,但一般用做调试模式,工作在前台模式,性能不好,不能使用在生产环境下。

nginx本身是一套设计非常棒的软件系统, 下一步我打算深入代码细节,具体讲解其实现过程以及主要的数据结构,控制流程等。












                    



            



















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