Viv*_*tam 9 frontend backend amazon-web-services node.js
我在AWS上有一个ec2 Windows实例,它在端口80上使用前端进行响应.我的后端在端口5000上运行.有没有办法在同一端口上托管前端和后端,而不使用客户端上的任何端口API?
前端:
www.example.com
Run Code Online (Sandbox Code Playgroud)
当前后端:
www.example.com:5000
Run Code Online (Sandbox Code Playgroud)
我希望它是什么:
www.example.com/backend/
Run Code Online (Sandbox Code Playgroud)
如何为后端和前端路由编写单个index.js或server.js文件?
当然,将两者托管在同一端口上很简单,这只是一个路由问题。
例如,express.js在名为 的文件夹中使用并拥有静态文件(CSS、图像、HTML 等)public:
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!'))
Run Code Online (Sandbox Code Playgroud)
如果你制作一个文件public/index.html:
<html>HI</html>
Run Code Online (Sandbox Code Playgroud)
然后你可以通过运行来获取它(“前端”)curl 'localhost:80/':
$ curl 'localhost:80/'
<html>HI</html>
$
Run Code Online (Sandbox Code Playgroud)
您还可以访问您的“后端”:
$ curl 'localhost:80/backend'
Hello World!
$
Run Code Online (Sandbox Code Playgroud)
服务端点
端点是公开HTML文件或活动服务器页面的连接点.端点提供寻址Web服务端点所需的信息.端点提供了一个引用或规范,用于定义消息寻址属性的组或系列,并提供端到端消息特征,例如端点源和目标的引用,以及允许统一的消息标识寻址"独立"信息.端点可以是PC,PDA或销售点终端参考: 服务端点的定义.
www.example.comwwwapi.example.com(最常用)backend.example.com您可以使用像Nginx这样的反向代理或从NodeJ中的请求对象获取子域来实现这一点.
Nginx是一个Web服务器,也可以用作反向代理,负载均衡器和HTTP缓存.该软件由Igor Sysoev创建,于2004年首次公开发布.同名公司成立于2011年,以提供支持.
您可以配置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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用expressjs从请求对象中获取子域.
请求的域名中的一组子域.
文档:
// Host: "tobi.ferrets.example.com"
req.subdomains
// => ["ferrets", "tobi"]
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您可能的子域名是:www或api
// Host: "www.example.com"
req.subdomains
// => ["www"]
Run Code Online (Sandbox Code Playgroud)
要么
// Host: "api.example.com"
req.subdomains
// => ["api"]
Run Code Online (Sandbox Code Playgroud)
这就是你必须在你的网站内处理请求的方法 server.js
var subDomain = req.subdomains[0];
if (subdomain === 'api') {
processBackendRequest();
} else {
processFrontendRequest();
}
Run Code Online (Sandbox Code Playgroud)