Nginx源码分析1-总体设计思想
11 Jun 2015
|
|
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