我在AWS上有一个ec2 Windows实例,它在端口80上有一个前端。我的后端在端口5000上运行。有没有办法在不使用客户端上的任何端口的情况下在同一端口上托管前端和后端对于其余的API?
前端:
www.example.com
当前后端:
www.example.com:5000
我希望它是什么:
www.example.com/backend/
如何为后端和前端路由编写单个index.js或server.js文件?
答案 0 :(得分:5)
服务端点
端点是公开HTML文件或活动服务器页面的连接点。端点提供寻址Web服务端点所需的信息。端点提供了一个引用或规范,用于定义消息寻址属性的组或系列,并提供端到端消息特征,例如端点源和目标的引用,以及允许统一的消息标识寻址“独立”信息。终端可以是PC,PDA或销售点终端参考: Definition of service endpoint。
www
.example.com的www
api
.example.com(最常用的)backend
.example.com的您可以使用反向代理(如Nginx)或从NodeJ中的请求对象获取子域来实现此目的。
Nginx 是一个Web服务器,也可以用作反向代理,负载均衡器和HTTP缓存。该软件由Igor Sysoev创建,于2004年首次公开发布。2011年成立了一家同名公司,以提供支持。
Using Nginx as HTTP load balancer
您可以配置Nginx以平衡对服务器的请求,如下所示:
http {
upstream backend {
server localhost:5000;
}
upstream frontend {
server localhost;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
}
}
server {
listen 80;
server_name www.example.com example.com;
location / {
proxy_pass http://frontend;
}
}
}
使用expressjs从请求对象中获取子域。
请求域名中的子域数组。
<强>文档强>
// Host: "tobi.ferrets.example.com"
req.subdomains
// => ["ferrets", "tobi"]
在您的情况下,您可能的子域名为:www
或api
// Host: "www.example.com"
req.subdomains
// => ["www"]
或者
// Host: "api.example.com"
req.subdomains
// => ["api"]
这是您在server.js
var subDomain = req.subdomains[0];
if (subdomain === 'api') {
processBackendRequest();
} else {
processFrontendRequest();
}
答案 1 :(得分:2)
当然,在同一个端口上托管这两个端口是微不足道的,这只是一个路由问题。
例如,使用express.js
并在名为public
的文件夹中包含静态文件(CSS,图像,HTML等):
const express = require('express')
const app = express()
app.use('/', express.static('public'))
app.get('/backend', (req, res) => res.send('Hello World!'))
app.listen(80, () => console.log('Example app listening on port 80!'))
如果您制作文件public/index.html
:
<html>HI</html>
然后你可以通过运行curl 'localhost:80/'
:
$ curl 'localhost:80/'
<html>HI</html>
$
您还可以访问“后端”:
$ curl 'localhost:80/backend'
Hello World!
$
答案 2 :(得分:0)
防止必须指定端口号的唯一真正方法是使用post 80 for HTTP,或443 for HTTPS。
如果您正在运行IIS,您可以将您的前端作为名为“example.com”的网站运行,然后在该网站下面有另一个名为“后端”的“应用程序”。
www.example.com的所有HTTP请求都将转到根网站。对www.example.com/backend的请求将路由到example.com网站下的“后端”应用程序。
然而,ServerFault可能是一个更适合询问IIS问题的地方。