Nginx 第三方模块-漫谈缘起
2012-03-30 10:10 轩脉刃 阅读(9505) 评论(1) 编辑 收藏 举报本文的部分内容和图片摘录于http://tengine.taobao.org/download/nginx@taobao.pdf
为什么要使用nginx模块?我个人觉得taobao这个ppt来做说明是最好不过了
从web服务器结构开始说起:
第一个模式(LAMP):
这个结构中,Apache的PHP模块将所有动态网页都使用php解析,所有逻辑结构都放在php中进行处理。
这个结构也是现在最多web网站的架构LAMP(Linux+Apache+PHP+Mysql)
Apache的强劲的市场占有率(12月全球市场份额报告)也说明了这个结构的好处是易于理解,开发上手快。存在就是理由,Apache的各种功能模块已经实现很多了,基本上能想到的功能都已经实现了。
但是这个结构有其致命的弱点:
1 高并发下性能表现不佳
2 页面主体内容(比如)图片等静态资源访问浪费带宽(当然这个后来大公司都改用CDN来处理)
3 存在慢连接攻击(syn flood)风险
模式演变:
关于Apache和Nginx的优缺点的讨论请看这里
Apache2.4刚刚发布,宣称it’s “as fast, and even faster than Nginx”.
这里有一个blog对进行了测试实验。
第二种模式(LNMP):
Nginx是个轻量级的HTTP server,必须借助第三方的FastCGI处理器才可以对PHP进行解析。现在使用最多的就是nginx+php-fpm+php这个模式了。
这里Apache被nginx取代,随之带来的解决优势是:
1 提高并发服务能力
2 可以抵御慢连接攻击
相对于上一个模型,还有其他的优点:
3 静态内容(css,js,pic)等放到CDN上,避免了带宽浪费
4 php对于这些大数据量的数据的处理骤减,减少了php的计算量
但是这个模式最大的问题就在于:Php+php-fpm对于nginx本身性能的限制。
nginx本身的极限测试:单机支持200万连接以上(据说,未验证),而php+php-fpm+nginx大概是3万以上。(参考张宴的博客)。当然这个性能已经远远满足了绝大部分的网站。但对于一些超大规模的项目(比如taobao)就必须考虑高并发的性能问题了。
好了,现在考虑,为什么一定要使用php呢,nginx是否能完成逻辑呢?
模式演变:
从nginx聊开(nginx中文维基):
nginx是轻量级web服务器,它代码不多(v0.5.32才8w多行代码)。Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。
nginx中的模块都是使用C语言编写的。nginx中模块分为Handler,filter和upstream三种类型。
第三种模型:
这种模型彻底放弃了php,逻辑不再依赖php脚本了,直接使用nginx的扩展来完成,这就意味着不需要开启n个fastcgi,不需要使用php进行逻辑操作了,高并发的php的限制也消失了。
初次看到这个模型会产生几个问题:
1 nginx如何高效访问Mysql数据库呢?
使用ngx_drizzle模块(国人编写)
2 要实现越来越多的nginx模块,发现c语言开发效率太低了,是否有其他脚本引擎呢?
使用lua脚本,ngx_lua模块(taobao两位大神的杰作)
在nginx_at_taobao的ppt上说taobao在2010年已经在开发大量的nginx模块了,并且在2011年推出了自己的web服务器Tengine(可以看做是nginx的super版本)(看来taobao在web服务器方面是非常强啊!!)
这第三种模型是taobao大力推荐和正在使用的:
使用lua脚本(巴西人发明的一种语言,相当高效简易)写nginx扩展
nginx直接连接数据库
将静态资源放到cdn上
保证高并发下的效率的提升
nginx的第三方模块http://wiki.nginx.org/3rdPartyModules
----------------------
作者:yjf512(轩脉刃)
出处:http://www.cnblogs.com/yjf512/
本文版权归yjf512和cnBlog共有,欢迎转载,但未经作者同意必须保留此段声明
实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”
本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。