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

时间:2012-02-17 17:37:55

标签: node.js express vhosts multiple-domains http-proxy

我正在使用一台服务器来托管多个Node.js网络应用程序,这些应用程序分布在多个域中。我目前的做法是为不同端口上的每个应用程序运行Express服务器,并运行一个基本服务器,它只是将请求路由(重定向)到正确的端口/ Express服务器。这有效,但这意味着我的基本服务器正在路由每个HTTP请求(并通过手动重定向),并且我的用户将我的应用视为托管在[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/
        ...

我必须分别使用节点(或者我正在使用的forever)运行每个app.js,并且每个appd必须在内部使用不同的端口,并使用跨应用程序重定向被指向目标应用程序的端口。

所以,这是我目前的计划。有什么问题,我应该避免哪些陷阱? 最重要的是,是否存在针对此问题的既定解决方案 - 使用Node.js / Express在同一系统上托管多个Web应用程序的问题?

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

第二次编辑:感谢EhevuTov和David Ellis的回答,两者都有很大的帮助。我仍在为我的应用程序确定一个整体结构,this StackOverflow question

看起来这个问题已经详细解决了。

第三次编辑:自从发布这个问题以来,我已经找到了一些方法(尽管我还有很长的路要走)。查看this file in my GitHub repository,它利用我从这个问题的答案中学到的东西!

2 个答案:

答案 0 :(得分:35)

由于Express使用Connect,我很确定你可以使用Connect的虚拟主机中间件。它的运行方式与其他产品上的其他vhost模块类似。我没有多个域来测试并向您显示正确的代码,但我认为它是这样的:

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。如果这还不够,那么目前的做法是将一个asnyc反向代理(如Nginx)放在Express服务器前面,并将代理指向Express服务器。

答案 1 :(得分:6)

如果您不需要使用WebSockets(或任何HTTP 1.1功能),you can use NginX as your proxy instead

优点是NginX可以处理的总负载与Node相比更高(基本上是静态编译和专门用于此类事情),但是你失去了传输任何数据的能力(一次发送较小的块)。 / p>

对于较小的网站,或者如果您不确定将来需要哪些功能,最好坚持使用node-http-proxy并且只有在可以证明代理是瓶颈的情况下才切换到NginX你的服务器。幸运的是,如果你以后需要它,NginX并不难设置。