82

我们在一台机器上安装了一个 Apache Webserver,它也使用 Perl 提供页面服务。

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

所以换句话说,它们可以像 Apache/Perl 或 Apache/PHP 等一样齐头并进。

4

7 回答 7

74

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

最好在 localhost 上使用默认端口 1337 启动 nodejs 服务器

使用命令启用代理:

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 服务。

于 2014-05-28T11:08:11.277 回答
45

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

作为 Apache 的替代品,如果您有许多同时连接,节点会提供性能优势。还有一个庞大的模块生态系统,几乎可以满足您的任何想法。

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

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

如果您正在考虑将 node 用于 Web 应用程序,那么 Express 应该是您的首选。您可以纯粹在 Node 中实现 Web 应用程序,但 Express(以及 Flatiron、Derby 和 Meteor 等类似框架)旨在消除很多痛苦和乏味。虽然 Express 文档起初看起来有点稀疏,但请查看此处仍然可用的屏幕投射:http: //expressjs.com/2x/screencasts.html 他们会让您很好地了解 express 提供的内容以及原因它是有益的。ExpressJS 的 github 存储库还包含许多很好的示例,涵盖从身份验证到组织应用程序的所有内容。

于 2013-01-18T04:43:12.207 回答
26

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

所以换句话说,它们可以像 Apache/Perl 或 Apache/PHP 等一样齐头并进。

是的,如果您将其作为 CGI 模块运行,您可以在 Apache 上与 Perl 和 PHP 一起运行 Node.js。到目前为止,我无法找到 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。

希望这可以帮助。

于 2014-10-08T16:06:02.847 回答
5

做你想做的事情的常用方法是并排运行它们,或者根据域/url代理从 apache 到 node.js 的请求,或者只是让你的 node.js 内容从节点中提取。 js 端口。后一种方法非常适用于在您的网站上拥有诸如 socket.io 驱动的小部件等。


但是,如果您要在 node 中生成所有动态内容,那么您也可以使用 node.js 作为您的主要网络服务器,它在处理静态和动态 http 请求方面做得非常好。

看:

http://expressjs.com/

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

于 2013-01-16T23:48:05.607 回答
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;
于 2018-02-28T20:12:09.637 回答
0

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

在我看来,Node.js 服务器还没有为生产做好准备,并且缺少太多的特性——Apache 经过了实战考验,并且是执行 SSJS 的正确方法。

于 2013-12-15T20:49:00.687 回答
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}'");
?>
于 2020-03-13T16:50:06.967 回答