1104 votes

Node.js + Nginx - Et maintenant ?

J'ai installé Node.js et Nginx sur mon serveur. Maintenant je veux l'utiliser, mais, avant de commencer il y a 2 questions :

  1. Comment doivent-ils travailler ensemble ? Comment dois-je traiter les demandes ?
  2. Il y a 2 concepts pour un serveur Node.js, lequel est le meilleur :

    a. Créez un serveur HTTP distinct pour chaque site Web qui en a besoin. Chargez ensuite tout le code JavaScript au début du programme, afin que le code soit interprété une seule fois.

    b. Créez un seul serveur Node.js qui gère toutes les demandes Node.js. Il lit les fichiers demandés et évalue leur contenu. Les fichiers sont donc interprétés à chaque demande, mais la logique du serveur est beaucoup plus simple.

Il n'est pas clair pour moi comment utiliser Node.js correctement.

1400voto

Joao Da Silva Points 6629

Nginx fonctionne comme un serveur frontal, qui, dans ce cas, transmet les demandes à un serveur node.js. Par conséquent, vous devez configurer un fichier de configuration nginx pour node.

C'est ce que j'ai fait dans ma boîte Ubuntu :

Créer le fichier yourdomain.com en /etc/nginx/sites-available/ :

vim /etc/nginx/sites-available/yourdomain.com

Vous devriez y trouver quelque chose comme :

# the IP(s) on which your node server is running. I chose port 3000.
upstream app_yourdomain {
    server 127.0.0.1:3000;
    keepalive 8;
}

# the nginx server instance
server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com www.yourdomain.com;
    access_log /var/log/nginx/yourdomain.com.log;

    # pass the request to the node.js server with the correct headers
    # and much more can be added, see nginx config options
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://app_yourdomain/;
      proxy_redirect off;
    }
 }

Si vous souhaitez que nginx (>= 1.3.13) gère également les requêtes websocket, ajoutez les lignes suivantes dans le fichier location / section :

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Une fois cette configuration effectuée, vous devez activer le site défini dans le fichier de configuration ci-dessus :

cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com

Créez votre application de serveur de nœuds à /var/www/yourdomain/app.js et l'exécuter à localhost:3000

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

Recherchez les erreurs de syntaxe :

nginx -t

Redémarrez nginx :

sudo /etc/init.d/nginx restart

Enfin, démarrez le serveur de nœuds :

cd /var/www/yourdomain/ && node app.js

Vous devriez maintenant voir "Hello World" sur votredomaine.com.

Une dernière remarque concernant le démarrage du serveur de nœuds : vous devriez utiliser une sorte de système de surveillance pour le démon de nœuds. Il existe un excellent tutoriel sur node avec upstart et monit .

11 votes

Merci pour le post, est-ce que nginx va mettre en cache les réponses node.js pour le serveur ci-dessus, ou les réexécuter à chaque fois.

86 votes

