前言

最近空闲时间比较多, 开始阅读nginx源码, 阅读的过程总结和笔记整理了下, 汇集成了一个系列的文章, 由于nginx功能实在太多, 没法做到面面俱到, 只对已经阅读过的源码进行记录总结, 以后会逐步进行扩充.

源码版本

nginx1.6.2

源码目录

|-objs
| |-src
|
|-src
| |-core
|
|-event
| |-modules
|
|-http
| |-modules
|
|-mail
|
|-misc
|
|-os
| |-unix

1.objs目录是自动生成的一些源码的目录,执行完configure文件后会根据配置生成的源文件。

2.src/core目录中是nginx核心数据结构和算法,例如程序入口,配置文件解析,hash表,链表,红黑树等实现。

3.src/event目录是nginx事件处理部分,主要是网络事件,src/event/modules包含了各种不同的网络模型模块,根据不同系统配置,会自动选择一种最优的网络模型,select,poll,epoll等均有实现。

4.src/misc主要包含一个测试模块和google性能分析模块。

5.src/mail主要是邮件服务的模块。

6.src/os/unix主要是跟平台系统相关的一些函数的封装,保证上层接口的调用一致性。

7.src/http这里是nginx对http请求的具体处理部分,modules目录下包含各种http处理的模块过程,如果我们对nginx进行扩展的时候,一般都是添加到这个目录下。

启动过程

ngx_strerror_init 初始化错误信息,由于strerror调用非异步信号安全,因此nginx调用streeror获取所有系统错误信息,保存到一个数组中,以后直接根据错误号取数组中的错误信息。
|
|
V
ngx_time_init 初始化程序中用到的时间,由于时间函数调用异常频繁,nginx对时间做了缓存,减少调用系统函数次数,提高效率。
|
|
V
ngx_regex_init 初始化正则表达式库
|
|
V
ngx_log_init 初始化日志文件目录
|
|
V
ngx_init_cycle 初始化程序循环数据结构
|
|
V
是否单进程模式 ------> 是 ------> ngx_single_process_cycle 单进程模式循环体
| 1.初始化所有的注册模块
| 2.for死循环调用ngx_process_events_and_timers函数,进行事件派发和处理。
V

|
|
V
ngx_master_process_cycle 多进程或多线程模式循环体
|
|
V
sigprocmask重置一部分信号未阻塞模式,防止后面创建进程等操作产生信号中断,然后调用ngx_start_worker_processes创建进程,之后将所有信号重置为非阻塞,主进程进入
|
|
V
ngx_start_worker_processes 根据事先配置好的进程数量循环调用ngx_spawn_process 创建进程。
|
|
V
ngx_spawn_process 首先创建一个socket对,用于主进程和子进程之间的通信,然后调用fork创建进程,子进程调用回调函数prc,即ngx_worker_process_cycle。
|
|
V
ngx_worker_process_cycle同样调用ngx_process_events_and_timers函数进行事件派发和处理。

nginx启动的大致流程, 启动过程中关于配置的解析过程相对比较复杂, 是一个递归调用, 比较难以理解, 后面的文章会讲解到.

NGINX(一)内存结构 : http://www.cnblogs.com/ourroad/p/4838794.html

NGINX(二)内存池 : http://www.cnblogs.com/ourroad/p/4838362.html

NGINX(三)HASH表 : http://www.cnblogs.com/ourroad/p/4844860.html

NGINX(四)配置解析 : http://www.cnblogs.com/ourroad/p/4861096.html

NGINX(五)模块 : http://www.cnblogs.com/ourroad/p/4861240.html

NGINX(六)扩展 : http://www.cnblogs.com/ourroad/p/4863051.html

NGINX(七)分段下载 : http://www.cnblogs.com/ourroad/p/4860477.html

