Apache + mod_wsgi / Lighttpd + wsgi - 性能差异会很明显吗?
我刚开始学习用Python开发,正在整理一些信息,以便在其他两个开放性问题中做出明智的选择。(这不是重复的问题。)
我不是在使用框架,而是从零开始用gevent库构建一个网页应用。关于前端网页服务器,我似乎有三个选择:nginx、apache和lighttpd。
根据我读到的所有资料,nginx的mod_wsgi似乎不太适合。
那我就剩下两个选择了——lighttpd和Apache。在高负载的情况下,它们的性能和内存消耗会有很大差别吗?我觉得Apache即使不使用prefork模式也比较占内存,但我不太清楚lighttpd对Python应用的适用性。
使用lighttpd相比于apache有什么注意事项或好处吗?我真的很想听听你们能给我提供的所有信息!
2 个回答
你提到的gevent很重要。这是不是意味着你特别想实现一个长轮询的应用?如果是这样,而且这个功能占据了应用的大部分,那么你需要把gevent服务器放在一个前端的网络服务器后面,这个前端服务器要用异步技术来实现,而不是用进程或线程模型。Lighttpd就是一个异步服务器,适合这个需求,而Apache就不行。所以,Apache作为长轮询应用的前端代理并不好。如果这是你的标准,我其实建议你用nginx,而不是Lighttpd。
现在,如果你不是在做长轮询或者其他需要高并发的长时间请求的事情,那么使用gevent可能不会给你带来太多好处,特别是如果你打算在上面使用WSGI层的话。对于WSGI应用来说,不同服务器之间的性能差异其实很小,因为你的应用不太可能是那些基准测试中使用的“你好,世界”程序。真正的瓶颈往往不是服务器,而是你的应用代码、数据库、外部调用、缺乏缓存等等。因此,你应该先使用你觉得最简单的WSGI托管方式,当你真正搞清楚你的应用需要什么样的托管时,再根据实际的应用测试来切换到更合适的方案。
总的来说,你只是浪费时间在寻找理论上最好的服务器上进行过早的优化,而实际上你应该先专注于你的应用。之后,你还应该关注应用监控工具,因为没有监控工具,你怎么能判断一个托管方案是否比另一个更好呢?
Apache...
Apache是目前使用最广泛的网页服务器,这其实是件好事。因为有很多关于如何使用它的信息,而且当出现问题时,有很多人知道怎么解决。不过,Apache的默认设置比较慢,需要进行很多调整,并且需要比Lighttpd更强大的服务器。在你的情况下,使用Apache和Python会更容易上手。市面上有很多AMP(Apache、MySQL、PHP)包,还有许多关于如何设置Python和让你的应用正常工作的指南。只要在网上搜索一下,就能找到很多有用的信息。在高负载情况下,Lighttpd的表现会超过Apache,但Apache就像一列火车,稳稳地运行着。
优点
- 用户基础广泛
- 支持几乎所有功能
- 有很多插件可用
缺点
- 默认设置比较慢
- 需要进行性能调整
- 占用内存较多(在64MB的虚拟专用服务器上几乎无法运行)
Lighttpd...
Lighttpd是新兴的选择。它速度快、性能强大,使用的内存也非常少。默认情况下,Lighttpd的表现远超Apache。不过,了解Lighttpd的人相对较少,所以让它正常工作会比较困难。虽然它是第二大使用的网页服务器,但社区支持没有Apache那么强。如果你在StackOverflow上搜索,会发现有些人一直在问如何让他们的Python应用正常工作,但没有人能帮他们。在高负载情况下,如果配置得当,Lighttpd的性能会超过Apache(我之前做过一些测试,可能会看到每秒请求量提高200-300%)。
优点
- 默认设置就很快
- 占用内存非常少
缺点
- 支持没有Apache多
- 有时候就是不工作
Nginx
如果你在运行一个静态网站,那么你应该使用Nginx。你说Nginx的mod_wsgi不适合是对的。
总结
这两种网页服务器各有优缺点,设计上可以互相替代。如果这两种服务器都经过合理配置,并且硬件足够强大,那么使用哪一个其实没有太大区别。你可以尝试一下,看看哪个网页服务器更符合你的需求。就我个人而言,我会推荐Lighttpd。我觉得它更容易配置,而且运行得很好。
另外,你也可以看看Cherokee Web Server。设置起来非常简单,性能也不错。你也可以在Server Fault上问问这个问题。