我想使用Node,因为它是快速的,使用与我在客户端使用的相同的语言,并且根据定义它是非阻塞的。但是我雇来写文件处理程序(保存、编辑、重命名、下载、上传文件等)的那个人,他想用apache。所以,我必须:
说服他使用Node(他在这方面几乎没有让步) 弄清楚如何上传,下载,重命名,保存等文件在节点或 我必须在同一台服务器上安装apache和node。
哪种情况是最有利的,我如何实现它?
我想使用Node,因为它是快速的,使用与我在客户端使用的相同的语言,并且根据定义它是非阻塞的。但是我雇来写文件处理程序(保存、编辑、重命名、下载、上传文件等)的那个人,他想用apache。所以,我必须:
说服他使用Node(他在这方面几乎没有让步) 弄清楚如何上传,下载,重命名,保存等文件在节点或 我必须在同一台服务器上安装apache和node。
哪种情况是最有利的,我如何实现它?
当前回答
这个问题更多地属于服务器故障,但我想说的是,在大多数情况下,在Node.js之前运行Apache并不是一个好方法。
Apache的ProxyPass对于很多事情来说都很棒(比如将基于Tomcat的服务作为站点的一部分公开),如果你的Node.js应用只是在做一个特定的、小的角色,或者是一个内部工具,只可能有有限数量的用户,那么使用它可能会更容易,这样你就可以让它工作并继续前进,但这里听起来不是这样的情况。
如果你想利用使用Node.js获得的性能和规模,特别是如果你想使用一些涉及维护持久连接的东西,比如web套接字,你最好在其他端口上运行Apache和Node.js(例如Apache在localhost上:8080,Node.js在localhost上:3000),然后在前面运行像nginx, Varnish或HA代理之类的东西,并以这种方式路由流量。
使用像varnish或nginx这样的东西,你可以基于路径和/或主机路由流量。它们都使用更少的系统资源,并且比使用Apache做同样的事情更具可伸缩性。
其他回答
我假设你正在制作一个web应用程序,因为你提到了Apache和Node。快速回答——有可能吗?推荐吗? -不推荐。Node捆绑了自己的web服务器,大多数网站都运行在80端口上。我还假设目前没有Apache插件是由Nodejs支持的,我不确定创建一个虚拟主机是否是实现这一点的最佳方式。这些问题应该由维护Nodejs的开发者来回答,就像Joyent的那些好人一样。
而不是端口,更好的方法是评估Node的技术堆栈,它与大多数其他技术栈完全不同,这也是我喜欢它的原因,但它也涉及到一些妥协,您应该事先知道。
您的示例看起来类似于CMS或共享web应用程序,并且有数百个可用的开箱即用应用程序可以在Apache上正常运行。即使你不喜欢任何现成的解决方案,你也可以用PHP / Java / Python编写一个web应用程序,或者将它与几个现成的应用程序混合,它们都被设计和支持在一个Apache实例后运行。
是时候停下来想想我刚才说的话了。
现在您已经准备好决定要使用哪个技术堆栈了。如果你的网站永远不会使用任何一个需要Apache的现成应用程序,那么就选择Node,否则你必须首先消除我前面所说的假设。
最后,您对技术堆栈的选择比任何单个组件都重要得多。
我完全同意@Straseus的观点,使用node.js文件系统api来处理上传和下载是相对简单的,但要多考虑一下从长远来看你想从你的网站得到什么,然后选择你的技术堆栈。
学习Node的框架比学习其他框架更容易,但它不是万能的。只要稍加努力(这本身可能是有价值的努力),您也可以学习任何其他框架。我们都可以互相学习,如果你在一个小团队中工作,你会比独自工作更有效率,你的后端技术技能也会发展得更快。因此,不要轻易低估团队其他成员的技能。
这篇文章大约发布了一年,你可能已经决定了,但我希望我的咆哮能帮助下一个正在经历类似决定的人。
感谢阅读。
这个问题更多地属于服务器故障,但我想说的是,在大多数情况下,在Node.js之前运行Apache并不是一个好方法。
Apache的ProxyPass对于很多事情来说都很棒(比如将基于Tomcat的服务作为站点的一部分公开),如果你的Node.js应用只是在做一个特定的、小的角色,或者是一个内部工具,只可能有有限数量的用户,那么使用它可能会更容易,这样你就可以让它工作并继续前进,但这里听起来不是这样的情况。
如果你想利用使用Node.js获得的性能和规模,特别是如果你想使用一些涉及维护持久连接的东西,比如web套接字,你最好在其他端口上运行Apache和Node.js(例如Apache在localhost上:8080,Node.js在localhost上:3000),然后在前面运行像nginx, Varnish或HA代理之类的东西,并以这种方式路由流量。
使用像varnish或nginx这样的东西,你可以基于路径和/或主机路由流量。它们都使用更少的系统资源,并且比使用Apache做同样的事情更具可伸缩性。
我最近遇到了这种问题,在一个基于PHP的codeigniter项目中,我需要在客户端和服务器之间使用websocket进行通信。
我通过将我的端口(运行的节点应用程序)添加到允许传入的TCP端口和允许传出的TCP端口列表中来解决这个问题。
您可以在服务器的WHM面板中的防火墙配置中找到这些配置。
在apache2(v2.4.xx)服务器上运行节点服务器的说明: 为了将特定URL上的所有请求管道到你的Node.JS应用程序,在/etc/apache2/conf-available目录中创建CUSTOM.conf文件,并在创建的文件中添加以下行:
ProxyPass /node http://localhost:8000/
将“8000”修改为节点服务器的首选端口号。 使用以下命令启用自定义配置:
$> sudo a2enconf CUSTOM
CUSTOM是你新创建的没有扩展名的文件名,然后使用命令启用proxy_http:
$> sudo a2enmod proxy_http
它应该同时启用proxy和proxy_http模块。您可以通过以下命令检查模块是否启用:
$> sudo a2query -m MODULE_NAME
配置和模块启用后,您需要重新启动apache服务器:
$> sudo service apache2 restart
现在可以执行节点服务器了。所有对URL/节点的请求都将由节点服务器处理。
你可以使用不同的方法,比如用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");
下面这篇文章描述了整个制作过程。
运行apache与node js反向代理-使用redbird