我应该如何在同一个系统上组织多个Express服务器?

我正在使用一台服务器来托pipe多个分布在多个域中的Node.js Web应用程序。 我目前的做法是为不同端口上的每个应用运行一个Express服务器,并运行一个基本服务器,将请求简单地路由(redirect)到正确的端口/ Express服务器。 这可以工作,但这意味着我的基本服务器正在路由每个HTTP请求(并通过手动redirect),并且我的用户将我的应用程序视为托pipe在[hostname.com]:8000。

经过一番研究,我发现我可以使用http-proxy来满足我的路由需求,但是我仍然想知道在同一个系统上运行多个Express服务器是否是最佳做法。 以下是我打算如何做的计划:

每个Web应用程序都有自己的文件夹,具有完整的Express文件夹结构(app.js,路线,视图等)应用程序将按域进行分组,因此示例文件夹结构将是:

hostname.com/ app.js routes/ views/ ... app1/ app1.js routes/ views/ ... app2 ... hostname2.com/ app.js routes/ views/ ... 

我将不得不分别运行每个app.js节点(或永远 ,我目前正在使用),每个人将不得不在内部使用不同的端口,跨应用程序redirect指向端口的目标应用

所以,这是我目前的计划。 它有什么问题,我应该尽量避免哪些缺陷? 最重要的是,这个问题是否存在一个解决scheme – 在Node.js / Express的同一个系统上托pipe多个Web应用的问题?

编辑:我打算最终使用WebSockets和HTTPS,而我的设置可以支持的带宽量对我来说并不重要 – 这是一个开发服务器(至less现在)。 感谢David Ellis提出的WebSockets问题。

第二次编辑:感谢EhevuTov和David Ellis的回答,两者都有很大的帮助。 我仍然在为我的应用程序的整体结构定居,看起来这个问题是由这个StackOverflow问题详细解决

第三编辑:自从发布这个问题以来,我已经有了一些方法(尽pipe我还有很长的路要走)。 看看我的GitHub仓库中的这个文件 ,它利用了我从这个问题的答案中学到的东西!

由于Express使用Connect ,我相当确定您可以使用Connect的虚拟主机中间件。 它的操作与其他产品上的其他虚拟主机模块类似。 我没有多个域来testing和显示你正确的代码,但我会认为这是这样的:

 express.createServer() .use(express.vhost('hostname1.com', require('/path/to/hostname1').app) .use(express.vhost('hostname2.com', require('/path/to/hostname2').app) .listen(80) 

如果您已经达到了某个Express服务器不够的地步,那么请使用API​​中的Node.Cluster。 如果这还不够,那么目前的做法是在您的Express服务器前放置一个asnyc反向代理(如Nginx),并将代理指向您的Express服务器。

如果你不需要使用WebSocket(或者其他的HTTP 1.1特性), 你可以使用NginX作为你的代理 。

好处是NginX可以处理的总负载与Node更高(静态编译和专门用于这种事情,基本上),但是你失去了stream式传输任何数据(一次发送更小的块)的能力。

对于较小的站点,或者如果您不确定将来需要什么function,最好是坚持使用node-http-proxy ,如果能够certificate代理是服务器的瓶颈,只能切换到NginX。 幸运的是,如果你以后需要,Nginx并不难。

Interesting Posts