【问题标题】:Running Node.js in apache?在 apache 中运行 Node.js?
【发布时间】:2012-12-31 10:45:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript apache node.js webserver


    【解决方案1】:

    如果您使用的是 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}'");
    ?>
    

    【讨论】:

      【解决方案2】:

      你总是可以做一些 shell-scripty 像:

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

      【讨论】:

        【解决方案3】:

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

        所以换句话说,它们可以像 Apache/Perl 一样携手合作吗? Apache/PHP 等。

        是的,您可以在 Apache 上运行 Node.js 以及 Perl 和 PHP IF,您可以将其作为 CGI 模块运行。到目前为止,我无法找到 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 是否与:larsjung.de/node-cgi 相同?如果不是,您会知道哪个更成熟/完整吗?
        • 这正是我正在寻找的在 Dreamhost 上处理动态内容而不是用 PHP 编写的解决方案。 JavaScript 万岁!
        • 这个答案更直接地回答了所提出的问题。是否有其他网络服务器能够以与运行 php 脚本相同的方式运行 node.js 脚本?
        • @uei No Man,我已经按照他们的 enitre 教程安装了 nodejs,但我仍然无法从 shell / 终端运行节点命令。它说找不到节点命令。你是如何从 godaddy 服务器启动你的 index.js 文件的?因为没有办法运行我们的服务器文件并开始监听端口,除非我们在终端上写命令
        • CGI 注入 process creation overhead。使用FastCGI 或本机 Apache Node.js 模块(如 mod_php)可以减少这种不良影响。在任何一种情况下 - 使用 Node.js 的动态 Javascript 页面都处于起步阶段
        【解决方案4】:

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

        【讨论】:

        • 首先——非常酷。第二——真的,节点的默认端口在 leet speak 中应该是“精英”?
        • 只是推荐。
        • 想指出 ProxyPass 和 ProxyPassReverse 指令的尾部斜线 / 很重要。如果您不设置它们,您将收到 502(代理错误)响应。发生在朋友身上。
        【解决方案5】:

        没有。 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 存储库还包含许多很好的示例,涵盖从身份验证到组织应用程序的所有内容。

        【讨论】:

        • 谢谢达伦!幸运的是这个项目早就完成了!
        • 现在是 2015 年,我刚刚从这篇文章中了解到 Express。我想知道 Express 与 Meteor 的优缺点。 Express 在 Google 趋势中的影响力超过了流星,但在下降,而流星正在增长。
        • 仅供参考,为您带来 Express 的人现在正在开发 Koa。我使用它并且喜欢它。它充分利用了 JavaScript 的 async/await 语法,这是实现异步的最佳方式。
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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


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

          见:

          http://expressjs.com/

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

          【讨论】:

          • 如果你在 Apache 旁边运行它,Node 实际上并不是位于 Apache 之上,是吗?就像 PHP 一样。它仍然是单独的实例。那是对的吗?另一个问题...我需要 Express 来创建动态页面还是可以单独使用 Node.js?好像没有多少关于快递的资料...
          • 正确,node.js 在它自己的进程中运行。 Express 处理 http 请求的内容,请参阅 expressjs.com/api.html .. 很容易上手,页面开头的 hello world 就是您的第一页所需要的一切。如果您想生成动态内容,您可能需要某种形式的模板引擎来生成您将通过 express 返回的内容,请参阅:github.com/joyent/node/wiki/modules#wiki-templating 以获得这些内容的良好列表。
          • 但是您也可以使用纯 Node.js 制作一个 hello world 页面,该框架是否有任何优势?
          • 它为你提供了所有路由的东西,这基本上就是你从 apache 得到的东西(虽然这更灵活/强大)。
          猜你喜欢
          • 2021-10-26
          • 2017-01-10
          • 2015-12-01
          • 2014-02-19
          • 2021-05-01
          • 2014-02-18
          • 1970-01-01
          • 2018-12-16
          • 1970-01-01
          相关资源
          最近更新 更多