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

apache Node.js

神无LEYMandy

2020-03-18

我想使用Node,因为它速度很快,使用的是我在客户端使用的相同语言,并且按照定义它是非阻塞的。但是我雇用来编写程序进行文件处理(保存,编辑,重命名,下载,上传文​​件等)的那个人,他想使用apache。因此,我必须:

  1. 说服他使用Node(在此方面他几乎没有放弃)

  2. 弄清楚如何在节点或节点中上载,下载,重命名,保存等文件

  3. 我必须在同一服务器上安装apache和node。

哪个是最有利的情况,我该如何实施?

第2064篇《同一服务器上的Apache和Node.js》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

6个回答
蛋蛋梅古一 2020.03.18

我假设您正在制作Web应用程序,因为您引用的是Apache和Node。快速解答-是否可以-是。是否推荐-否。Node捆绑了它自己的Web服务器,大多数网站都在端口80上运行。我还假设Nodejs目前不支持Apache插件,并且我不确定创建虚拟主机是否是实现此目的的最佳方法。这些是像Joyent一样的维护Nodejs的开发人员应该回答的问题。

最好不要评估端口,而要评估Node的技术堆栈,因为它与大多数其他堆栈完全不同,这就是我喜欢它的原因,但是它还涉及一些您应该事先意识到的折衷方案。

您的示例看起来类似于CMS或共享Web应用程序,并且有数百种开箱即用的应用程序可以在Apache上很好地运行。即使您不喜欢任何现成的解决方案,也可以用PHP / Java / Python编写一个Webapp或将它与几个现成的应用程序混合使用,它们都经过设计和支持,可在单个Apache实例后运行。

现在是时候停下来想一想我刚才说的话了。

现在您可以决定要使用哪个技术堆栈了。如果您的网站永远不会使用数千个需要Apache的现成应用程序中的任何一个,那么请使用Node,否则您必须首先消除我之前所说的假设。

最后,您选择的技术栈比任何单个组件都重要。

我完全同意@Straseus的观点,即使用node.js文件系统api处理上传和下载相对比较简单,但从长远来看,请更多地考虑您想要从网站中获得什么,然后选择您的技术栈。

学习Node的框架比学习其他框架要容易,但这不是万能的。稍加努力(本身可能是值得的),您也可以学习任何其他框架。我们彼此学习,如果您作为一个小型团队工作,与单独工作相比,您的工作效率会更高。因此,不要那么便宜地降低团队其他成员的技能。

这篇文章大约有一年的历史了,很可能您已经决定了,但是我希望我的助手能帮助下一个正在做出类似决定的人。

谢谢阅读。

西门Eva小胖 2020.03.18


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

为了管在一个特定的URL的所有请求您的Node.js应用程序创建CUSTOM.conf的内部文件/etc/apache2/conf-available目录,并添加以下行创建的文件:

ProxyPass /node http://localhost:8000/

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

$> sudo a2enconf CUSTOM

CUSTOM是您新创建的文件名,不带扩展名,然后proxy_http使用以下命令启用

$> sudo a2enmod proxy_http

它应该同时启用proxyproxy_http模块。您可以使用以下方法检查模块是否已启用:

$> sudo a2query -m MODULE_NAME

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

$> sudo service apache2 restart

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

村村LEY 2020.03.18

我最近遇到了一个类似的问题,我需要在基于PHP的codeigniter项目中使用websocket在客户端和服务器之间进行通信。

我通过将端口(正在运行的节点应用)添加到Allow incoming TCP portsAllow outgoing TCP ports列表中解决了此问题

您可以Firewall Configurations在服务器的WHM面板中找到这些配置

凯斯丁达蒙 2020.03.18

在一台服务器上运行Node和Apache很简单,因为它们不会冲突。NodeJS只是执行JavaScript服务器端的一种方式。真正的困境来自外部访问Node和Apache。在我看来,您有两种选择:

  1. 设置Apache以将所有匹配的请求代理到NodeJS,这将执行文件上传以及节点中的其他操作。

  2. 将Apache和Node放在不同的IP:port组合上(如果您的服务器有两个IP,则一个可以绑定到节点侦听器,另一个绑定到Apache)。

我也开始怀疑这可能不是您真正想要的。如果您的最终目标是用Node.js编写应用程序逻辑,然后将某些“文件处理”部分卸载给承包商,那么这实际上是一种语言选择,而不是Web服务器。

蛋蛋飞云 2020.03.18

这个问题更多地涉及服务器故障,但是FWIW我想说在大多数情况下在Node.js之前运行Apache不是一个好方法。

Apache的ProxyPass在很多方面都很棒(例如,将基于Tomcat的服务作为站点的一部分公开),并且如果您的Node.js应用只是在做特定的,小的角色,或者是内部工具,只可能有有限的用户数量那么使用它可能会更容易,这样您就可以继续使用它,但是听起来不像这里。

如果要利用性能和扩展性,可以从使用Node.js中获得收益-特别是如果您要使用涉及维护持久性连接(如Web套接字)的东西-最好同时运行Apache和Node。 js在其他端口上(例如localhost:8080上的Apache,localhost:3000上的Node.js),然后在前面运行类似nginx,Varnish或HA代理的内容-并以此方式路由流量。

使用诸如varnish或nginx之类的东西,您可以基于路径和/或主机来路由流量。与使用Apache进行相同的操作相比,它们都使用更少的系统资源,并且具有更大的可伸缩性。

达蒙神乐 2020.03.18
ProxyPass /node http://localhost:8000/     
  • 当我在httpd-vhosts.conf而不是httpd.conf中进行以上输入时,这对我有用
  • 我在我的环境中安装了XAMPP,并希望通过8080端口(即http:// localhost / [name_of_the_node_application])上运行的NodeJS applicatin击打80端口上的Apache上的所有流量。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android