Question 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 devraient-ils travailler ensemble? Comment dois-je gérer les demandes?
  2. Il y a 2 concepts pour un serveur Node.js, lequel est le meilleur:

    une. Créez un serveur HTTP distinct pour chaque site Web qui en a besoin. Puis charger tout le code JavaScript au début du programme, de sorte que le code est interprété une fois.

    b. Créez un seul serveur Node.js qui gère toutes les requêtes Node.js. Cela lit les fichiers demandés et évalue leur contenu. Ainsi, les fichiers sont interprétés à chaque requête, mais la logique du serveur est beaucoup plus simple.

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


856
2018-02-15 20:49


origine


Réponses:


Nginx fonctionne comme un serveur frontal, qui, dans ce cas, transfère les requêtes à un serveur node.js. Par conséquent, vous devez configurer un fichier de configuration nginx pour le noeud.

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

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

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

Dans ce cas, vous devriez avoir 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 voulez que nginx (> = 1.3.13) gère aussi les requêtes websocket, ajoutez les lignes suivantes dans le location / section:

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

Une fois que vous avez cette configuration, 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 noeud à /var/www/yourdomain/app.js et lancez-le 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/');

Tester les erreurs de syntaxe:

nginx -t

Redémarrez nginx:

sudo /etc/init.d/nginx restart

Enfin, démarrez le serveur de noeud:

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

Maintenant, vous devriez voir "Hello World" sur votredomaine.com

Une dernière remarque concernant le démarrage du serveur de noeud: vous devriez utiliser un système de surveillance pour le démon de noeud. Il y a un génial tutoriel sur le noeud avec upstart et monit.


1177
2018-02-16 10:20



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

Par exemple pour atteindre ces:

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

146
2018-05-02 11:38



Vous pouvez également avoir différentes URL pour les applications dans une configuration de serveur:

Dans / etc / nginx / sites-enabled / votredomaine:

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;

    location ^~ /app1/{
        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://127.0.0.1:3000/;
    }

    location ^~ /app2/{
        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://127.0.0.1:4000/;
    }
}

Redémarrez nginx:

sudo service nginx restart

Démarrer des applications.

nœud app1.js

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

nœud app2.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app2!\n');
}).listen(4000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:4000/');

44
2018-03-31 17:31



Je proxy des applications Node Express indépendantes via Nginx.

Ainsi, de nouvelles applications peuvent être facilement montées et je peux également exécuter d'autres tâches sur le même serveur à différents endroits.

Voici plus de détails sur ma configuration avec l'exemple de configuration de Nginx:

Déployer plusieurs applications de nœud sur un serveur Web dans des sous-dossiers avec Nginx

Les choses deviennent difficiles avec Node lorsque vous devez déplacer votre application de localhost à Internet.

Il n'y a pas d'approche commune pour le déploiement des nœuds.

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

Fondamentalement, j'ai un serveur Web et je veux que les applications de noeud soient montées aux sous-dossiers (c.-à-d. http: // myhost / demo / animal-projet /) sans introduire de dépendance de la configuration au 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 hein? Apparemment non.

Dans de nombreux exemples sur le Web, les applications Node s'exécutent sur le port 80 ou sont envoyées par Nginx à la racine.

Même si les 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 Nginx et 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/;
  }
}

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

First Nginx vérifie si la ressource demandée est un fichier statique disponible à / opt / demo / pet-project / public / et si c'est le cas, il sert comme c'est très efficace, donc nous n'avons pas besoin d'avoir une couche redondante comme Connect middleware statique.

Ensuite, toutes les autres demandes sont remplacées et remplacées Noeud de projet animal application, de sorte que l'application Node n'a pas besoin de savoir où elle est réellement montée et peut donc être déplacée n'importe où uniquement par configuration.

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

Vous pouvez facilement répliquer cette configuration pour plusieurs applications de nœud exécutées sur différents ports et ajouter plus de gestionnaires d'emplacement à d'autres fins.

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


26
2017-07-13 07:53



Node.js avec la configuration Nginx.

$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com

ajoutez la configuration suivante afin que Nginx agissant en tant que proxy redirige vers le trafic du port 3000 à partir du serveur lorsque nous venons de "subdomain.your_domain.com"

upstream subdomain.your_domain.com {
  server 127.0.0.1:3000;
}
server {
  listen 80;
  listen [::]:80;
  server_name subdomain.your_domain.com;
  access_log /var/log/nginx/subdomain.your_domain.access.log;
  error_log /var/log/nginx/subdomain.your_domain.error.log debug;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://subdomain.your_domain.com;
    proxy_redirect off;
  }
}

8
2018-03-17 12:24



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 va faire en sorte que le serveur consomme beaucoup de mémoire, en chargeant tous les fichiers dont vous avez besoin (même si j'aime le php, c'est l'un des problèmes). Avec l'option 'b' vous pouvez charger vos bibliothèques (code réutilisable) et les partager parmi toutes les demandes des clients.

Mais soyez avisé que si vous avez plusieurs cœurs, vous devriez modifier node.js pour les utiliser tous.


6
2018-01-03 04:51



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 desservies par nœud, et d'autres par nginx (statique).

Avoir certains d'entre eux servis par nginx augmente votre performance.


5
2017-07-05 14:17