我可以用 Node.js 替换 Apache 吗?
Posted
技术标签:
【中文标题】我可以用 Node.js 替换 Apache 吗?【英文标题】:Can I Replace Apache with Node.js? 【发布时间】:2011-07-17 19:01:28 【问题描述】:我有一个在 CentOS 上运行的网站,使用通常的嫌疑人(Apache、mysql 和 php)。自从这个网站最初推出以来,它已经发展了很多,现在我想用它做一些更有趣的事情——即实时通知。根据我的阅读,Apache 处理得不好。我想知道我是否可以只用 Node.js 替换 Apache(所以不是“LAMP”而是“LNMP”)。
我尝试在网上搜索解决方案,但没有找到。如果我正确地解释了我所读到的内容,似乎大多数人都在说 Node.js 可以同时替换 Apache 和 PHP。不过,我有很多现有的 PHP 代码,所以我更愿意保留它。
如果还不是很明显,我很困惑,可以使用一些启发。非常感谢!
【问题讨论】:
猿服务器可能值得研究。 【参考方案1】:如果你准备用 javascript 重写你的 PHP,那么是的,Node.js 可以替代你的 Apache。
如果您在服务器和客户端之间放置一个以反向代理模式运行的 Apache 或 nginx 实例,您可以在 Node.js 上处理 JavaScript 中的一些请求,以及在 Apache 托管的 PHP 中处理一些请求,直到您可以完全替换你所有的 PHP 和 JavaScript 代码。这可能是一个快乐的媒介:你的 WebSockets 在 Node.js 中工作吗,在 Apache + PHP 中更普通的工作。
【讨论】:
感谢您的快速响应! nginx 是否比 Apache 优越得多?我已经有一个 .htaccess 文件,保留它会很好。另外,我读到让 Apache 将请求转发到 Node.js 是没有意义的,因为那样你就失去了 Node.js 的优势,因为你还在使用 Apache。让 Node.js 在端口 80 上侦听名为“nodejs”的子文件夹中的任何内容,然后 Node.js 可以将不在该子文件夹中的任何内容传递给 Apache 会更好吗? Apache 可以侦听其他端口,例如 8000。 @Rick,我几乎要删除自己的答案了; Node can usesendfile
,并且有一个 module for FastCGI 支持,它也可以使通过 Node 提供 PHP 服务变得容易。至于 nginx 与 Apache,我一直很喜欢异步风格的服务器而不是线程或多进程服务器 :) 但我发现 Apache 文档更容易找到和阅读。除非您需要扩展到惊人的数字,否则我将其称为个人偏好。 :)
@Rick 在了解它是什么以及它是如何工作的之前,您不想将生产的东西迁移到 Node。 Node 并不是让事情变得更快的灵丹妙药。事件驱动/异步范式并不新鲜,它没有被用于所有事情是有原因的。 en.wikipedia.org/wiki/Asynchronous_I/O
@Rick 与其认为应该替换现有的东西,不如另外运行 Node。不要认为有任何理由通过节点(?)传递所有内容,这听起来是个坏主意。只需在另一个端口或主机上运行节点。
@Øyvind Skaar 我同意。此外,对于大多数网站(例如 Wordpress),真正的瓶颈是数据库而不是文件访问。而且,如果文件访问是一个问题,那么缓存始终是一个可行的解决方案。无论如何,对于真正的性能,PHP-APC 是一个该死的廉价技巧。【参考方案2】:
如今它的 LAMP 与 MEAN。如需直接比较,请参阅http://tamas.io/what-is-the-mean-stack。
当然,M、E 和 A 会有些变化。例如,较新的koa 可能会取代 (E)xpress。
但是,仅仅用 Node.js 替换 Apache 可能不是实现 Web 堆栈现代化的正确方法。
【讨论】:
【参考方案3】:Node.js 可能比 Apache 更快,这要归功于它的事件/非阻塞架构,但您可能无法找到替代某些 Apache 功能的模块/库。
Node.js 本身是一个轻量级的低级框架,它使您能够相对快速地构建服务器端的东西和 Web 应用程序的实时部分,但是 Apache 提供了更广泛的配置选项和“经典”的面向 Web 服务器的功能.
我想说,除非你想用基于 node.js 的 web 应用程序框架(如 express.js)替换 PHP,否则你应该继续使用 Apache(或者如果你有性能问题,可以考虑迁移到 Nginx)。
【讨论】:
【参考方案4】:我相信 Node.js 是 Web 服务的未来,但如果你有很多现有的 PHP 代码,Apache/MySQL 是你最好的选择。 Apache 可以配置为代理对 Node.js 的请求,或者 Node.js 可以代理对 Apache 的请求,但我相信在这两种情况下都会损失一些性能,尤其是在第一种情况下。不过,如果您运营的网站流量不高,这没什么大不了的。
我刚刚注册到 ***,还不能评论接受的答案,但今天我创建了一个简单的 Node.js 脚本,它实际上使用 sendfile() 通过 HTTP 协议提供文件。 (接受的答案链接到的现有示例仅使用裸TCP协议发送文件,我找不到HTTP的示例,所以我自己写了。)
所以我想有人可能会觉得这很有用。通过 sendfile() 操作系统调用提供文件不一定比通过“用户空间”复制数据更快,但它最终会减少 CPU 和 RAM 的使用,因此能够处理比经典方式更多的连接。
链接:https://gist.github.com/1350901
【讨论】:
虽然非常正确,但我仍然相信,如果您将 apache 剥离并按照您的描述进行操作,它会运行得与 node.js 一样快,如果不是,它会比 node.js 更快。 Apache 做了很多人们看不到或真正理解的事情,如果您将这些 Web 服务器的所有功能添加到 node.js,它的运行速度会和它们一样慢。简单的例子可能是,mynode.js/getfile?file=/etc/shadow【参考方案5】:Previous SO 帖子准确地描述了我在说什么(php + socket.io + node)
我认为您可以使用 socket.io 在 somehost:8000 上建立一个节点服务器,然后将 socket.io 客户端代码添加到标签中,并且只需最少的工作就可以让您现有的应用程序与 socket.io(实时宝贝)一起摇摆而无需大量工作工作。
虽然 node 可以是您唯一的后端服务器,但请记住 node 喜欢不辜负它的名字并成为一个 node。不久前,我查看了 Ryan Dahl 给 PHP 用户组的演讲,他提到了与几个节点进程工作和相互交谈的愿景有关的名称节点。
【讨论】:
以上是关于我可以用 Node.js 替换 Apache 吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以通过 node.js 中的 socket.io 将文件上传到服务器吗?