在具有多个域的同一服务器上托管 PHP 和 Node.js 应用程序

Posted

技术标签:

【中文标题】在具有多个域的同一服务器上托管 PHP 和 Node.js 应用程序【英文标题】:Hosting PHP and Node.js apps on the same server with multiple domains 【发布时间】:2012-12-10 08:45:22 【问题描述】:

我有一个 Linode VPS,目前正在运行 lighttpd 来提供我的 php 网站并监听端口 80。

我也在运行 Node.js,它侦听端口 81,并使用 websockets 和 HTTP 与客户端交互。

有几个不同的域我想指向这个服务器。理想情况下,我希望托管 PHP 站点的域都与同一个 lighttpd 服务器通信,并且使用 node.js 的站点会以某种方式重定向到端口 node.js 正在侦听客户端不知道的情况(例如,没有 30x 重定向)。

example-php1.com:80 -> linodebox:80 lighttpd /var/www/example1
example-php2.com:80 -> linodebox:80 lighttpd /var/www/example2
example-node.com:80 -> linodebox:81 node.js

有没有办法通过设置 DNS 条目或调整 iptables 来做到这一点? lighttpd 是否需要成为 node.js 的代理? websockets 功能需要在没有任何后备的情况下工作,并且需要访问非节点域,例如example-php1.com:81,不应该暴露节点应用程序。

我觉得完美的解决方案不需要更改现有应用程序代码,也不需要在软件 Web 服务器之间进行代理,但我可能错了。

【问题讨论】:

【参考方案1】:

汤姆怎么了!?

我推荐 HA-Proxy,它是目前性能最高的代理之一,应该可以完成您想要做的事情。

我正在用 nginx 作为代理做类似的事情,这很容易但不是最快的。

HA-Proxy 的网站在这里http://haproxy.1wt.eu

如果您想要一个“纯粹”的解决方案,您可能可以通过查看 ha-proxy 的源代码得到答案。你真的不能用 iptables 做到这一点。某些东西必须读取 HTTP 标头以确定请求来自何处才能在本地路由它。

【讨论】:

【参考方案2】:

我遇到了基本相同的问题,最终我使用了node-http-proxy(在 npm 中也可以使用 http-proxy)。

你只需要一个简单的配置文件:

路由器: 'example-php1.com': 'linodebox:80', 'example-php2.com': 'linodebox:80', 'example-node.com':'linodebox:81

然后运行node-http-proxy --config options.json 即可。如果你想在同一台机器上运行 lighttpd 和 node,你必须在不同的端口上启动 lig​​httpd(我使用 81 用于 php,3000 用于 node - 调整配置很容易)。我还使用forever 来管理我的节点实例。

【讨论】:

【参考方案3】:

你会恨我的……

我最终选择了第二个 IP 地址,然后按照 Linode tutorial 设置多个静态 IP。然后,我将 lighttpd 配置为绑定到一个 IP 地址,并将 Node.js 配置为绑定到另一个 IP 地址。

这不是一个很好的解决方案,因为它无法扩展。

【讨论】:

以上是关于在具有多个域的同一服务器上托管 PHP 和 Node.js 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Django VirtualHosting:如何在一个 VPS 上托管具有不同域的多个 django 项目

在单个服务器上托管多个应用程序容器而不会发生冲突

在同一台服务器上托管多个 Rails 应用程序

在一个 IP 上托管多个 Golang 站点并根据域请求提供服务?

我应该在同一台服务器上托管网站和 REST API 还是拆分?

在具有 80 端口的 IIS 上托管 2 个网站 1,在 Xampp 8081 端口上托管 1 个网站