web-dev-qa-db-fra.com

Comment configurer nginx pour qu'il fonctionne avec Express?

J'essaie de configurer nginx pour qu'il proxy_pass demandes à mes applications de noeud. La question sur StackOverflow a obtenu de nombreuses votes positifs: https://stackoverflow.com/questions/5009324/node-js-nginx-and-now et j'utilise config à partir de là.

(mais puisque la question concerne la configuration du serveur, elle est censée être sur ServerFault)

Voici la configuration nginx:

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

  root /var/www/services.stefanow.net/public_html;
  index index.html index.htm;
  server_name services.stefanow.net;

  location / {
    try_files $uri $uri/ =404;
  }

  location /test-express {
    proxy_pass    http://127.0.0.1:3002;
  }    

  location /test-http {
    proxy_pass    http://127.0.0.1:3003;
  }
}

En utilisant un nœud simple:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(3003, '127.0.0.1');

console.log('Server running at http://127.0.0.1:3003/');

Ça marche! Vérifiez: http://services.stefanow.net/test-http

Utilisation express:

var express = require('express');
var app = express(); //

app.get('/', function(req, res) {
  res.redirect('/index.html');
});

app.get('/index.html', function(req, res) {
  res.send("blah blah index.html");
});

app.listen(3002, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3002/');

Cela ne fonctionne pas: ( Voir: http://services.stefanow.net/test-express


Je sais que quelque chose se passe.

a) test-express n'est PAS en cours d'exécution enter image description here

b) text-express est en cours d'exécution

enter image description here

(et je peux confirmer qu'il fonctionne via la ligne de commande alors que ssh sur le serveur)

root@stefanow:~# service nginx restart
 * Restarting nginx nginx                                                                                  [ OK ]

root@stefanow:~# curl localhost:3002
Moved Temporarily. Redirecting to /index.html

root@stefanow:~# curl localhost:3002/index.html
blah blah index.html

J'ai essayé de définir des en-têtes comme décrit ici: http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/ (ne fonctionne toujours pas)

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;

J'ai également essayé de remplacer '127.0.0.1' par 'localhost' et vice versa


S'il vous plaît donnez votre avis. Je suis sûr que certains détails évidents me manquent et j'aimerais en savoir plus. Je vous remercie.

12
Mars Robertson

Vous exprimez configuré pour servir le chemin /index.html, mais vous avez besoin de /test-express/index.html. Soit configure express pour servir /test-express/index.html ou faire nginx pour supprimer /test-exress de la demande par procuration. Ce dernier est aussi simple que d'ajouter des barres obliques à location et proxy_pass.

location /test-express/ {
  proxy_pass    http://127.0.0.1:3002/;
}

Voir http://nginx.org/r/proxy_pass pour plus de détails.

22
Alexey Ten