阿里云资深架构师分享:Nginx 就是个好的架构.
- 标签 :
前言:
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
作为工程师的我们,为什么要学 Nginx?
第一点:Nginx 对整个架构的帮助是非常大的。
2007 年,我从华为来到了腾讯的 QQ 空间,在数据开发组工作。当时 QQ 空间小组也就是十来个人,大概有一亿多用户,同时在线大约在三百万用户,承载在 Apache 和 C++ 开发的服务器上。因为当时腾讯有蛮低的 ARPO 值(每用户平均收入),每个用户贡献的收入是很少的,所以我们需要每台服务器尽量能够带来更多的价值,能服务更多的用户,就需要在 Apache 上做大量的优化。比如说把它的多进程改成多线程,很多初始化能一次解决的就不要初始化多次、调用多次等等。
但是不管你怎么样做,总有点隔靴搔痒的感觉,你根本没办法做大幅度的优化,因为它的结构已经决定了这些问题的出现。
2009 年我到了思科之后,也遇到了同样问题,但我开始接触 Nginx,发现用 Nginx 改造服务器之后,它大概有 10 倍这样数量级的性能提升。但对于 Apache,你对架构本身没有办法做很大的变动了。这就是我通过实际经历想表达的第一点。
第二点:不能重复造轮子。
什么叫不能重复造轮子?
大概 2014 年,我在阿里 VBC 网络的时候,用因特尔的 DBDT 技术解决方案,做了一个叫 SDN 软件自定义网络。当时我突然发现,你做一些比如网络设备相关东西的时候,它的技术迭代非常慢,而且技术相对保守一些。
这个到底是为什么呐?我现在想明白了,就是我们在互联网背景下,技术是模块依赖的,比如我用 Nginx 来开发,Nginx 的模块都是开放的,我可以基于别人的模块做进一步的开发。别人在 不断迭代模块的之后,我可以享受到优化的好处,这就是所谓的“站在巨人的肩膀上”。
这也就是我想讲的:千万不要重复造轮子。如果 Nginx 能解决,或者说任何一个成熟的框架能解决问题的时候,不要再花时间自己做了。
第三点:还有好的架构。
什么叫好的架构?
我是 2012 年 10 月份去的阿里云,做了架构师。ECS 当时是两个月迭代一次版本,我们团队全年通宵了 23 次,花了两年时间,把线上的五万台服务器重构成一个新的架构,大概是一个月就可以做迭代。
好的架构真的很重要。Nginx 就是个好的架构。
好架构,就是你要有预见性。比如 TCP 协议,它在 1995 年的时候就创立出来了,到现在都没有大改,依旧服务了各种各样的场景。Nginx 也是一样,从 2014 年推出来后基本没多大变化。但它的模块化,是纵向的划分的架构,最底层是事件驱动,基于 EP 的事件驱动,再上面是 HTTP 框架,再上面是 HTTP 模块,再上面是 OpenResty 的 lua。再看横向的划分,比如说我们要做一些 WAF 防火墙的限制,又比如基于 IP 做白名单、黑名单,那它的模块划分很清楚,还比如其他的模块,像 linit 或者 Request 只负责限速,不会自己去获取到用户的真实 IP 再去限速等等。
所以,我说 Nginx 是一个好的架构,而我们学习 Nginx,也可以获取到非常好的架构思维。
天津市犀思科技有限公司是专业从事web应用定制开发的一家公司,主营业务包括定制功能型网站建设开发、微信小程序开发、微信公众号开发、APP定制开发、天津企业微信开发、ERP、CRM、OA等企业应用场景信息化解决方案等服务,致力于成为中国领先的IT服务及行业解决方案的提供商。