NGINX开篇的更多相关文章

  1. nginx+iis实现负载均衡

    最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为Load Balance,其 ...

  2. centos 系统下安装FastDFS+nginx+fastdfs-nginx-module安装配置

    前言: 以前的项目上传的文件都是保存到本地或者是局域网内的共享文件夹下,由于数据量,服务器的负载均衡(分机的某些图片无法访问的问题处理)等因素的情况下,就想到用fastdfs来文件管理,花了几天时间硬 ...

  3. 【转】nginx+iis实现负载均衡

    最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为Load Balance,其 ...

  4. Nginx之旅系列 - Nginx日志功能 PK Linux内核printk

    题记:Nginx之旅系列是用来记录Nginx从使用到源码学习的点点滴滴,分享学习Nginx的快乐 Nginx 首页: http://nginx.org/ Nginx日志功能 PK Linux内核pri ...

  5. client,server,nginx 在使用keepAlive 专题

    2. TCP keepalive overview In order to understand what TCP keepalive (which we will just call keepali ...

  6. .NET Core IdentityServer4实战-开篇介绍与规划

    一.开篇寄语 由于假期的无聊,我决定了一个非常有挑战性的活动,也就是在年假给大家带来一个基于OAuth 2.0的身份授权框架,它就是 IdentityServer4 ,如果没有意外的话,一定可以顺利的 ...

  7. 我为什么要谈KeepAlive(文末增加nginx 负载tcp长连接保持 demo)

    http://blog.sina.com.cn/s/blog_e59371cc0102ux5w.html 最近工作中遇到一个问题,想把它记录下来,场景是这样的: 从上图可以看出,用户通过Client访 ...

  8. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  9. leveldb开篇

    因为工作的需求,最近看了一些项目的源码,包括nginx.tair.leveldb,一直看了下来都没有写东西的习惯,虽然作了不少记录,但都是只有自己才能看懂的笔记. 好多次都说开始写blog,锻炼一下自 ...

随机推荐

  1. Web Api 控制器

    Web Api 控制器 文档目录 本节内容: 简介 AbpApiController 基类 本地化 其它 过滤 审计日志 授权 防伪造过滤 工作单元 结果包装和异常处理 结果缓存 验证 模块绑定器 简 ...

  2. 利用开源项目使discus论坛与java应用同步登录和注册

    最近做了一个资源库系统的项目,老师说可以搭建开源论坛替代自己开发社交模块(评论啊,反馈啊)来减轻负担,甚至提到了要给每个资源开一帖的功能..使我十分怀疑到底是减轻负担还是增加负担...不过怀疑归怀疑, ...

  3. [转]struct实例字段的内存布局(Layout)和大小(Size)

    在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Alig ...

  4. @Entity设置实体lazy = false

    问题描述 在通过Hibernate查询Bean信息时报以下异常信息: org.hibernate.LazyInitializationException: could not initialize p ...

  5. [转载]MongoDB查询优化原则

    .在查询条件.排序条件.统计条件的字段上选择创建索引,可以显著提高查询效率. .用$or时把匹配最 多 结果的条件放在最前面,用$and时把匹配最 少 结果的条件放在最前面. .使用limit()限定 ...

  6. c++中的隐藏、重载、覆盖(重写)

    转自c++中的隐藏.重载.覆盖(重写) 1 重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual关键字可有可无. 覆盖是 ...

  7. fiddler 插件开发二

    本篇主要讲解Fildder插件开发中的涉及到的主要接口与类. 1.IFiddlerExtension 接口 如果要开发的自定义插件有UI界面,则需要实现IFiddlerExtension 接口.你程序 ...

  8. 推荐牛X的一本JS书

    主要是看阮一峰的教程时,他参考书目里有这一本中文的, 找来一看,果然高.. 练习一下. function Base(name) { this.name = name; this.getName = f ...

  9. mysql查看表的结构

    ①mysql > show create table 表名; ②mysql > desc 表名; ③mysql > describe 表名;

  10. iOS中关于KVC与KVO知识点

    iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点  一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...