我想使用Node,因为它速度很快,使用的是我在客户端使用的相同语言,并且按照定义它是非阻塞的。但是我雇用来编写程序进行文件处理(保存,编辑,重命名,下载,上传文​​件等)的那个人,他想使用apache。因此,我必须:说服他使用Node(他为此放弃了一点点)
弄清楚如何上传,下载,重命名,保存等文件。在node或
我必须在同一服务器上安装apache和node。

#1 楼



有很多在Apache上运行的用PHP实现的网站和免费Web应用程序,很多人都在使用它,因此您可以轻松地将其混搭,此外,它的使用也很简单提供静态内容。 Node具有V8的原始功能以及没有内置依赖项的扁平堆栈,是快速,强大,优雅且美观的工具。

我还希望Apache的易用性/灵活性以及Node.JS的粗鲁和优雅,为什么我不能同时拥有两者? Apache httpd.conf将特定URL上的所有请求通过管道传递到Node.JS应用程序也不太困难。因此您将获得正确的代理和子模块来重新路由http请求:

ProxyPass /node http://localhost:8000


然后在端口8000上运行您的Node应用程序! />
然后您可以使用URL上的/node/路径访问所有Node.JS逻辑,网站的其余部分可以留给Apache托管您现有的PHP页面:



现在剩下的唯一一件事情就是说服您的托管公司让您使用此配置来运行!!

评论


这是一个很好的答案,只是想添加一个链接,上面提供了我用来完成此工作的有关代理传递的更多信息。还要检查评论。boriskuzmanovic.wordpress.com/ 2006/10/20 /…

– Alex Muro
13-10-15在22:08

我测试了将“ ProxyPass / 127.0.0.1:8000”放入虚拟主机容器中,并且能够将整个域组成功重定向到节点实例。我还使用“ time wget ...”进行了测试,以比较直接访问节点和通过Apache访问节点的速度。在30对试验中,平均差异约为0.56ms。直接和通过Apache的最低加载时间为120ms。直接加载的最高加载时间为154ms,通过Apache加载的最高时间为164ms。没有显着差异。如果我有两个IP,我不会通过Apache进行路由,但是现在我会坚持使用Proxypass

– kaan_a
2014年3月19日15:59



从Apache到Node的这种代理请求不是在剥夺Node非阻塞性的好处吗?

– html_programmer
2014年9月16日20:52

嗨,@ Basj,我自己没有安装对websockets的支持的经验。话虽如此,Apache 2.4.6似乎支持使用mod_proxy_wstunnel代理websockets通信。我看到您现在已经找到了答案,对于其他有相同问题的人,请参阅:serverfault.com/questions/616370/…

–史蒂文·德·萨拉斯(Steven de Salas)
2014-12-18在1:48



如何在基于debian的发行版中添加它?没有httpd.conf文件。

–桑蒂
15年7月27日在12:11



#2 楼

这个问题更多地与服务器故障有关,但是FWIW我说在大多数情况下在Node.js之前运行Apache不是一个好方法。作为站点的一部分的基于服务的服务),并且如果您的Node.js应用只是在扮演特定的小角色,或者是内部工具,其用户数量有限,那么使用它可能会更容易,使其正常工作并继续前进,但这听起来不像是这里的情况。

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

使用varnish或nginx您可以根据路径和/或主机来路由流量。与使用Apache进行相同的操作相比,它们都使用更少的系统资源,并且具有更高的可伸缩性。

评论


这个答案应该有更多的支持。使用nginx代理绝对比使用Apache 1更好。

–丰富
16年1月20日在16:46

是的,但是它是资源密集型的

–甲骨文
18年5月21日在0:01

您是否有一些数字可以支持您的声明,即有关Nginx的资源密集度低于httpd的陈述?

– RedShift
18年3月3日在18:30

我不是很戏剧化。虽然我尝试不要因为回复链接脆弱而无法回复回复,但是您可以通过Google找到一些讨论和示例,例如help.dreamhost.com/hc/en-us/articles/………Apache是​​很棒的软件,但在这种情况下通常不是很好的方法。

–伊恩·柯林斯
18-10-4在23:35

我同意Nginx的速度更快,但是那样一来,您就需要额外的服务来配置和管理。由于该问题要求在同一台服务器上使用Apache和Node,因此Nginx似乎有点困难。

–史蒂文·德·萨拉斯(Steven de Salas)
6月3日10:42

#3 楼

沿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的所有请求将由节点服务器处理。

评论


奇迹般有效! :)

– Kees Koenen
19年6月12日在21:44

#4 楼

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


设置Apache以将所有匹配的请求代理到NodeJS,这将执行文件上传以及node中的其他操作。
具有Apache和节点在不同的IP:端口组合上(如果您的服务器有两个IP,那么一个可以绑定到您的节点侦听器,另一个可以绑定到Apache)。

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

