同一台服务器上的Apache和Node.js

我想使用节点,因为它是快速的,使用我在客户端使用的相同的语言,并且根据定义它是非阻塞的。 但是我雇人写文件处理程序(保存,编辑,重命名,下载,上传文​​件等)的人,他想用apache。 所以,我必须:

  1. 说服他使用节点(他放弃了一点点)

  2. 找出如何上传,下载,重命名,保存等节点或文件中的文件

  3. 我必须在同一台服务器上安装Apache和节点。

哪个是最有利的情况,我该如何执行?

好问题!

有很多网站和免费的networking应用程序在PHP中运行,许多人使用它,所以你可以混搭一些很容易,而且,它是一个简单的服务静态内容的方式。 节点是快速,强大,优雅,性能与V8的原始力量和平坦的堆栈没有内置的依赖性的工具。

我也想要Apache的轻松/灵活性,但Node.JS的咕噜声和优雅, 为什么我不能同时拥有

幸运的是,使用Apache httpd.conf的ProxyPass指令,将特定URL上的所有请求pipe理到Node.JS应用程序并不难。

 ProxyPass /node http://localhost:8000/ 

此外,请确保以下行不被注释掉,以便您得到正确的代理和子模块来重新路由http请求:

 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so 

然后在端口8000上运行您的Node应用程序!

 var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Apache!\n'); }).listen(8000, '127.0.0.1'); 

然后你可以使用你的url上的/node/ path访问所有的Node.JS逻辑,剩下的网站可以留给Apache来托pipe你现有的PHP页面:

在这里输入图像描述

现在唯一剩下的就是说服你的托pipe公司让你用这个configuration运行!

这个问题属于更多的服务器故障,但FWIW我会说在Node.js面前运行Apache在大多数情况下不是一个好方法。

Apache的ProxyPass对很多事情来说都很棒(比如将基于Tomcat的服务作为网站的一部分),如果你的Node.js应用只是做一个特定的小angular色,或者是一个内部工具,只有less数用户那么只是使用它可能会更容易,所以你可以得到它的工作,继续前进,但这听起来不像这里的情况。

如果你想利用Node.js的性能和规模 – 特别是如果你想使用一些涉及像web sockets这样的持久连接的东西,那么最好是同时运行Apache和你的Node。其他端口上的js(例如,本地主机上的Apache:8080,本地主机上的Node.js:3000),然后在前面运行nginx,Varnish或HA代理等,并以这种方式路由stream量。

有了像varnish或nginx的东西,你可以路由基于path和/或主机的stream量。 他们都使用less得多的系统资源,而且使用Apache来做同样的事情更具可扩展性。

沿apache2(v2.4.xx) server运行node server说明:

为了将特定URL上的所有请求pipe理到Node.JS应用程序,请在/etc/apache2/conf-available目录中创buildCUSTOM.conf文件,并将以下行添加到创build的文件中:

 ProxyPass /node http://localhost:8000/ 

将8000更改为node server的首选端口号。
使用以下命令启用自定义configuration:

 $> sudo a2enconf CUSTOM 

CUSTOM是你新创build的没有扩展名的文件名,然后用命令启用proxy_http

 $> sudo a2enmod proxy_http 

它应该启用proxyproxy_http模块。 您可以检查模块是否启用:

 $> sudo a2query -m MODULE_NAME 

启用configuration和模块后,您将需要重新启动apache服务器:

 $> sudo service apache2 restart 

现在你可以执行节点服务器了。 所有对URL/node请求都将由节点服务器处理。

在一台服务器上运行Node和Apache是​​微不足道的,因为它们不会发生冲突。 NodeJS只是执行JavaScript服务器端的一种方式。 真正的困境来自于从外部访问Node和Apache。 正如我所看到的,你有两个select:

  1. 设置Apache将所有匹配的请求代理到NodeJS,NodeJS将执行file upload以及节点中的其他任何操作。

  2. 在不同的IP:端口组合上有Apache和Node(如果你的服务器有两个IP,那么你可以绑定到你的节点侦听器,另一个绑定到Apache)。

