我们在一台机器上安装了一个 Apache Webserver,它也使用 Perl 提供页面服务。
对于一个项目,我决定使用 Node.js 而不是 Perl/Ruby。只是想知道是否可以使用 Apache 作为我的网络服务器(因此它为页面提供服务)并使用 Node.js 动态创建网页(这是针对我正在创建的网络应用程序)?
所以换句话说,它们可以像 Apache/Perl 或 Apache/PHP 等一样齐头并进。
我们在一台机器上安装了一个 Apache Webserver,它也使用 Perl 提供页面服务。
对于一个项目,我决定使用 Node.js 而不是 Perl/Ruby。只是想知道是否可以使用 Apache 作为我的网络服务器(因此它为页面提供服务)并使用 Node.js 动态创建网页(这是针对我正在创建的网络应用程序)?
所以换句话说,它们可以像 Apache/Perl 或 Apache/PHP 等一样齐头并进。
通过 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 服务。
不,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 存储库还包含许多很好的示例,涵盖从身份验证到组织应用程序的所有内容。
虽然这里有很多很好的提示,但我想回答您提出的问题:
所以换句话说,它们可以像 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。
希望这可以帮助。
做你想做的事情的常用方法是并排运行它们,或者根据域/url代理从 apache 到 node.js 的请求,或者只是让你的 node.js 内容从节点中提取。 js 端口。后一种方法非常适用于在您的网站上拥有诸如 socket.io 驱动的小部件等。
但是,如果您要在 node 中生成所有动态内容,那么您也可以使用 node.js 作为您的主要网络服务器,它在处理静态和动态 http 请求方面做得非常好。
看:
你总是可以做一些shell脚本,比如:
#!/usr/bin/node
var header = "Content-type: text/plain\n";
var hi = "Hello World from nodetest!";
console.log(header);
console.log(hi);
exit;
如果您使用的是 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}'");
?>