在Apache中运行Node.js?

84
我们在一台机器上安装了一个Apache Web服务器,还使用Perl为页面提供服务。 为了一个项目,我决定使用Node.js代替Perl / Ruby。只是想知道是否可能使用Apache作为我的Web服务器(因此它提供页面),并使用Node.js动态创建Web页面(这是我正在创建的Web应用程序)? 换句话说,它们可以像Apache/Perl或Apache/PHP等一样协同工作吗?
7个回答

75

使用apache代理模块可以通过apache托管nodejs站点。

最好在本地主机上使用默认端口1337启动nodejs服务器。

使用以下命令启用代理:

sudo a2enmod proxy proxy_http

在确保服务器安全之前,请勿启用ProxyRequests代理。开放式代理服务器对您的网络和整个互联网都具有危险性。将ProxyRequests设置为Off不会禁用ProxyPass指令的使用。

请使用以下方式配置/etc/apache2/sites-availables

<VirtualHost *:80>
    ServerAdmin admin@site.com
    ServerName site.com
    ServerAlias www.site.com 

    ProxyRequests off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    <Location />
        ProxyPass http://localhost:1337/
        ProxyPassReverse http://localhost:1337/
    </Location>
</VirtualHost>

然后重新启动apache2服务。


2
确保服务器安全的步骤 - Jacksonkr
4
第一,非常酷。第二,真的吗,Node 的默认端口应该是用 1337 这个“leet speak”中的 'elite' 吗? - Gerard ONeill
1
这只是一些建议。 - Evgeny Karpov
想指出ProxyPass和ProxyPassReverse指令末尾的斜杠“/”很重要。如果不设置它们,您将收到502(代理错误)响应。这发生在我的一个朋友身上。 - Nicolás Fantone

45

不,NodeJS没有像mod-perl和mod-php那样作为Apache模块的方式可用,因此不可能在Apache之上运行节点。正如hexist指出的那样,可以将node作为单独的进程运行并安排两者之间的通信,但这与您已经使用的LAMP堆栈非常不同。

作为Apache的替代品,如果您有许多同时连接,节点提供性能优势。几乎可以想到任何内容都有一个巨大的模块生态系统。

从您的问题中,不清楚您是否需要在每个请求中动态生成页面,还是定期生成新内容以进行缓存和服务。如果是后者,您可以使用分离的节点任务将内容生成到Apache将提供服务的目录中,但这也与PHP或Perl非常不同。

节点不是提供静态内容的最佳方法。Nginx和Varnish更有效。它们可以在节点处理动态数据的同时提供静态内容。

如果您考虑在Web应用程序中使用节点,Express应该是您的首选。您可以仅使用Node实现Web应用程序,但Express(以及类似的框架,如Flatiron、Derby和Meteor)旨在消除很多痛苦和乏味。虽然Express文档一开始可能显得有些简单,但请查看这里仍然可以找到的屏幕截图:http://expressjs.com/2x/screencasts.html 。它们将让您了解Express提供的功能以及其有用性。ExpressJS的GitHub存储库还包含许多很好的示例,从身份验证到组织应用程序的所有内容都有。


1
谢谢Darren!幸运的是,这个项目早已完成! - JackSparrow123
现在是2015年,我刚从这篇文章中了解到Express。我在思考Express和Meteor的优缺点。在Google Trends上,Express比Meteor更受欢迎,但是正在下降,而Meteor则在增长。 - Irina Rapoport
FYI,带给你Express的人现在正在开发Koa。我使用它并且喜欢它。它很好地利用了JavaScript的async/await语法,这是执行异步操作的最佳方式。 - John Deighan
如果你们中的任何人是从面向对象编程语言转到Node.js,那么你可能想要尝试一下Nest.js。它基本上是用TypeScript构建的Angular后端开发框架,可以在express.js或fastify之上构建(你可以选择这两个引擎中的任意一个),提供了一个面向对象的MVC架构,而这正是express和fastify所缺少的。 - OzzyTheGiant

26

尽管这里有很多好的技巧,但我想回答你的问题:

换句话说,它们可以像Apache/Perl或Apache/PHP等一样协同工作吗?

是的,你可以将Node.js作为CGI模块运行在Apache上,与Perl和PHP共存。目前我还没有找到一个适用于Apache的mod-node,但可以查看这里的Apache CGI-Node:http://www.cgi-node.org/

cgi-node 的有趣之处在于,它使用 JavaScript 而不是 PHP 来生成动态内容、提供静态页面、访问 SQL 数据库等。甚至可以在服务器端和客户端/浏览器之间共享核心 JavaScript 库。

