2012-04-18 119 views
10

我的最终目标是让每个服务器实例的node.js更具成本效益。如何为端口80上的网站制作Node.js多租户?

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

我在Windows中为ASP.NET做了相当多的工作,因为IIS支持这种开箱即用的方式,我知道这对Apache来说也是正常的。

如果这不是正确的问题或提供建设性的批评,而不是随机的downvote,随意将此移动到另一个论坛进行堆栈交换。谢谢。

更新

我真是为使用静态承载方式(通过gatspy和S3),那么一个API,而不是通过邮局邮件从服务器的客户端和API密钥注册域名,并定期生成静态网站随着网站的变化,但感谢所有的建议!

+1

从你的问题中可以看出你已经知道了基本的答案 - 使用'req.headers.host'来为不同的虚拟主机在不同的路由链路之间做出决定 - 那么你是否需要一种内置的方式来做到这一点?或者一个图书馆来提取细节? – jimw 2012-04-18 19:00:56

+0

内置将是可取的,节点是伟大的,你可以推出自己的,但我更喜欢一些积极建立在自己的权利 – 2012-04-18 19:05:04

+1

有[这](https://github.com/coolaj86/connect-vhoster),但这不是一个非常活跃的项目。否则[node-http-proxy](https://github.com/nodejitsu/node-http-proxy),它更加活跃,但可能比你需要的要多得多。 – jimw 2012-04-18 19:12:25

回答

25

从理论上讲,你可以建立一个纯节点网络服务器来模拟Apache/Lighttpd/Nginx的功能,但我不会推荐它。事实上,对于严格的生产服务,我建议始终使用Nginx或同等服务器来提供服务(请参阅thisthis)。

下面是一个简单的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/; 
    } 
    } 
} 

我见过生产箱内核恐慌,因为节点没有默认油门负荷,并优先接受新的连接在处理现有的请求 - 已授予,它“不应该”已经崩溃的内核,但它的确如此。另外,通过在端口3000上运行,您可以非常少的权限(非常少的权限)运行您的Node服务(并且仍然对其进行代理以使其显示在端口80上)。你也可以在多个工作者之间传播负载,服务静态,记录请求,重写URL等等.Nginx非常快(比Apache轻得多)。同代理代理转发的开销很小,为您带来如此多的功能和强大的功能,以至于在我的书中这是一个扣篮。即使是微不足道的东西,比如 - 当我崩溃或超载我的节点服务时,用户会遇到黑洞,或者“赦免我们的灰尘,我们的服务器正在被维护”。

+1

我也看到了这个答案。 http://stackoverflow.com/questions/5009324/node-js-nginx-and-now我会检查你的,因为我同意这是我见过的最好的方法。谢谢。 – 2012-05-14 01:35:02

+0

正如一个问题:这不是真正的多租户,因为有多个软件运行,但它是关于有几个网站在一台服务器上使用相同的端口? – IroNEDR 2017-04-19 14:00:53

5

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

+0

是的,这是有道理的 – 2012-04-18 20:37:09

+0

这个问题的主要问题是我不能在HAProxy的这个级别上工作。我正在直接寻找Node.js解决方案,但这确实很有用。我将这个想法放在未来的想法中。 – 2012-04-18 20:46:35

+3

就我个人而言,我不会相信节点唯一的解决方案 - 尤其是因为您正在谈论不同的客户网站。节点是单线程的 - 意味着网站会很容易干扰其他人的表现和/或在对方死亡时(如果他们都在同一个实例中运行)。你目前如何部署节点? – UpTheCreek 2012-04-18 20:51:27