我也开始怀疑这可能不是你真正想要的。 如果您的最终目标是您在Nodejs中编写您的应用程序逻辑,并将一些“文件处理”部分转交给承包商,那么它就是语言select,而不是Web服务器。

您可以使用不同的方法,例如使用nodejs编写反向代理服务器来代理apache和所有其他nodejs应用程序。

你需要使apache运行在不同于80端口的端口上。例如:端口8080

那么你可以用nodejs写一个反向代理脚本为:

 var proxy = require('redbird')({port: 80, xfwd: false); proxy.register("mydomain.me/blog", "http://mydomain.me:8080/blog"); proxy.register("mydomain.me", "http://mydomain.me:3000"); 

下面的文章描述了制作这个的整个过程。

http://wathmal.me/blog/run-apache-with-node-js-reverse-proxy/

我正在寻找相同的信息。 最后从@Straseus上面的答案链接find答案

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/

这里是最终的解决scheme,运行端口80上的Apache网站,端口8080上的节点js服务,并使用.htaccess的RewriteRule

在Apache网站的DocumentRoot中,添加以下内容:

 Options +FollowSymLinks -MultiViews <IfModule mod_rewrite.c> RewriteEngine on # Simple URL redirect: RewriteRule ^test.html$ http://arguments.callee.info:8000/test/ [P] # More complicated (the user sees only "benchmark.html" in their address bar) RewriteRule ^benchmark.html$ http://arguments.callee.info:8000/node?action=benchmark [P] # Redirect a whole subdirectory: RewriteRule ^node/(.*) http://arguments.callee.info:8000/$1 [P] 

对于目录级redirect,上面的链接build议(。+)规则,它需要在“node /”之后的一个或多个字符。 我不得不把它转换为(。*),这是零或更多我的东西的工作。

非常感谢链接@Straseus

我假设你正在制作一个Web应用程序,因为你指的是Apache和Node。 快速的回答 – 是否有可能 – 是的。 是否推荐 – 没有。 节点捆绑它自己的networking服务器和大多数网站运行在端口80.我也假设目前没有支持Nodejs的Apache插件,我不知道是否创build一个虚拟主机是最好的方式来实现这一点。 这些问题应该由像Joyent的好人那样维护Nodej的开发者来回答。

而不是港口,最好是评估节点的技术堆栈是完全不同于大多数人,这就是为什么我喜欢它,但也涉及到一些妥协,你应该提前知道。

您的示例看起来类似于CMS或共享Web应用程序,并且有数百个现成的应用程序可以在Apache上正常运行。 即使你不喜欢任何现成的解决scheme,你也可以使用PHP / Java / Python编写一个web应用程序,或者将它与几个现成的应用程序混合起来,它们都是在一个Apache实例后面devise和支持的。

现在是停下来思考我刚刚说的话的时候了。

现在您已经准备好决定要使用哪种技术。 如果你的网站永远不会使用成千上万个需要Apache的现成应用程序中的任何一个,那么去Node,否则你必须首先消除我之前说过的假设。

最后,您select的技术层比任何单个组件都重要。

我完全同意@Straseus说,使用node.js文件系统api来处理上传和下载是比较简单的,但是从长远来看,更多地考虑从网站上得到的东西,然后select你的技术堆栈。

学习Node的框架比学习其他框架容易,但它不是万能的。 稍加努力(本身可能是一个值得的努力),你也可以学习任何其他的框架。 我们都相互学习,如果你是一个小团队,比起单独工作,你的后端技术能力也将得到更快发展,你会更有成效。 所以,不要这么便宜地打折你团队其他成员的技能。

这篇文章已经有一年多的时间了,很可能你已经决定了,但是我希望我的咆哮会帮助正在经历类似决定的下一个人。

谢谢阅读。

您可以同时安装在同一台服务器上,但需要configuration为使用不同的端口。 两者都不能使用80端口,至less不是那么容易。

请记住,Apache是​​一个服务器,nodeJS是一种语言。

在问这个问题之前,您是否尝试过使用Googlesearch?

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/

我需要在我的服务器上运行node.js脚本?

http://www.readwriteweb.com/hack/2010/12/how-to-run-apache-and-nodejs.php

http://eastmond.org/blog/?p=45