106 votes

Comment héberger plusieurs sites Node.js sur la même IP/serveur avec différents domaines?

J'ai un serveur linux avec une seule IP liée à celui-ci. Je veux héberger plusieurs sites Node.js sur ce serveur sur cette IP, chacun (évidemment) avec un domaine ou un sous-domaine unique. Je veux qu'ils soient tous sur le port 80.

Quelles sont mes options pour le faire ?

Une solution évidente semble être d'avoir tous les domaines desservis par une application web node.js qui agit comme un proxy et effectue un transfert vers les autres applications node.js s'exécutant sur des ports uniques.

7voto

user568109 Points 21253

Si vous utilisez le serveur connect/express, vous pouvez voir le middleware vhost. Cela permettra d'utiliser plusieurs domaines (sous-domaines) pour l'adresse du serveur.

Vous pouvez suivre l'exemple donné ici, qui ressemble exactement à ce dont vous avez besoin.

7voto

papiro Points 82

Voici comment le faire en utilisant vanilla Node.js :

const http = require('http')
const url = require('url')
const port = 5555
const sites = {
  exampleSite1: 544,
  exampleSite2: 543
}

const proxy = http.createServer( (req, res) => {
  const { pathname:path } = url.parse(req.url)
  const { method, headers } = req
  const hostname = headers.host.split(':')[0].replace('www.', '')
  if (!sites.hasOwnProperty(hostname)) throw new Error(`nom d'hôte invalide ${hostname}`)

  const proxiedRequest = http.request({
    hostname,
    path,
    port: sites[hostname],
    method,
    headers 
  })

  proxiedRequest.on('response', remoteRes => {
    res.writeHead(remoteRes.statusCode, remoteRes.headers)  
    remoteRes.pipe(res)
  })
  proxiedRequest.on('error', () => {
    res.writeHead(500)
    res.end()
  })

  req.pipe(proxiedRequest)
})

proxy.listen(port, () => {
  console.log(`proxy inverse en écoute sur le port ${port}`)
})

Plutôt simple, non ?

4voto

Khnle - Kevin Le Points 3415

Tout d'abord, installez forever et bouncy.

Ensuite, écrivez un script de démarrage. Dans ce script, ajoutez une règle à l'utilitaire de pare-feu iptables pour lui indiquer de rediriger le trafic du port 80 vers le port 8000 (ou tout autre port que vous choisissez). Dans mon exemple, 8000 est où je fais tourner bouncy

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000

En utilisant forever, disons au script de lancer bouncy sur le port 8000

forever start --spinSleepTime 10000 /chemin/vers/bouncy /chemin/vers/bouncy/routes.json 8000

Le routes.json ressemblerait à quelque chose comme ça

{
    “sousdomaine1.domaine.com" : 5000,
    “sousdomaine2.domaine.com" : 5001,
    “sousdomaine3.domaine.com" : 5002
}

L'application NodeJS1, l'application2 et l'application3 tournent respectivement sur les ports 5000, 5001 et 5002.

Le script que j'utilise dans mon cas peut être trouvé ici et vous devrez peut-être le modifier un peu pour l'adapter à votre environnement.

J'en ai aussi écrit plus en détail et vous pouvez le trouver ici.

3voto

toshi Points 1568

Ceci est mon projet de démonstration le plus simple sans aucun middleware ou proxy.
Cela nécessite seulement quelques lignes de code, et c'est suffisant.

https://github.com/hitokun-s/node-express-multiapp-demo

Avec cette structure, vous pouvez facilement configurer et maintenir chaque application de manière indépendante.
J'espère que cela vous sera utile.

3voto

Michaaatje Points 163

Littéralement, lorsque vous obtenez l'objet de demande et de réponse, vous pouvez obtenir le domaine via "request.headers.host"... (pas l'adresse IP, en fait le domaine).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X