46

我正在使用一台服务器来托管多个 Node.js Web 应用程序,这些应用程序分布在多个域中。我目前的做法是在不同的端口上为每个应用程序运行一个 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/
        ...

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

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

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

第二次编辑:感谢 EhevuTov 和 David Ellis 的回答,他们都帮了大忙。我仍在为我的应用程序确定一个整体结构,看起来这个问题在这个 StackOverflow 问题中得到了一些详细的解决

第三次编辑:自从发布这个问题以来,我已经走了一段路(尽管我还有很长的路要走)。在我的 GitHub 存储库中查看这个文件,它利用了我从这个问题的答案中学到的知识!

4

2 回答 2

36

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

于 2012-02-18T16:38:06.783 回答
6

如果你不需要使用 WebSockets(或者任何 HTTP 1.1 特性,真的),你可以使用 NginX 作为你的代理

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

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

于 2012-02-17T19:10:56.183 回答