【问题标题】:Simple subdomain with Express带有 Express 的简单子域
【发布时间】:2018-10-06 14:53:54
【问题描述】:

我正在尝试在 AWS 的 MEAN 堆栈中使用 Express 作为我的服务器。但是,我在尝试设置子域时遇到了问题。我有我的主域名 domain.com 和 id 喜欢 app.domain.com .. 但是我已经尝试了我在网上找到的所有内容来将功能写入 server.js 文件,但没有任何效果。如何轻松完成此操作以使第二个功能而不是在我的 app.domain.com 子域中加载端口 8000 加载?提前致谢!

var express = require('express');
// Main Website
var web = express();
web.get('/', function (req, res){
    res.sendFile('/web/index.html', { root: '.' })
});

var port = 9000;
web.listen(port);
console.log('Web Listening on port', port);

//Main Application
var app = express();
app.get('/', function (req, res){
    res.sendFile('/app/index.html', { root: '.' })
});

var port = 8000;
app.listen(port);
console.log('Web Listening on port', port);

更新:

我在这里尝试使用 Vhost,但它为主域和子域加载相同的内容,因此它不起作用。这是我使用的代码:

var express = require('express');
var connect = require('connect');
var http = require('http');
var vhost = require('vhost');

// Main Website
var web = express();
web.get('/', function (req, res){
    res.sendFile('/web/index.html', { root: '.' })
});

var port = 9000;
web.listen(port);
console.log('Web Listening on port', port);

//Main Application
var app = connect()

app.use(vhost('app.domain.com', function (req, res) {
      res.sendFile('/app/index.html', { root: '.' })

  httpServer.emit('request', req, res)
}))

app.listen(8000)

我真的不需要将它们放在单独的端口上,这只是我最初尝试的方式。但无论哪种方式都行不通..

【问题讨论】:

  • 您是否为app.domain.com 配置了DNS?如果是这样,您是否将其指向与domain.com 相同的主机?如果是这样,那么您将需要像 nginx 这样的代理来将 app.domain.com 请求重定向到端口 8000,除非您想使用 URL 中的端口号,例如 http://app.domain.com:8000
  • 这叫做vhosting(虚拟主机)。它曾经是 express 的一部分,但被移到了它自己的模块中:github.com/expressjs/vhost
  • 我见过 vhost 但不确定如何编写我的 server.js 文件以真正使用它。
  • @Robert 我提供了一种方法,可以在同一个实例上拥有 2 个快速应用,并为来自不同域的每个应用提供服务。
  • 嗨,马科斯,我看到了,谢谢。明天早上我可以试试。我只是希望这会非常简单地通过快递本身来完成..

标签: node.js amazon-web-services express mean


【解决方案1】:

由于您使用的是 AWS,因此您可以使用 Application Load Balancer 来实现您的目标。

设置 ALB,并将两个域都指向 ALB CNAME。

然后您需要创建 2 个目标组,一个用于app.domain.com,另一个用于domain.com

目标组:应用

protocol: HTTP
port: 8000

目标组:网络

protocol: HTTP
port: 9000

将您的 EC2 实例附加到两个目标组

Target group > Targets > Edit > Add to registered

最后,您必须向 ALB 添加一个 HTTP 侦听器,并设置规则以将每个域转发到其目标组。

规则设置好后,当你进入app.domain.com时,ALB会将请求转发给你监听8000端口的express应用,浏览domain.com时会使用监听9000端口的那个。

【讨论】:

  • 谢谢你,我能够使用这种方法并让它工作得很好!
【解决方案2】:

如果您使用的是 Route53,我建议您使用 Records Set 通过 ip 地址将域和子域重定向到同一个 ec2 实例,然后您可以使用 ngix,就像本文中的 cmets 所说的 enter link description here

使用负载均衡器 (ALB) 每月产生的最低成本为 21.96 美元,但使用 Route53 最低成本为 1 美元或更少。

如果您不想使用像 nginx 这样的代理,您可以使用低成本的 s3 网站托管,大约 6 美元,路由 53 路由每月最低 1 美元,如果您有 REST API 服务,您可以从前端调用您的实例取决于访问的站点没有问题。

问候,

【讨论】:

  • 快递的重点不是不需要像nginx这样的东西吗??
【解决方案3】:

除了 node.js 之外的任何东西都不需要在一个端口上提供服务。只是基于http头的路由问题。

var express = require('express');
var http = require('http');
var vhost = require('vhost');

// Main Website
var webapp = express();
webapp.get('/', function (req, res){
    res.sendFile('/web/index.html', { root: '.' });
});

//Main Application
var mainapp = express();

mainapp.use(function (req, res) {
    res.sendFile('/app/index.html', { root: '.' });
}));


//Virtual Routing Application

var app = express();

app.use(vhost('app.domain.com', webapp));
app.use(vhost('domain.com', mainapp));
app.use(vhost('www.domain.com', mainapp));

app.listen(9000);

【讨论】:

  • 你如何处理提供静态文件?
  • 对于静态文件:expressjs.com/en/starter/static-files.html 在这种情况下类似于 mainapp.use(express.static('public_main')), webapp.use(express.static('public_app'))
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2019-07-26
  • 2011-05-10
  • 2019-11-15
  • 2013-10-21
相关资源
最近更新 更多