【问题标题】:can PHP and node.js run on the same serverPHP 和 node.js 可以在同一台服务器上运行吗
【发布时间】:2013-09-14 19:37:29
【问题描述】:

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

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

【问题讨论】:

  • 在客户端直接从Javascript调用Node代码?不完全的; Node 和 PHP 一样,通过 HTTP 工作。
  • 我明白这一点。其实是正确的,node不限于HTTP....我的问题是,类似于客户端的JS如何调用服务器端的php脚本,客户端的JS可以调用node.js脚本吗?还是必须通过应用服务器等中间层?
  • Node 带有一个 HTTP 请求处理程序,但你应该在它前面运行一个适当的 Web 服务器(例如 nginx)。
  • 我知道这是一个老问题,但到目前为止的答案都乏善可陈。

标签: php json node.js


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果没有这个答案,我无法想象这个话题......谢谢!
【解决方案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 上获得此信息。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我有一个简单的解决方法。我使用 php 为我的 React DOM 提供 REST API。基本上 php 是我的逻辑(模型和控制器)和 React 我的视图(当然还有路由)。使用这种方法的优点是性能会提高(API 可以被缓存),并且每个第三方系统都将使用您只需开发一次的 API 与您进行通信。希望它有所帮助:)
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2015-05-27
      相关资源
      最近更新 更多