同一端口的后端和前端

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文件?

Ave*_*ery 7

当然,将两者托管在同一端口上很简单,这只是一个路由问题。

例如,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)


Ele*_*Ele 7

我建议您将子域中的服务端点分开

服务端点

端点是公开HTML文件或活动服务器页面的连接点.端点提供寻址Web服务端点所需的信息.端点提供了一个引用或规范,用于定义消息寻址属性的组或系列,并提供端到端消息特征,例如端点源和目标的引用,以及允许统一的消息标识寻址"独立"信息.端点可以是PC,PDA或销售点终端参考: 服务端点的定义.

对于您的前端端点,建议的子域是:

对于您的后端端点,您可以使用任何您想要的,但后端的推荐子域是:

  • http:// api.example.com(最常用)
  • http:// backend.example.com

因此,在您的情况下,建议是:

您可以使用像Nginx这样的反向代理或从NodeJ中的请求对象获取子域来实现这一点.

Nginx是一个Web服务器,也可以用作反向代理,负载均衡器和HTTP缓存.该软件由Igor Sysoev创建,于2004年首次公开发布.同名公司成立于2011年,以提供支持.

第一种方法

使用Nginx作为HTTP负载均衡器

您可以配置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从请求对象中获取子域.

req.subdomains

请求的域名中的一组子域.

文档:

// Host: "tobi.ferrets.example.com"
req.subdomains
// => ["ferrets", "tobi"]
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可能的子域名是:wwwapi

// 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)