在Apache中运行Node.js?


78

我们在机器上安装了Apache Web服务器,该机器还使用Perl提供页面。

对于一个项目,我决定使用Node.js代替Perl / Ruby。只是想知道是否有可能使用Apache作为我的Web服务器(以便为页面提供服务)并使用Node.js动态创建Web页面(这是针对我正在创建的Web应用程序)?

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

Answers:


73

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

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

使用以下命令启用代理:

sudo a2enmod proxy proxy_http

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

使用以下命令配置/ etc / apche2 / 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服务。



3
首先-非常酷。其次-实际上,节点的默认端口应该是“精英”吗?
杰拉德·奥尼尔

1
这只是建议。
Evgeny Karpov

要指出的是,/ProxyPass和ProxyPassReverse指令的尾部斜杠很重要。如果未设置,则会收到502(代理错误)响应。发生了一个朋友。
尼古拉斯Fantone

43

不能。NodeJS不能像mod-perl和mod-php一样用作Apache模块,因此无法在Apache的“顶部”运行节点。正如hexist指出的那样,可以将节点作为单独的进程运行并安排两者之间的通信,但这与您已经在使用的LAMP堆栈完全不同。

作为Apache的替代品,如果您有许多同时连接,则node具有性能优势。还有一个庞大的模块生态系统,几乎可以想到任何东西。

从您的问题来看,不清楚您是否需要在每个请求上动态生成页面,还是只是定期生成新内容以进行缓存和提供服务。如果是后者,则可以使用单独的节点任务将内容生成到Apache将要服务的目录,但是同样,这与PHP或Perl完全不同。

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

如果您完全考虑将节点用于Web应用程序,则Express应该在您的列表中居于首位。您可以纯粹在Node中实现Web应用程序,但Express(以及Flatiron,Derby和Meteor等类似框架)旨在减轻很多麻烦和乏味。虽然起初Express文档似乎有点稀疏,但请查看仍在此处提供的屏幕截图:http : //expressjs.com/2x/screencasts.html 它们将使您对速递的内容以及原因有一个很好的认识。它是有益的。ExpressJS的github存储库还包含许多不错的示例,涉及从身份验证到组织应用程序的所有内容。


1
谢谢达伦!幸运的是,这个项目早已完成!
JackSparrow123

是2015年,我刚刚从这篇文章中学到了Express。我想知道Express vs.Meteor的优缺点。Google趋势中的Express大于流星,但在下降,流星正在增长。
伊琳娜·拉波特

仅供参考,为您带来Express的人们现在正在开发Koa。我用它并喜欢它。它很好地利用了JavaScript的async / await语法,这是进行异步处理的最佳方法。
John Deighan

25

尽管这里有很多好的提示,但我想回答您提出的问题:

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

是的如果您将其作为CGI模块运行,则可以与Perl和PHP一起在Apache上运行Node.js。到目前为止,我无法找到Apache的mod节点,但可以在http://www.cgi-node.org/上找到:Apache的CGI节点。

关于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是否与larsjung.de/node-cgi相同?如果不是,您会知道哪个更成熟/完整?
Daniel Sokolowski

1
这正是我要在Dreamhost上处理动态内容而不是用PHP编写的解决方案。万岁JavaScript!
Sukima

该答案更直接地回答了所提出的问题。是否还有其他Web服务器能够以与运行php脚本相同的方式运行node.js脚本?
Lonnie Best

@uei No Man,我已经按照高级教程安装了nodejs,但是仍然无法从shell /终端运行node命令。它说未找到节点命令。您是如何从Godaddy服务器中启动index.js文件的?因为没有办法运行我们的服务器文件并开始监听端口,除非我们在终端上写命令
Faizan

CGI会增加流程创建的开销。使用FastCGI或本机Apache Node.js模块(如mod_php)可以减少这种不良影响。无论哪种情况-带有Node.js的动态Javascript页面都处于初期阶段
Agnius Vasiliauskas

5

要做您想做的事情的常用方法是并排运行它们,或者基于域/ url从apache到node.js的代理请求,或者只是将node.js的内容从节点中拉出。 js端口。对于您的站点上具有由socket.io驱动的小部件之类的东西,此后一种方法非常有效。


但是,如果要在node中进行所有动态内容生成,那么最好也将node.js用作主要的Web服务器,它在满足静态和动态http请求方面都做得很好。

看到:

http://expressjs.com/

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


如果将其与Apache Node一起运行,实际上它不是位于Apache之上吗?像PHP。它仍然是单独的实例。那是对的吗?另一个问题...我是否需要Express来创建动态页面,还是可以仅使用Node.js?快递方面似乎没有太多信息……
JackSparrow123

正确,node.js在它自己的过程中运行。Express处理http请求的内容,请参阅expressjs.com/api.html ..很容易上手,页面开始处的hello世界就是您第一页所需的一切。如果你想生成动态内容,你可能会想一些表单模板引擎来生成内容,你会通过快递将返回,请参阅:github.com/joyent/node/wiki/modules#wiki-templating了这些的好清单。
hexist

但是您也可以使用纯Node.js制作一个hello世界页面,该框架具有任何优势吗?
JackSparrow123

它为您提供了所有的路由选择,基本上就是您从apache所获得的(尽管这稍微灵活/功能强大)。
hexist 2013年

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

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

在我看来,Node.js服务器尚未准备好生产,并且缺少太多功能-Apache经过了实战测试,并且是制作SSJS的正确方法。


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}'");
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.