web-dev-qa-db-fra.com

Backend et Frontend sur le même port

J'ai une instance Windows ec2 sur AWS, qui répond avec une interface sur le port 80. Mon backend fonctionne sur le port 5000. Est-il possible d'héberger à la fois l'interface frontale et le backend sur le même port sans utiliser de port sur un client pour le reste API?

L'extrémité avant: 

www.example.com

Backend actuel:

www.example.com:5000

Ce que j'aimerais que ce soit:

www.example.com/backend/

Comment puis-je écrire un seul fichier index.js ou server.js pour les itinéraires Backend et Frontend?

5
Vivek Gautam

Bien sûr, il est trivial d’héberger les deux sur le même port, c’est juste une question de routage.

Par exemple, utiliser express.js et disposer de fichiers statiques (CSS, images, HTML, etc.) dans un dossier nommé 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!'))

Si vous créez un fichier public/index.html:

<html>HI</html>

Ensuite, vous pouvez l'obtenir (le "frontend") en exécutant curl 'localhost:80/':

$ curl 'localhost:80/'
<html>HI</html>
$

Vous pouvez également accéder à votre "backend":

$ curl 'localhost:80/backend'
Hello World!
$
2
Avery

Je vous recommande de séparer vos points de terminaison de service en Sous-domaines

Point de terminaison de service

Le noeud final est un point de connexion où les fichiers HTML ou les pages du serveur actif sont exposés. Les points finaux fournissent les informations nécessaires pour adresser un point final de service Web. Le noeud final fournit une référence ou une spécification utilisée pour définir un groupe ou une famille de propriétés d’adressage de messages et pour donner des caractéristiques de message de bout en bout, telles que des références pour la source et la destination des noeuds finaux, ainsi que l’identité des messages permettant une application uniforme adressage de messages "indépendants". Le point final peut être un PC, un PDA ou un terminal de point de vente Référence:Définition du point de terminaison service .

Pour votre terminal frontend, le sous-domaine recommandé est:

  • http://www.example.com
  • http://example.comDans ce cas, vous devez rediriger vers le sous-domaine www

Pour votre point de terminaison Backend, vous pouvez utiliser ce que vous voulez, mais les sous-domaines recommandés pour Backend sont les suivants:

  • http://api.example.com (Le plus utilisé)
  • http://backend.example.com

Donc, dans votre cas, les recommandations sont les suivantes:

Vous pouvez y parvenir en utilisant un proxy inverse tel que Nginx ou en récupérant le sous-domaine à partir de l'objet de requête dans NodeJs.

Nginx est un serveur Web qui peut également être utilisé en tant que proxy inverse, équilibreur de charge et cache HTTP. Le logiciel a été créé par Igor Sysoev et publié pour la première fois en 2004. Une société du même nom a été fondée en 2011 pour fournir une assistance.

Première approche

Utilisation de Nginx comme équilibreur de charge HTTP

Vous pouvez configurer Nginx pour équilibrer les requêtes adressées à votre serveur comme suit:

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;
        }
    }
}

Deuxième approche

Utilisez expressjs pour obtenir le sous-domaine de l’objet request.

req.subdomains

Un tableau de sous-domaines dans le nom de domaine de la demande.

Documentation:

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

Dans votre cas, vos sous-domaines possibles sont: www ou api

// Host: "www.example.com"
req.subdomains
// => ["www"]

Ou

// Host: "api.example.com"
req.subdomains
// => ["api"]

Voici comment vous devez traiter la demande dans votre server.js

var subDomain = req.subdomains[0];

if (subdomain === 'api') {
    processBackendRequest();
} else {
    processFrontendRequest();
}
5
Ele

Le seul moyen efficace d'éviter de spécifier un numéro de port est d'utiliser post 80 pour HTTP ou 443 pour HTTPS.

Si vous exécutez IIS, vous pouvez faire fonctionner votre site Web en tant que site Web appelé "exemple.com". Sous ce site, vous disposez d'une autre "application" appelée "backend".

Toutes les requêtes HTTP pour www.example.com iraient au site Web racine. Les demandes adressées à www.example.com/backend seraient acheminées vers l'application "backend" située sur le site Web example.com.

ServerFault est peut-être un endroit plus approprié pour poser des questions à IIS.

0
Phil Golding