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

yc0p9oo0  于 2022-12-03  发布在  Node.js
关注(0)|答案(5)|浏览(425)

我有一个后端有Apache和PHP的Web应用程序。我正在用许多新特性来增强这个应用程序,并考虑在新工作中使用nodeiderjs。
首先,PHP和node.js可以在同一台机器上共存吗?我看不出为什么不行。其次,我可以直接从Javascript调用node.js代码并返回JSON吗?

lymnna71

lymnna711#

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

im9ewurl

im9ewurl2#

你可以在同一台服务器上运行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支持和巨大的速度在服务静态文件,而不必服务静态文件从您的节点应用程序(如果你不想)。

ct3nt3jp

ct3nt3jp3#

如果你的服务器是Ubuntu或Debian,请按照以下步骤操作:
1.打开终端写入:

sudo curl -sL https://deb.nodesource.com/setup_8.x | bash -
sudo apt-get install nodejs

1.如果服务器上未安装curl:

sudo apt-get install curl

1.为了在不关闭示例的情况下退出终端时Node.js应用程序不会停止,请使用名为Forever的包。

npm install -g forever

1.如果您的站点已经上传,并且NPM和Forever配置正确,那么就应该启动Node.js示例了。如果您使用的是Express.js,请运行以下命令来启动Forever示例:

forever start ./path/to/your/project

1.在上面的命令中,您会注意到我正在输入./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.example.com域名时,该代理将获取我们的Node.js http://localhost:3000站点www.yousite.com。所有资产和页面都将使用www.yoursite.com路径,而不是http://localhost:3000,这会使每个人都相信该网站的服务与其他网站没有什么不同。
但是,默认情况下,Apache代理模块未启用。如果模块尚未启用,则必须运行以下两个命令:

a2enmod proxy
a2enmod proxy_http

启用这些模块后,可能需要重新启动Apache。
我是在The Poliglot Developer上获得此信息的。

eanckbw9

eanckbw94#

在Intellij的较新版本中,这似乎集成在Terminal插件中,默认情况下可用。
您可以通过以下方式使用鼠标打开目录:

right click -> Open In -> Terminal

或者为键盘Map命令Plugins/Terminal/Open in Terminal指定快捷键。
由于创建新的终端选项卡需要使用command + T,因此我指定了command + shift + T

slhcrj9b

slhcrj9b5#

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

相关问题