说到Web服务器,也许你第一时间想到的是Apache,也许你会想到Nginx。尽管Apache仍然是Web服务器的领导者,但全球排名前1000的Web服务器中有22.4%使用NGINX。这些服务器包括Facebook、Hulu和WordPress等网络巨头使用的服务器。在今年刚刚结束的O'ReillyVelocityChina2011大会上,小编有幸采访到了目前在淘宝工作的王小哲。在《淘宝网Nginx定制开发实战》的主题演讲中,王晓哲、朱兆元与大家分享了淘宝如何通过定制开发Nginx服务器核心,开发有效模块,登上亚洲顶级电商网站的经验。王小哲:华明轻舞一涛-数据平台与产品部技术专家。就职于数据平台部-量子恒道集团,负责量子统计整体技术架构建设。对海量数据处理、高性能高可用Web服务相关技术有浓厚兴趣。张浩:你是什么时候开始接触Nginx的?您是否尝试过Apache或IIS等其他服务器?吴清:2008年开始接触Nginx,当时在雅虎中国做开放平台相关开发。我对Web服务器的大并发服务能力很感兴趣。在研究比较了Apache2Event模型、lighttpd和Nginx后,选择了性能更优的Nginx进行开发使用。除了IIS,基本接触过Linux平台上的生产级开源web服务器,比如apache/lighttpd/Nginx/cherokee等。张浩:你最初接触Nginx时用的是什么语言?在您的分享中,您非常看好Lua语言。你是什??么时候开始接触Lua语言的?清武:最初是在应用端使用PHP,但是在开放平台的实际业务中对PHP的并发能力不满意,一直在思考如何在这方面提升业务端的性能。2009年入驻淘宝后,量子统计也有类似诉求。经过多方比较,我选择了将Lua解释器嵌入到Nginx中的方案,从此开始接触Lua语言。张浩:其实很多开发者对Lua语言的理解都来自于经典游戏《愤怒的小鸟》。作为服务端工作的人,您认为Lua语言作为Web服务器中的胶水语言与移动应用程序开发有什么区别?既然我们对Lua语言的理解是从?开始的,那么大家有没有进行过相关的开发呢?QingWu:在基本结构上,移动应用中以UI事件为主体的事件循环与Web服务器中以I/O事件为主体的事件循环惊人地相似。有些是用户动作产生的,而后者处理的事件多是由外设(主要是网卡)产生的。移动应用中使用的Lua开发框架通常是标准的“填空”模式,即开发者应该站在系统事件循环的角度,将业务逻辑明确划分为多个块,使用Lua脚本来编写几个回调函数分别实现每个块,然后事件循环在适当的时候调用它们来完成相关操作。ngx_lua通过协程封装I/O操作后,开发者可以从业务逻辑的角度编写具有自然线性逻辑的代码,ngx_lua底层会隐式转换为多块回调运行。另外,我觉得两者区别不大。移动平台硬件性能较差,Web服务器并发处理请求较多。两者都要求开发人员对运行性能和资源使用保持高度敏感。虽然我个人使用的是Lua语言,但是在移动应用开发方面,我只是在iOS上尝试过一些Lua开发框架,并没有真正发布过应用。张浩:与PHP相比,Lua语言在整个架构上有哪些优势?换句话说,是什么吸引了您使用Lua语言?Qingwu:最吸引我的是Lua的紧凑、速度和内置的协程支持。前两点是实现高并发服务的基础,最后一点保证了我们可以将回调式的异步操作转化为隐式的异步操作。运维,在保证并发服务能力的同时,大大降低了业务逻辑的实现成本。张浩:现在Nginx发展非常迅速。据统计,全球1000台服务器中有22.4%使用了Nginx。这些服务器包括Facebook、Hulu和WordPress等网络巨头使用的服务器。你认为Nginx与Apache相比的优势是什么?比如在承压和开发维护方面?清晰:在Apache漫长的发展过程中,开发团队和社区产生了相当多的扩展模块,这是Apache流行的一个重要原因。可惜的是,它们现在成了Apache转型的最大障碍。可以说它们是成功和失败的模块。由于Web服务器的扩展模块总是深深嵌入请求处理过程的各个层次,一旦确定了服务模型,为了保证扩展模块的兼容性,不能进行较大的修改。Apache一开始就选择了多进程服务模型(Prefork),得益于内部处理流程设计清晰,在该模型下开发模块非常容易;随着互联网的飞速发展,Apache开发团队也意识到多进程模型的并发服务瓶颈并开始改进,相继开发了Worker(线程)服务模型和Event(Leader-Follower)服务模型。但无论是哪种模式,在设计上都最大程度的兼容了原有的扩展模块,并保留了阻塞式的请求处理流程,相当于给并发服务能力设置了一个天花板。与Apache相比,Nginx没有这些历史包袱,有机会从头开始做正确的事。它借鉴了Apache良好的内部流程设计,同时摒弃了阻碍性能进一步提升的阻塞式请求处理方案。丰富的高性能程序经验造就了Nginx这颗冉冉升起的新星。Nginx在内核上相比Apache更加紧凑,单机并发处理能力也强很多。但缺点是难以开发复杂的扩展模块和深度定制的代码。这就是选择非阻塞I/O多路复用服务模型的缺点。我们希望未来通过加强ngx_lua对Nginx核心的控制能力,彻底解决Nginx扩展困难的问题。张昊:本期Velocity的主旨之一就是为用户提供最好的体验,那么作为一个架构师,在架构设计的时候应该注意哪些细节呢?QingWu:作为技术架构师,速度和稳定性是架构设计追求的两个终极目标,也是为用户创造舒适体验的基本前提。设计是一个取舍的过程。没有完美的设计,只有最合适的设计。在设计过程中,一般要注意四个方面:尽量减少数据路径上不必要的链接,多一个链接就多一分错误,可能既关注运行效率,也关注开发效率。根据具体场景,我们应该更多地关注它,而不是掩盖系统异常。依赖系统故障时一定要考虑自动处理机制。尽量以监控界面的形式使用系统组件的内部运行状态。把它暴露出来,让运维工作白盒化,把握以上几点,基本设计出符合业务需求的系统架构。张浩:参加工作以来的感受是什么?对于基层运维开发人员的职业规划,您有什么建议?清舞:“专注”才是硬道理。人的总精力是有限的,要投入的方向多,那么分散到各个方向的精力就会少,更难有成效。要想在技术领域有所作为,就要善于在日常工作中发现问题和思考解决方案,及时总结经验,多花时间学习基础理论,在熟悉了基础之后你所在领域的情况,你可以选择一个方向来关注。精力用于研究和积累,只要你投入足够的时间,你永远可以独一无二。
