任何答案的核心都应该是“这取决于您要做什么”。例如,您可能正在尝试...
- 在聊天室中支持 10k 个并发客户端
- 每月提供 100 万个静态页面
- 为 3k 用户提供类似 CMS 的功能
- 提供一个简单的博客类型网站,供小型企业使用
- 支持写入繁重的系统,例如拥有数百万用户的游戏
- 建立一个消费者银行网站
- 等等..
人们普遍认为应该选择正确的技术来解决手头的问题 - 任何关于将一种技术与另一种技术相结合的优点的讨论,无论它们是否固有地处理事件 IO,都将是在任何决策过程中的价值有限。
另一个对您的技术堆栈决策具有高度影响力的因素是可用于实现项目目标的技能和经验。
不过……
在使用了您所指的所有技术之后,我将为您提供一些我们认为已经解决的问题以及为什么选择某些配置的示例:
PHP + Nginx
是的,PHP 是阻塞的,但这对 Facebook 和其他使用它作为其核心 Web 应用程序语言的人来说并没有任何障碍。在更传统的 LAMP 堆栈中,A 是 Apache,您有一个众所周知且长期存在的问题,该问题可能在高流量条件下出现,您可能在入站 Apache 的 Web 请求和与数据库。如果您希望为超过 1000 个并发客户端提供服务,并且您的数据库有 1000 个连接限制,我预计您会遇到困难。
这种资源匮乏为用户在过载条件下创造了一种破坏体验。
在这种情况下,Nginx 可以为您带来更多收益,因为事件 IO 将 Web 请求和出站 PHP 数据库连接之间的关联解耦。有很多文献可以证实这一点。请记住,这不是魔术——这取决于你如何配置 NGinx 和 PHP——你可以通过启用默认设置轻松上吊。
假设通过配置进行了思考,NGinx 的事件 IO 具有缓冲请求的净效果,以数据库可以处理的速率将它们发送到 PHP。
PHP 应用广泛使用 Memcached 等缓存,以进一步支持读取繁重的系统中的高容量。
Node.js(纯 HTTP)
我们选择 Node.js 作为其支持的生产解决方案的原因是
- 它不是关键任务(Node.js 是新的,因此您不希望在其上运行您的银行系统)
- 我们想要轻量级的东西
- 我们想要学习和实验 - 通常许多业务系统都不允许此标准
Node 的新颖性和它所涉及的 IO 编程概念的微妙之处意味着我们多次破坏事物,并且与我们坚持使用 PHP 相比,我们花费了更长的时间来获得最终解决方案。
Web 应用程序的框架还处于起步阶段
- Express.js
- 套接字流
- Backbone.js
- 也许是其他人……
考虑到他们都很年轻,他们的工作仍在进行中。根据您要为项目实现的目标,它们可能会很好地为您服务,或者在您学习它们时会浪费时间和精力。
例如,在 Express.js 中,处理 HTTP 缓存标头、内容的 GZIPing 等简单的事情并不完全是标准的,所以如果这类事情是必不可少的,你将不得不开始制定定制的解决方案或寻找其他地方。
与 NGinx 或 Apache 不同,Node.js 安装或使用它构建的应用程序没有任何本机可以确保它在运行级别启动。这意味着您必须找出一些解决方案来管理应用程序在重新启动时自动启动和其他恢复,使用 Node.js 之外的其他东西。 (我们使用Monit)
Node.js + NGinx
你敢打赌,为什么不呢.. NGinx 更加成熟,所以我们需要在将 SSL 连接移植到 Node.js 之前终止它们,这就是我们所做的。额外的好处是现在 NGinx 可以通过 GZIP 内容。