如何为 80 端口上的网站制作 Node.js 多租户?

Posted

技术标签:

【中文标题】如何为 80 端口上的网站制作 Node.js 多租户?【英文标题】:How to make Node.js Multi-tenant for websites on port 80? 【发布时间】:2012-04-30 06:07:03 【问题描述】:

我的最终目标是让每个服务器实例的 node.js 更具成本效益。

我不是在运行游戏或聊天室,而是为客户提供简单的网站。我想在单个服务器上容纳多个客户端,但有多个网站使用主机标头映射从端口 80 运行。我仍然想像现在一样使用 express,但如果可能的话,让它更像是从端口 80 到其他节点应用程序的路由。如果以这种方式完成节点可能会更便宜,但目前对于我的目的来说它更昂贵,因为如果在端口 80 上运行每个客户都需要自己的盒子。此外,我的动机是专注于节点开发,但必须有理由这样做所以在成本方面。

我在 Windows 中为 ASP.NET 做了很多这样的事情,因为 IIS 开箱即用地支持这一点,我知道这对于 Apache 来说也是正常的。

如果这不是正确的问题或提出建设性的批评而不是随机的否决,请随时将其移至另一个论坛以进行堆栈交换。谢谢。

更新

我采用的方法是使用静态托管(通过 gatspy 和 s3),然后使用 API,而不是通过来自客户端的发布消息和来自服务器的 API 密钥注册域,并在站点更改时定期生成静态站点,但感谢所有建议!

【问题讨论】:

从您的问题看来,您似乎已经知道基本答案 - 使用 req.headers.host 在不同虚拟主机的不同路由链之间做出决定 - 那么您是否需要一种内置的方式来做到这一点?还是一个抽象细节的库? 内置会更好,节点很棒,因为您可以自己滚动,但我更喜欢主动构建自己的东西 有this,但它不是一个非常活跃的项目。否则node-http-proxy,它更活跃,但可能比你需要的更多。 【参考方案1】:

理论上,您可以构建一个纯节点 Web 服务器来模拟 Apache/Lighttpd/nginx 的功能,但我不建议这样做。事实上,对于严肃的生产服务,我建议您始终使用 Nginx 或同等产品(请参阅this 和 this)。

下面是一个简单的Nginx 配置如何适用于在端口 80 上公开的两个子服务。

worker_processes  4;

events 
  worker_connections 1024;


http 
  include       mime.types;
  default_type  text/html;

  server 
    listen 80;
    server_name service1.mydomain.com
    location / 
      proxy_pass         http://127.0.0.1:3000/;
    
  
  server 
    listen 80;
    server_name service2.mydomain.com
    location / 
      proxy_pass         http://127.0.0.1:3001/;
    
  

我已经看到生产盒内核恐慌,因为 Node 默认情况下不会限制负载,并且会优先接受新连接而不是处理现有请求 - 当然,它“不应该”使内核崩溃,但它确实崩溃了。此外,通过在端口 3000 上运行,您可以以非 root 用户身份运行您的 Node 服务,只需很少的权限(并且仍然代理它,使其看起来在端口 80 上)。您还可以在多个工作人员之间分散负载、提供静态数据、记录请求、重写 url 等等。Nginx 非常快(比 Apache 轻得多)。同框代理转发的开销很小,并且为您购买了如此多的功能和稳健性,以至于在我的书中它是一个灌篮。即使是小事,比如 - 当我的节点服务崩溃或过载时,用户是否会遇到黑洞,或者“请原谅我们的灰尘,我们的服务器正在维护”。

【讨论】:

我也看到了这个答案。 ***.com/questions/5009324/node-js-nginx-and-now 我会检查你的,因为我同意这是我见过的最好的方法。谢谢。 就像一个问题:这并不是真正的多租户,因为运行的软件不止一个,而是让多个网站在一台服务器上使用相同的端口,对吗?【参考方案2】:

如何使用适当的反向代理,例如HAProxy,让代理在端口 80 上侦听,并根据 headers.host 委托给非公共端口(例如 10000、10001 等)上的多个节点实例?

【讨论】:

主要问题是我无法在此级别访问以使 HAProxy 正常工作。我正在直接寻找 Node.js 解决方案,但这肯定很有用。我把它记在心里,以备将来的想法。 就我个人而言,我不会相信仅节点的解决方案——尤其是因为您正在谈论不同的客户站点。节点是单线程的——这意味着这些站点很容易在它们死亡时相互干扰和/或相互关闭(如果它们都在同一个实例中运行)。您目前如何部署节点? Nginx 也可以,顺便说一下……HAProxy 也有一些 SSL 限制 :) @kitgui.com,我不明白access at this level 是什么意思 - 如果您以可以侦听端口 80 的用户身份运行节点,您应该能够运行其他任何东西: ) @kitgui.com - 链接不是硬件解决方案 - HAProxy 只是一个软件,与节点相同。如果可以安装node,那么就可以安装HA。

以上是关于如何为 80 端口上的网站制作 Node.js 多租户?的主要内容,如果未能解决你的问题,请参考以下文章

使用 lighttpd 重定向端口 80 上的 websocket 流量

如何为 node.js 服务器分配域名? [复制]

Node.js端口兼容性

如何在端口 80 上运行 Node.js?

为啥在端口 80 上运行 node.js 可能不安全?

用Nginx反向代理实现多网站共用80端口