我可以用Node.js替换Apache吗?


151

我有一个使用常见嫌疑犯(Apache,MySQL和PHP)在CentOS上运行的网站。自该网站最初发布以来,它已经发展了很多,现在我想用它做一些更奇特的事情-即实时通知。根据我的阅读,Apache处理得很差。我想知道是否可以仅用Node.js替换Apache(所以不是“ LAMP ”,而是“ LNMP”)。

我尝试过在线搜索解决方案,但没有找到解决方案。如果我正确地解释了我已经读过的东西,似乎大多数人都在说Node.js可以同时取代Apache和PHP。不过,我有很多现有的PHP代码,因此我希望保留它。

如果还不很清楚,我会很困惑,可以使用一些启示。非常感谢!


猿服务器可能值得研究。
TryHarder 2014年

Answers:


86

如果您准备使用JavaScript重新编写PHP,那么可以,Node.js可以替换您的Apache。

如果在服务器和客户端之间放置以反向代理模式运行的Apache或NGINX实例,则可以处理Node.js上的JavaScript中的某些请求以及Apache托管的PHP中的某些请求,直到可以完全替换所有PHP。使用JavaScript代码。这可能是一个快乐的媒介:您的WebSockets是否可以在Node.js中工作,而平常的工作是否可以在Apache + PHP中工作。


1
我感谢您的快速回复!Nginx是否远胜于Apache?我已经有一个.htaccess文件,保留它会很好。另外,我已经读过,让Apache将请求转发到Node.js是没有意义的,因为那样一来,由于您仍在使用Apache,那么您就失去了Node.js的优势。让Node.js在端口80上侦听名为“ nodejs”的子文件夹中的任何内容,然后由Node.js将该子文件夹中的任何内容传递给Apache,会更好吗?Apache可以在其他端口(例如8000)上侦听。–
Rick

21
@Rick,我几乎要删除自己的答案;Node可以使用sendfile,并且有一个支持FastCGI模块,模块也可以很容易地通过Node服务您的PHP。至于nginx与Apache,我一直是异步样式服务器而不是线程或多进程服务器的傻瓜:),但是我发现Apache文档更易于查找和阅读。除非您需要扩展到惊人的数字,否则我会称之为个人喜好。:)
sarnold 2011年

3
@Rick您不希望在了解生产内容和工作原理之前将其迁移到Node。Node并不是使产品变得更快的神奇药丸。事件驱动/异步范式并不是什么新鲜事物,并且有一定的原因为什么它不能用于所有事物。en.wikipedia.org/wiki/Asynchronous_I/O
岛之风Skaar

1
@Rick而不是认为应该替换现有的东西,也许最好另外运行Node。不要认为没有任何理由让所有内容都通过节点(?),这听起来像是个坏主意。只需在另一个端口或主机上运行节点。
岛之风Skaar

2
@ØyvindSkaar,我同意。此外,对于大多数网站(例如Wordpress),真正的瓶颈是数据库而不是文件访问权限。而且,如果文件访问有问题,那么缓存始终是可行的解决方案。无论如何,对于真正的性能,PHP-APC是一个该死的廉价把戏。
magallanes 2012年

26

由于具有事件/非阻塞架构,Node.js可能比Apache更快,但是您可能难以找到替代某些Apache功能的模块/库。

Node.js本身是一个轻量级的低级框架,它使您可以相对快速地构建Web应用程序的服务器端内容和实时部分,但是Apache提供了更广泛的配置选项和面向“经典” Web服务器的功能。

我要说的是,除非您想用基于node.js的Web应用程序框架(例如express.js)替换PHP,否则您应该留在Apache上(或者,如果遇到性能问题,请考虑迁移到Nginx)。


11

我相信Node.js是Web服务的未来,但是如果您有很多现有的PHP代码,那么Apache / MySQL是您的最佳选择。可以将Apache配置为代理对Node.js的请求,也可以将Node.js代理对Apache的请求,但是我认为这两种情况都会降低性能,尤其是在第一种情况下。不过,如果您没有运行一个流量很高的网站,那也没什么大不了的。

我刚刚注册了stackoverflow,现在还无法评论已接受的答案,但是今天我创建了一个简单的Node.js脚本,该脚本实际上使用sendfile()通过HTTP协议提供文件。(接受的答案链接到的现有示例仅使用裸TCP协议发送文件,而我找不到HTTP的示例,因此我自己编写了该示例。)

所以我认为有人可能会觉得有用。通过sendfile()操作系统调用提供文件的速度不一定比通过“用户土地”复制数据时更快,但是最终却减少了对CPU和RAM的利用,因此与传统方式相比,它能够处理更多的连接。

链接:https//gist.github.com/1350901


2
尽管非常正确,但我仍然相信,如果您简化apache的操作就可以按照您的描述进行操作,那么它的运行速度将比node.js更快,甚至可以更快。Apache做了很多人们看不到或真正理解的事情,如果将这些Web服务器的所有功能添加到node.js中,它的运行速度将与它们一样慢。作为一个简单的示例,mynode.js / getfile?file = / etc / shadow
Rahly

8

之前的 SO帖子准确描述了我在说什么(php + socket.io +节点)

我认为您可以使用socket.io在somehost:8000上建立节点服务器,并将socket.io客户端代码拍打成标签,并且只需最少的工作就可以使您现有的应用与socket.io(实时宝贝)一起摇摇欲坠。

虽然节点可以是您唯一的后端服务器,但请记住该节点喜欢辜负它的名称并成为一个节点。不久前,我查看了Ryan Dahl给PHP用户小组的一次演讲,他提到了名称节点,该名称节点涉及到多个节点进程在工作并相互交谈的愿景。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.