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.

92voto

josh3736 Points 41911

Choisissez l'une des options :

  • Utilisez un autre serveur (comme nginx) en tant que proxy inverse.
  • Utilisez node-http-proxy en tant que proxy inverse.
  • Utilisez le middleware vhost si chaque domaine peut être servi à partir du même codebase Connect/Express et de la même instance node.js.

59voto

Ádám Points 7529

Diet.js a une manière très agréable et simple d'héberger plusieurs domaines avec la même instance de serveur. Vous pouvez simplement appeler un nouveau server() pour chacun de vos domaines.

Un exemple simple

// Require diet
var server = require('diet');

// Domaine principal
var app = server()
app.listen('http://example.com/')
app.get('/', function($){
    $.end('hello world ')
})

// Sous-domaine
var sub = server()
sub.listen('http://subdomain.example.com/')
sub.get('/', function($){
    $.end('hello world at sub domain!')
})

// Autre domaine
var other = server()
other.listen('http://other.com/')
other.get('/', function($){
    $.end('hello world at other domain')
})

Séparer vos applications

Si vous souhaitez avoir des dossiers différents pour vos applications, vous pourriez avoir une structure de dossier comme ceci :

/server
   /votreApp
       /node_modules
       index.js
   /votreAutreApp
       /node_modules
       index.js
   /node_modules
   index.js

Dans /server/index.js, vous devriez exiger chaque application par son dossier :

require('./votreApp')
require('./votreAutreApp')

Dans /server/votreApp/index.js, vous configureriez votre premier domaine comme ceci :

// Require diet
var server = require('diet')

// Créer l'application
var app = server()
app.listen('http://example.com/')
app.get('/', function($){
    $.end('hello world ')
})

Et dans /server/votreAutreApp/index.js, vous configureriez votre deuxième domaine comme ceci :

// Require diet
var server = require('diet')

// Créer l'application
var app = server()
app.listen('http://other.com/')
app.get('/', function($){
    $.end('hello world at other.com ')
});

En savoir plus :

25voto

Krasimir Points 6061

Hm ... pourquoi pensez-vous que nodejs devrait agir comme un proxy. Je suggère de faire tourner plusieurs applications node écoutant sur différents ports. Ensuite, utilisez nginx pour rediriger la requête vers le bon port. Si vous utilisez un seul nodejs, vous aurez également un seul point de défaillance. Si cette application plante, alors tous les sites tomberont en panne.

16voto

Scott Puleo Points 3656

Utilisez nginx comme proxy inverse.

http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/

Nginx apporte toute une gamme d'avantages à vos applications sous forme de mise en cache, de gestion de fichiers statiques, de SSL et d'équilibrage de charge.

14voto

fuelusumar Points 56

J'ai une API que j'utilise sur un site et ci-dessous est ma configuration. Je l'ai aussi avec SSL et GZIP, si quelqu'un en a besoin, il suffit de me laisser un commentaire.

var http = require('http'),
    httpProxy = require('http-proxy');

var proxy_web = new httpProxy.createProxyServer({
        target: {
            host: 'localhost',
            port: 8080
        }
    });

    var proxy_api = new httpProxy.createProxyServer({
        target: {
            host: 'localhost',
            port: 8081
        }
    });

    http.createServer(function(req, res) {
        if (req.headers.host === 'http://www.domain.com') {
            proxy_web.proxyRequest(req, res);
            proxy_web.on('error', function(err, req, res) {
                if (err) console.log(err);
                res.writeHead(500);
                res.end('Oups, quelque chose s'est très mal passé...');
            });
        } else if (req.headers.host === 'http://api.domain.com') {
            proxy_api.proxyRequest(req, res);
            proxy_api.on('error', function(err, req, res) {
                if (err) console.log(err);
                res.writeHead(500);
                res.end('Oups, quelque chose s'est très mal passé...');
            });
        }
    }).listen(80);

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