Nginx源码分析1-总体设计思想

nginx
https://www.nginx.com/

Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。 起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件BSD-like协议下发行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中运行。

  • web服务器 静态请求和动态请求
  • 代理+负载均衡 HTTP代理 TCP代理(nginx 1.9,有第三方模块[ngx_tcp_proxy_module]做了同样的事)
  • 应用服务器 nginx+lua 现在的应用服务器干了两件,处理网络服务和执行业务脚本
  • 通过模块可以让它变得的更强大。比如您想拥有验证功能,动态代理,支持脚本语言等。通过模块可以轻松扩展这些功能。nginx有两种模块,内置模块和第三方模块。nginx具备很强的扩展能力,如果您的程序是构建在http之上,有些公共的模块可以交给nginx去处理,让程序本身只关注业务部分。github上已经有很多优秀的nginx模块。

设计之美:

  • 解析和处理配置文件
  • 模块化设计 在C世界里,文件即模块 模块是有依赖关系
  • OO抽象
  • 生命周期 解析配置、启动进程、处理请求
  • 结构体、依赖钩子调用

多进程master-worker:

  • prefork模式
  • 非阻塞模式的socket IO/CPU异步
  • 惊群 accpet锁

事件机制:

  • 支持多种io复用机制,如 poll, epoll, select, aio, kqueue等
  • 超时机制 红黑树
  • 定时器

upstream、stream设计:

stream的源码可以说是http的简化版,细心的读者应该发现源码的作者是Roman Arutyunyan,这个也是rtmp模块的作者,他还有个模块叫mysql handlersocket