17

我在后端有一个带有 Apache 和 PHP 的 Web 应用程序。我正在使用许多新功能来增强它,并考虑将 node.js 用于新工作。

首先,PHP和node.js可以共存于同一台机器上吗?我不明白为什么不。其次,我可以直接从 Javascript 调用 node.js 代码并返回 JSON 吗?

4

4 回答 4

19

是的,是的。Node 和 Apache / PHP 可以在单个服务器上共存。

您可能遇到的唯一问题是它们不能同时侦听同一个端口。默认情况下,HTTP 在端口 80 上运行,并且任何时候只有一个进程可以“侦听”单个端口。因此,您可能必须在不同的端口(例如 8080)上运行 Node 应用程序,如果您的任何目标用户仅限于端口 80,这可能会带来困难。

于 2013-09-10T22:56:14.193 回答
18

您可以在同一台服务器上运行 node 和 PHP,甚至可以在同一端口上运行。关键是在前面使用像 nginx 这样的服务器来监听端口 80,像往常一样在 Nginx 中设置 PHP(使用 php-fpm),并设置你的 Node 实例在本地监听某个高端口,比如 8081。

然后只需将 nginx 配置为使用目录名称作为过滤器将所有节点请求代理到 localhost:8081。您实际上是在设置 nginx 来处理 Node 请求,就像处理 PHP 请求一样:它将它们转发给其他守护程序,然后在响应返回时处理它。Nginx 在这方面做得很好。它将增加一层安全性并提高性能,因为它非常擅长一次管理多个连接,即使后端没有。

这样做的另一个好处是,您也可以在不同的域上拥有多个单独的 Node 实例,并使用常规的 nginx 规则来处理这一切。您还可以将它与其他应用程序服务器一起运行,例如用 Go 编写的应用程序。

您将受益于 Nginx 的可配置性、其 SSL 和 HTTP/2 支持以及提供静态文件的巨大速度,并且不必从您的 Node 应用程序提供静态文件(如果您不想这样做)。

于 2017-03-16T06:57:29.577 回答
2

是的,你可以做到。如果您的服务器是 Ubuntu 或 Debian,请按照下列步骤操作:

  1. 打开你的终端写:

    sudo curl -sL https://deb.nodesource.com/setup_8.x | bash -
    sudo apt-get install nodejs
    
  2. 如果您的服务器上未安装 curl:

    sudo apt-get install curl
    
  3. 当您退出终端而不关闭您的实例时,您的 Node.js 应用程序不会停止,请使用一个名为Forever的包。

    npm install -g forever
    
  4. 如果您的站点已上传并且 NPM 和 Forever 配置正确,则该启动 Node.js 实例了。如果您使用的是 Express.js,请运行以下命令来启动 Forever 实例:

    forever start ./path/to/your/project
    
  5. 在上面的命令中,您会注意到我正在输入 ./bin/www 脚本,因为这是 npm start 为 Express.js 启动的内容。请务必将脚本更改为您的启动脚本。

默认情况下,网站 (nodejs) 在http://localhost:3000运行,这对于远程访问者来说并不理想。我们希望能够从 Apache 处理的域名访问我们的站点。在您的 Apache VirtualHost 文件中,您可能具有如下所示的内容:

<virtualhost *:80>
    ServerName www.example.com
    ProxyPreserveHost on
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
</virtualhost>

我们告诉 Apache 创建一个代理,每次访问 www.yousite.com 域名时都会获取我们的 Node.js http://localhost:3000站点。所有资产和页面都将使用 www.yoursite.com 路径而不是http://localhost:3000,这让每个人都相信该网站的服务与其他网站没有什么不同。

但是,默认情况下,Apache 代理模块未启用。如果尚未启用模块,则必须运行以下两个命令:

a2enmod proxy
a2enmod proxy_http

启用这些模块后,您可能需要重新启动 Apache。

我在The Poliglot Developer上获得此信息。

于 2018-10-16T00:41:48.057 回答
-2

是的,如果您使用 php 向客户端提供 javascript 页面,则 javascript 代码可以使用 AJAX 请求来访问从您的节点服务器公开的路由。

于 2013-09-10T22:54:57.907 回答