PHP和node.js可以在同一台服务器上运行


can PHP and node.js run on the same server

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

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

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

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

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

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

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

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

是的,你可以做到。如果您的服务器是 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 和永久配置正确,则是时候启动 Node.js 实例了。如果您使用的是 Express.js,请运行以下命令以启动永久实例:

    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。

我在Poliglot开发人员上获得了此信息。

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