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

时间:2013-09-10 22:51:36

标签: php json node.js

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

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

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:4)

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

然后只需将nginx配置为使用目录名作为过滤器将所有节点请求代理到localhost:8081。您基本上设置nginx来处理Node请求有点像它处理PHP请求:它将它们转发给其他守护进程,然后在它返回时处理响应。 Nginx非常擅长这一点,并且善于同时管理多个连接。

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

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

答案 2 :(得分: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 :(得分:0)

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