同一端口的后端和前端

时间:2018-01-17 15:24:08

标签: node.js amazon-web-services frontend backend

我在AWS上有一个ec2 Windows实例,它在端口80上有一个前端。我的后端在端口5000上运行。有没有办法在不使用客户端上的任何端口的情况下在同一端口上托管前端和后端对于其余的API?

前端:

www.example.com

当前后端:

www.example.com:5000

我希望它是什么:

www.example.com/backend/

如何为后端和前端路由编写单个index.js或server.js文件?

3 个答案:

答案 0 :(得分:5)

我建议您在Subdomains

中分隔您的服务端点
  

服务端点

     

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

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

  • 的http:// www .example.com的
  • http://example.com 在这种情况下,您必须重定向到子域www

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

  • http:// api .example.com(最常用的)
  • 的http:// 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从请求对象中获取子域。

req.subdomains

  

请求域名中的子域数组。

<强>文档

// Host: "tobi.ferrets.example.com"
req.subdomains
// => ["ferrets", "tobi"]

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

// 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问题的地方。