Nginx是谁?它是反向代理服务器的代表之一,是高性能和模块化开发的典范,更是我的老师。
认识它,你将免费获得“最佳的代理体验”、“优雅的代码规范”、“极致的性能设计”和“优秀的模块思想”,还有无数个值得品味的编程细节。
那么在正式介绍Nginx给大家认识前,我简单介绍一下整个相亲过程,我们将从以下4个角度认识Nginx:
Nginx进程模型图
如上所示,Nginx设计上将程序分为4类,分别为:
这样就很清晰了,“系统管理员”通过“Master”来控制Nginx的启动、停止、重载、升级等,而“管理员”或“管理程序”则通过“管理进程”来管理业务行为。换言之,“Master”是老板,“管理进程”是管理层领导,而“工作进程”则是基层员工,最后的“自定义进层”则有点像是外包。
看到这里,相信会引发一定的争议。因为看过源代码的人可能会说:““Nginx”没有“管理进程”,更没有管控数三面分离这一说,有的只是“Master-Worker”模型”。
其实,如果我们想真正的去看清一件事物,是不能仅留存于过去的状态,而应当适当的带入未来的思想,否则只会人云亦云,永远寄于事物之下。换言之,Nginx也是经过发展后的产物,它也是有过程和变化的属性的,如果你不能充分认识其历史性并时刻思考其发展趋势,那么就永远也无法掌控它,将永远停留在使用中。
我们将管控数三面分离带入到Nginx中是顺滑的,完全可行的一步:
从进程模型中我们能看清楚worker的”姿色“,但无法看到worker的”资产“,接着我们以如下的体系结构图来认识Nginx:
Nginx体系结构图
如上所示,Nginx可分为“业务”、“增强能力”、“基础能力”和“管理面”四个部分:
从这里可以清晰的看出,Nginx的业务能力主要有三大块(源生能力,但在此架构上是可以继续扩展代理能力的),分别为:“Stream代理”、“HTTP代理”和“Mail代理”。
顾名思义“流代理”,即流量代理。其代理应用层以下的业务流量,是应用代理能力的补充。最直接就是传输层的TCP和UDP代理,同时也支持“Proxy protocol”(v1和v2)。如何理解流代理,最简约的表达就是“传输层”代理,不考虑数据的应用特征,只进行数据代理/转发,同时在需要时提供“会话层”和“表示层”的支撑,比如TLS加密,这也是源生Nginx的“Stream代理”中携带的能力,基于此思想,我们也能在需要的时候去扩展其“传输能力”、“会话能力”和“表示能力”,完成自身的定制化开发。其协议栈如下所示:
Stream协议栈图
从图中可以直接看出“Stream代理”的完整协议栈,正如前面所说,我们可以根据需要去开阔能力,比如在“传输协议”中加入“SOCK5协议”即可丰富Stream的协议代理能力;在UDP之上中加入“KCP(会话协议框架)”即可增强UDP的代理能力,提供重视时效性的传输需求的流代理业务。