nginx 基本架构

2014-12-19 17:52:40   最后更新: 2014-12-26 00:35:40   访问数量:2616




在我的眼中,计算机领域有四大艺术品:

  1. Linus 的 linux
  2. Richard 的 vim
  3. Igor 的 nginx
  4. Google 的 leveldb
  5. Rasmus Lerdorf 的 PHP

这几样工程应用无论是在功能、扩展性还是在设计、代码成熟度上都算得上是日趋完美的佳品

其中 nginx 的代码更是以短小精悍、结构清晰著称

作为一个服务器端开发工程师,阅读nginx源码也是必须的

 

阅读源码就意味着要去逆向理解开发者的设计和思想,这当然是很难的一件事,任何一个工程的源码都是一块巨大的坚冰,难以快速全面领会,需要结合源码不断思考,慢慢领会、摸索,才能最终达到提纲挈领,甚至去修改部分不足的程度

在我看来,阅读源码起码有以下好处:

  1. 学习成熟、优秀的代码风格
  2. 学习完整的设计模式
  3. 了解一个大型工程化项目的设计、运转过程
  4. 对项目中的某些模块可以使用拿来主义,直接应用于工作实践中
  5. 培养严密的思维逻辑
  6. 培养代码阅读能力

比如 nginx 中有直接封装好的 log 模块、进程池、内存池模块,这些都可以直接应用于工作中,当然了,包括红黑树、哈希表等基本的数据结构,nginx也有模块化的封装,可以直接使用

比如 PHP 源码的 Zend 引擎中,大量使用宏来优化设计,宏的使用出神入化已经达到令人惊艳的程度

 

个人在阅读过程中,以加注释的方式,将部分理解、标注添加到 nginx 的源码中,使用的源码是目前最新发布的 nginx-1.7.7,同时会将注释后代码提交到 github

nginx-1.7.7 个人注释版

 

废话不多说,既然要学习 nginx 源码,首先需要了解一下 nginx 的基本架构

 

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器

 

nginx 启动后,在 unix 系统中以 daemon 的方式在后台运行,后台进程包含一个 master 进程和多个 worker 进程

 

nginx 默认是使用多进程方式启动的

master 进程用来 fork 并管理 worker 进程,主要作用有:

  1. 接受外界信号
  2. 向 worker 发送信号
  3. 监控 worker 运行状态

每个请求都在一个 worker 进程中处理,worker 的个数是由配置文件指定的,一般我们设为 CPU 的核心数目,这样避免 CPU 的竞争和不必要的上下文切换

worker 默认会绑定到一个固定的核心上,以避免进程切换所导致的 cache 失效

默认的,nginx 是使用进程模型工作的,当然,他也提供了多线程的工作模式

相对于多线程模型,多进程模型主要具有以下优点:

  1. 进程间不共享资源,省去了加锁所带来的开销
  2. 无需使用锁,避免了锁的粒度设计不当的问题,减轻编程负担
  3. 多线程在多并发情况下,占用内存过多,上下文切换带来的开销太大
  4. 进程之间互不影响,某个进程异常退出,其他进程可以继续工作

nginx 是采用异步非阻塞模型实现IO通信的

这么做有以下好处:

  1. 实现事件的轻量化处理
  2. 节省CPU时间,只通知内核处理结束后调用哪个回调函数,实现优雅

 






技术帖      linux      unix      socket      龙潭书斋      服务器      nginx      server      worker      master     


1#youqi: (回复)2017-12-12 08:42:28

adf

京ICP备15018585号