Y a-t-il une raison pour laquelle vous ne pouvez pas simplement faire location / { proxy_pass http://127.0.0.1:3000; } ? Pourquoi avez-vous besoin de l'ensemble upstream bit de configuration ?

1 votes

Le bloc amont est juste pour organiser / factoriser des choses, vous n'êtes pas obligé de l'utiliser.

182voto

250R Points 5600

Vous pouvez également configurer plusieurs domaines avec nginx, en les transférant vers plusieurs processus node.js.

Par exemple pour les réaliser :

Ces ports (4000 et 5000) doivent être utilisés pour écouter les requêtes de l'application dans votre code d'application.

/etc/nginx/sites-enabled/domain1

server {
    listen 80;
    listen [::]:80;
    server_name domain1.com;
    access_log /var/log/nginx/domain1.access.log;
    location / {
        proxy_pass    http://127.0.0.1:4000/;
    }
}

Dans /etc/nginx/sites-enabled/domain2

server {
    listen 80;
    listen [::]:80;
    server_name domain2.com;
    access_log /var/log/nginx/domain2.access.log;
    location / {
        proxy_pass    http://127.0.0.1:5000/;
    }
}

5 votes

J'utilise votre méthode de proxy_pass, mais pour une raison quelconque http://example.com obtient automatiquement 302 d à http://www.example.com . Pourquoi ?

0 votes

Avez-vous Cloudflare ou quelque chose de similaire ? La configuration ci-dessus ne devrait pas rediriger du tout.

1 votes

@Kristian Vous devrez ajouter proxy_set_header Host $host pour éviter la redirection HTTP 302.

36voto

skovalyov Points 1009

Je proxye des applications Node Express indépendantes à travers Nginx.

Ainsi, de nouvelles applications peuvent être facilement montées et je peux également faire tourner d'autres choses sur le même serveur à différents endroits.

Voici plus de détails sur mon installation avec un exemple de configuration de Nginx :

Déployer plusieurs applications Node sur un serveur web dans des sous-dossiers avec Nginx

Les choses se compliquent avec Node lorsque vous devez déplacer votre application du localhost vers l'internet.

Il n'existe pas d'approche commune pour le déploiement de Node.

Google peut trouver des tonnes d'articles sur ce sujet, mais j'avais du mal à trouver la solution adéquate pour la configuration dont j'ai besoin.

Fondamentalement, j'ai un serveur web et je veux que les applications Node soient montées dans des sous-dossiers (c'est à dire http://myhost/demo/pet-project/ ) sans introduire de dépendance de configuration dans le code de l'application.

En même temps, je veux que d'autres choses comme le blog fonctionnent sur le même serveur web.

Cela semble simple, non ? Apparemment non.

Dans de nombreux exemples sur le web, les applications Node fonctionnent soit sur le port 80, soit par procuration par Nginx vers le Root.

Même si ces deux approches sont valables pour certains cas d'utilisation, elles ne répondent pas à mes critères simples mais un peu exotiques.

C'est pourquoi j'ai créé ma propre configuration de Nginx et en voici un extrait :

upstream pet_project {
  server localhost:3000;
}

server {
  listen 80;
  listen [::]:80;
  server_name frontend;

  location /demo/pet-project {
    alias /opt/demo/pet-project/public/;
    try_files $uri $uri/ @pet-project;
  }

  location @pet-project {
    rewrite /demo/pet-project(.*) $1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://pet_project;
    proxy_redirect http://pet_project/ /demo/pet-project/;
  }
}

Dans cet exemple, vous pouvez remarquer que je monte mon application Node Pet Project fonctionnant sur le port 3000 vers http://myhost/demo/pet-project .

Nginx vérifie d'abord si la ressource demandée est un fichier statique disponible à l'adresse suivante /opt/demo/pet-project/public/ et si c'est le cas, il le sert tel quel, ce qui est très efficace. Nous n'avons donc pas besoin d'une couche redondante comme le middleware statique Connect.

Ensuite, toutes les autres demandes sont écrasées et envoyées par procuration à Nœud du projet Pet L'application Node n'a donc pas besoin de savoir où elle est réellement montée et peut donc être déplacée n'importe où par simple configuration.

proxy_redirect est indispensable pour gérer correctement l'en-tête Location. C'est extrêmement important si vous utilisez res.redirect() dans votre application Node.

Vous pouvez facilement reproduire cette configuration pour plusieurs applications Node fonctionnant sur des ports différents et ajouter d'autres gestionnaires d'emplacement à d'autres fins.

De : http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html

1 votes

Pourquoi et comment le faire plutôt dans des sous-domaines : skovalyov.blogspot.dk/2012/10/

0 votes

Réponse sous forme de lien uniquement pouvez-vous résumer les parties pertinentes de votre réponse au cas où votre blog ne serait plus disponible ?

9voto

hugo_leonardo Points 1936

Répondre à votre question 2 :

J'utiliserais l'option b simplement parce qu'il consomme beaucoup moins de ressources. avec l'option 'a', chaque client fera consommer au serveur beaucoup de mémoire, en chargeant tous les fichiers dont vous avez besoin (même si j'aime bien php, c'est l'un des problèmes avec lui). Avec l'option 'b', vous pouvez charger vos bibliothèques (code réutilisable) et les partager entre toutes les requêtes des clients.

Mais attention, si vous avez plusieurs cœurs, vous devez modifier node.js pour les utiliser tous.

2 votes

Suivez ce conseil si les ressources sont votre problème le plus important (peu probable). Il existe différents compromis entre (a) et (b). L'option (a) est probablement meilleure si vous souhaitez que les sites soient plus indépendants, par exemple en ce qui concerne le redémarrage ou la maintenance du site, les connexions aux bases de données, la base de code, les dépendances des bibliothèques, le déplacement des sites entre les serveurs, etc.

6voto

matejkramny Points 1853

Vous pouvez également utiliser node.js pour générer des fichiers statiques dans un répertoire servi par nginx. Bien sûr, certaines parties dynamiques de votre site pourraient être servies par node, et d'autres par nginx (statiques).

Le fait que certains d'entre eux soient servis par nginx augmente vos performances

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