web-dev-qa-db-fra.com

Comment dois-je organiser plusieurs serveurs Express sur le même système?

J'utilise un serveur pour héberger plusieurs applications Web Node.js, qui sont réparties sur plusieurs domaines. Ma pratique actuelle consiste à exécuter un serveur Express pour chaque application sur un port différent et à exécuter un serveur de base qui achemine (redirige) simplement les demandes vers le port/serveur Express approprié. Cela fonctionne, mais cela signifie que mon serveur de base achemine chaque requête HTTP unique (et en la redirigeant manuellement), et que mes utilisateurs voient mes applications comme hébergées sur [hostname.com]: 8000.

Après un peu de recherche, j'ai découvert que je peux utiliser http-proxy pour mes besoins de routage, mais j'aimerais toujours savoir s'il existe une meilleure pratique pour exécuter plusieurs serveurs Express sur le même système. Voici comment je prévois de le faire:

Chaque application web aura son propre dossier, avec une structure de dossier Express complète (app.js, routes, vues, etc.). Les applications seront regroupées par domaine, donc un exemple de structure de dossier serait:

    hostname.com/
        app.js
        routes/
        views/
        ...
        app1/
            app1.js
            routes/
            views/
            ...
        app2
        ...
    hostname2.com/
        app.js
        routes/
        views/
        ...

Je vais devoir exécuter chaque app.js séparément avec le nœud (ou avec forever , que j'utilise actuellement), et chacun devra utiliser un port différent en interne, avec des redirections inter-applications étant pointé sur le port de l'application cible.

Voilà mon plan actuel. Quels sont les problèmes et quels pièges devrais-je essayer d'éviter? Plus important encore, existe-t-il une solution établie à ce problème - le problème de l'hébergement de plusieurs applications Web sur le même système avec Node.js/Express?

EDIT: Je prévois d'utiliser éventuellement WebSockets et HTTPS, et la quantité de bande passante que ma configuration peut prendre en charge a peu d'importance pour moi - il s'agit d'un serveur de développement (au moins pour l'instant). Merci à David Ellis d'avoir soulevé la question des WebSockets.

DEUXIÈME ÉDITION: Merci à EhevuTov et à David Ellis pour leurs réponses, qui ont toutes deux grandement aidé. Je suis toujours en train de m'installer sur une structure globale pour mon application, et il semble que cette question soit traitée en détail par cette question StackOverflow

TROISIÈME ÉDITION: J'ai parcouru un chemin depuis la publication de cette question (même si j'ai encore beaucoup à faire). Découvrez ce fichier dans mon référentiel GitHub , qui tire parti de ce que j'ai appris des réponses à cette question!

44
Aaron

Comme Express utilise Connect , je suis presque sûr que vous pouvez utiliser le middleware hôte virtuel de Connect. Il fonctionne de manière similaire à d'autres modules vhost sur d'autres produits. Je n'ai pas plusieurs domaines pour tester et vous montrer le code approprié, mais je pense que c'est quelque chose comme ça:

express.createServer()
.use(express.vhost('hostname1.com', require('/path/to/hostname1').app)
.use(express.vhost('hostname2.com', require('/path/to/hostname2').app)
.listen(80)

Si vous arrivez au point où un serveur Express ne suffit pas, essayez d'utiliser Node.Cluster à partir de l'API. Si cela ne suffit pas non plus, la pratique actuelle consiste à placer un proxy inverse asnyc tel que Nginx devant vos serveurs Express et à pointer les proxys vers vos serveurs Express.

35
EhevuTov

Si vous n'avez pas besoin d'utiliser WebSockets (ou n'importe quelle fonctionnalité HTTP 1.1, vraiment), vous pouvez utiliser NginX comme proxy à la place .

L'avantage est la charge totale que NginX peut gérer par rapport à Node est plus élevé (étant compilé statiquement et spécialisé pour ce genre de chose, en gros), mais vous perdez la possibilité de diffuser toutes les données (en envoyant de plus petits morceaux à la fois).

Pour un site plus petit, ou si vous n'êtes pas sûr des fonctionnalités dont vous aurez besoin à l'avenir, il vaut probablement mieux s'en tenir à node-http-proxy et ne passez à NginX que si vous pouvez démontrer que le proxy est le goulot d'étranglement sur votre serveur. Heureusement, NginX n'est pas difficile à configurer si vous en avez besoin plus tard.

6
user1207456