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

说服他使用Node(他在这方面几乎没有让步) 弄清楚如何上传,下载,重命名,保存等文件在节点或 我必须在同一台服务器上安装apache和node。

哪种情况是最有利的,我如何实现它?


当前回答

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

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

我也开始怀疑这可能不是你真正想要的。如果你的最终目标是用Nodejs编写应用程序逻辑,并将一些“文件处理”部分卸载给承包商,那么这实际上是语言的选择,而不是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");

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

运行apache与node js反向代理-使用redbird

ProxyPass /node http://localhost:8000/     

当我在httpd-vhosts.conf而不是httpd.conf中做上述条目时,这对我来说是有效的 我已经在我的环境中安装了XAMPP,并希望在apache的80端口上使用NodeJS应用程序运行在8080端口上,即http://localhost/[name_of_the_node_application]

在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/节点的请求都将由节点服务器处理。

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

我通过将我的端口(运行的节点应用程序)添加到允许传入的TCP端口和允许传出的TCP端口列表中来解决这个问题。

您可以在服务器的WHM面板中的防火墙配置中找到这些配置。

我也在找同样的信息。终于从上面@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/$1 [P]

对于目录级重定向,上面的链接建议使用(.+)规则,该规则要求'node/'后面有一个或多个字符。我必须将它转换为(.*),这是零或更多,我的东西才能工作。

非常感谢@Straseus的链接