我认为向单一语言(客户端和服务器之间)转变正在发生,并且 JavaScript 似乎是一个不错的选择。

以下是来自cgi-node.org站点的一个快速示例:

<? include('myJavaScriptFile.js'); ?>
<html>
   <body>
      <? var helloWorld = 'Hello World!'; ?>
      <b><?= helloWorld ?><br/>
      <? for( var index = 0; index < 10; index++) write(index + ' '); ?>
   </body>
</html>

这将输出:

Hello World!
0 1 2 3 4 5 6 7 8 9

你还可以完全访问HTTP请求。这包括表单、上传的文件、头等内容。

我目前通过Godaddy上的cgi-node模块运行Node.js。

CGI-Node.org网站有所有入门文档。

我知道我很激动,但终于可以使用除了PHP之外的东西了。而且,能够在客户端和服务器端编写JavaScript。

希望这有所帮助。


似乎有一些node-cgi包在外面 - CGI-Node是否与https://larsjung.de/node-cgi/相同?如果不是,您会知道哪个更成熟/完整吗? - Daniel Sokolowski
1
这正是我在Dreamhost上处理动态内容而不编写PHP所寻找的解决方案。长 live JavaScript! - Sukima
这个回答更直接地回答了所问的问题。还有其他能够像运行php脚本一样运行node.js脚本的Web服务器吗? - Lonnie Best
@uei,我已经按照他们的完整教程安装了Node.js,但是我仍然无法从shell/终端运行node命令。它显示Node命令未找到。您是如何从Godaddy服务器启动index.js文件的?因为我们无法通过在终端上编写命令来运行我们的服务器文件并开始监听端口。 - Faizan
CGI注入了进程创建开销。这种不良影响可以通过FastCGI或本地Apache Node.js模块(如mod_php)来减少。在任何情况下,使用Node.js的动态Javascript页面都处于起步阶段。 - Agnius Vasiliauskas

5
常用的方法是将Apache和Node.js并行运行,并基于域名/URL将请求代理到Node.js,或者仅从Node.js端口获取Node.js内容。后一种方法非常适合在网站上使用像socket.io这样的小部件。

如果您计划在Node中进行所有动态内容生成,那么最好将node.js作为您的主要Web服务器,它可以很好地处理静态和动态HTTP请求。

参见:

http://expressjs.com/

https://github.com/joyent/node/wiki/modules


如果您在Apache旁运行它,Node实际上并没有像PHP一样坐在Apache的顶部,它仍然是单独的实例。这正确吗?另一个问题...我需要使用Express来创建动态页面吗?还是我可以仅使用Node.js?关于Express似乎没有太多信息... - JackSparrow123
正确的,node.js在它自己的进程中运行。Express处理http请求的内容,请参见http://expressjs.com/api.html...非常容易上手,页面开头的那个hello world就足够了。如果您想生成动态内容,您可能需要某种形式的模板引擎来生成通过express返回的内容,请参见:https://github.com/joyent/node/wiki/modules#wiki-templating以获取这些引擎的好列表。 - hexist
但是你也可以使用纯Node.js创建一个Hello World页面,那么框架是否具有任何优势呢? - JackSparrow123
它为您提供了所有路由相关的内容,这基本上是您从Apache获取的内容(尽管这更加灵活/强大)。 - hexist

1
您可以始终像写shell脚本一样做一些事情,例如:

#!/usr/bin/node

var header = "Content-type: text/plain\n";
var hi = "Hello World from nodetest!";
console.log(header);
console.log(hi);

exit;

0
如果您正在使用PHP,可以通过shell_exec将请求导向到Node脚本,并将参数作为JSON字符串传递给命令行中的脚本。示例调用:
<?php
    shell_exec("node nodeScript.js"); // without arguments
    shell_exec("node nodeScript.js '{[your JSON here]}'"); //with arguments
?>

需要注意的是,当用户数据接近命令行时,您需要非常小心处理。例如,可能会出现以下噩梦情况:

<?php
    $evilUserData = "'; [malicious commands here];";
    shell_exec("node nodeScript.js '{$evilUserData}'");
?>

0

在进行自己的服务器端 JS 实验时,我最终使用了 teajs。它符合 common.js 规范,基于 V8 引擎,并且是我所知道的唯一提供“mod_teajs”Apache 服务器模块的项目。

在我看来,Node.js 服务器并不适合生产环境,功能也太过缺乏 - Apache 经过了实战考验,是做 SSJS 的正确方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接