在同一端口上运行多个 Node (Express) 应用程序

IT技术 javascript node.js express
2021-03-13 23:17:01

我有多个 Node 应用程序(构建在 Express 框架上)。

现在我把它们放成这样——

  • /var/www/app1
  • /var/www/app2
  • /var/www/app3

现在我想在同一个端口(比如 8080)上运行这 3 个应用程序。那可能吗 ?

需要注意的一件事是,每个应用程序都有这样的常见路线 -

  • app.get('/', func...);
  • app.get('/about', func...);
  • app.post('/foo', func...);
  • app.post('/bar', func...);

基本上我想像使用 Apache/PHP 设置那样做。

所以当你有一个 LAMP 堆栈时 -

  • /var/www/app1
  • /var/www/app2
  • /var/www/app3

您可以轻松访问它们作为不同的应用程序 -

  • localhost/app1
  • localhost/app2
  • localhost/app3
3个回答

您可以使用app.use()

app
  .use('/app1', require('./app1/index').app)
  .use('/app2', require('./app2/index').app)
  .listen(8080);
如果没有像 Express.js 这样的第三方框架,最好的方法是什么?
2021-04-17 23:17:01
我猜如果一个应用程序崩溃,其他应用程序也会崩溃。
2021-04-21 23:17:01
不,app.use()特定于express并且不支持任何不遵循快速插件调用模式的 HTTP 服务器。
2021-04-24 23:17:01
如果我的 Node 应用程序是使用 Restify 制作的,这可能吗?问我这个问题是否不够具体或不够清楚。
2021-05-03 23:17:01

您可以将它们作为单独的应用程序运行,侦听不同的端口,然后使用代理(如https://github.com/nodejitsu/node-http-proxy/)根据请求的 URL 为 8080 上的所有内容提供服务。

喜欢:

var options = {
  router: {
    'foo.com/baz': '127.0.0.1:8001',
    'foo.com/buz': '127.0.0.1:8002',
    'bar.com/buz': '127.0.0.1:8003'
  }
};

对我来说就像魅力一样(http://nerdpress.org/2012/04/20/hosting-multiple-express-node-js-apps-on-port-80/)。我不太热衷于将它们安装为子应用程序,正如评论中所建议的那样,因为我希望它们独立运行......

当然,您可以运行包含在一个应用程序中的子应用程序并在内部处理路由。我个人只是不喜欢我的应用程序在崩溃时如此依赖彼此。这就是为什么我更喜欢在不同的端口上运行它们。
2021-04-19 23:17:01
显然routerin 选项不久前被删除了。blog.nodejitsu.com/node-http-proxy-1dot0
2021-04-23 23:17:01
你能澄清一下如何使用“选项”变量吗?
2021-05-01 23:17:01
首先,我不想设置多个虚拟主机。我想要它像 vhost/app1 , vhost/app2 , vhost/app3 。其次,我尝试了您链接到的博客文章中的第二种方法,但它对我来说并不真正有效,我不知道它是否适合我的用例。任何的想法 ?哦,而且此时也不打算使用反向代理......
2021-05-02 23:17:01
您不必设置多个虚拟主机来使用 node-http-proxy 实现此目的,我将用示例更新答案
2021-05-11 23:17:01

您可以创建一个与您的应用程序并行的主应用程序(比如应用程序),并使用它初始化辅助应用程序(在您的情况下为 app1、app2、app3)

app.use('<the_context_you_need>', require('./app1/yourApp.js')

您所有的应用程序(app1、app2、app3)都需要创建应用程序并使用

var app = module.exports = express();

您无需在所有子应用程序中创建服务器实例或调用 app.listen;所有子应用程序都可以通过主应用程序侦听端口提供服务。