#5 楼

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

首先,您需要使apache在端口80以外的其他端口上运行。 :端口8080

然后您可以使用nodejs编写反向代理脚本,如下所示:



使用NODE JS反向代理运行APACHE –使用RedBird

#6 楼

我将上面的答案与certbot SSL cert和CORS access-control-allow-headers结合使用,并使其正常工作,因此我想我应该共享结果。

Apache httpd.conf添加到了文件的底部:

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


Apache VirtualHost设置(PHP的文档根目录位于带有Certbot的Apache和SSL下,而node.js / socket.io站点在端口3000上运行-并使用另外请注意,来自Apache的SSL证书)
还请注意,node.js站点使用了/nodejs、socket.io和ws(Websockets)文件夹的代理: />然后我的node.js应用(app.js):

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www.example.com
    ServerAlias www.example.com
    DocumentRoot /var/html/www.example.com
    ErrorLog /var/html/log/error.log
    CustomLog /var/html/log/requests.log combined
    SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^socket.io          [NC]
    RewriteCond %{QUERY_STRING} transport=websocket [NC]
    RewriteRule /{.*}       ws://localhost:3000/  [P,L]

    RewriteCond %{HTTP:Connection} Upgrade [NC]
    RewriteRule /(.*) ws://localhost:3000/ [P,L]

    ProxyPass /nodejs http://localhost:3000/
    ProxyPassReverse /nodejs http://localhost:3000/

    ProxyPass /socket.io http://localhost:3000/socket.io
    ProxyPassReverse /socket.io http://localhost:3000/socket.io

    ProxyPass /socket.io ws://localhost:3000/socket.io
    ProxyPassReverse /socket.io ws://localhost:3000/socket.io

</VirtualHost>
</IfModule>


我强制使用ip4侦听器,但这是可选的-您可以替代:

var express = require('express');
var app = express();
    app.use(function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");
        res.header("Access-Control-Allow-Headers", "Content-Type");
        res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
        next();
    });
var http = require('http').Server(app);
var io = require('socket.io')(http);

http.listen({host:'0.0.0.0',port:3000});


node.js应用程序(app.js)代码继续:

http.listen(3000);


最后,在客户端(在本例中,当JS加载时,它将向套接字发出一个“命名事件”,将JSON中的数据发送到该套接字。该实例被创建为nodejs.js):

io.of('/nodejs').on('connection', function(socket) {
    //optional settings:
    io.set('heartbeat timeout', 3000); 
    io.set('heartbeat interval', 1000);

    //listener for when a user is added
    socket.on('add user', function(data) {
         socket.join('AnyRoomName');
         socket.broadcast.emit('user joined', data);
    });

    //listener for when a user leaves
    socket.on('remove user', function(data) {
         socket.leave('AnyRoomName');
         socket.broadcast.emit('user left', data);
    });

    //sample listener for any other function
    socket.on('named-event', function(data) {
         //code....
         socket.broadcast.emit('named-event-broadcast', data);
    });

    // add more listeners as needed... use different named-events...
});


node.js / socket.io服务器。使用服务器上的io和套接字在/ nodejs路径下(由客户端连接),接收数据,然后将其重新发送为广播。套接字中的任何其他用户都将使用其侦听器“命名事件广播”接收数据。请注意,发件人不会收到自己的广播。

#7 楼

ProxyPass /node http://localhost:8000/     



当我在httpd-vhosts.conf而不是httpd.conf中进行上述输入时,这对我有用在8080端口(即http:// localhost / [name_of_the_node_application])上运行的NodeJS应用程序在80端口上的Apache上的流量

#8 楼

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

您可以在服务器的WHM面板的Allow outgoing TCP ports中找到这些配置。

#9 楼

我一直在寻找相同的信息。终于在@Straseus

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/的上方答案链接中找到了答案

这是在端口80上运行apache网站,在端口8080上运行node 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/ [P]




对于目录级重定向,建议使用以上链接(。+)的规则,该规则后面需要一个或多个字符“节点/”。我必须将其转换为零或更大的(。*),我的东西才能正常工作。

非常感谢链接@Straseus

评论


只需注意[P]标志需要启用Apache的mod_proxy。

–西蒙东
2014年6月20日10:01



这是低效的。为什么通过简单的ProxyPass调用重写引擎?

– Michael Irigoyen
15-10-12在13:42

#10 楼

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

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

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

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

最后,您的选择

我完全同意@Straseus的观点,即使用node.js文件系统api来处理上传和下载相对微不足道,但要多考虑所需的内容从长远来看,从您的网站开始,然后选择您的技术栈。

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

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