在具有多个域的同一服务器上托管 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,你必须在不同的端口上启动 lighttpd(我使用 81 用于 php,3000 用于 node - 调整配置很容易)。我还使用forever 来管理我的节点实例。
【讨论】:
【参考方案3】:你会恨我的……
我最终选择了第二个 IP 地址,然后按照 Linode tutorial 设置多个静态 IP。然后,我将 lighttpd 配置为绑定到一个 IP 地址,并将 Node.js 配置为绑定到另一个 IP 地址。
这不是一个很好的解决方案,因为它无法扩展。
【讨论】:
以上是关于在具有多个域的同一服务器上托管 PHP 和 Node.js 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Django VirtualHosting:如何在一个 VPS 上托管具有不同域的多个 django 项目
在一个 IP 上托管多个 Golang 站点并根据域请求提供服务?