Comment configurer nginx pour qu'il fonctionne avec Express?

12

J'essaie de configurer nginx pour qu'il proxy_passdemande à mes applications de nœud. La question sur StackOverflow a suscité de nombreux votes positifs: /programming/5009324/node-js-nginx-and-now et j'utilise la configuration à partir de là.

(mais comme 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 entrez la description de l'image ici

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

entrez la description de l'image ici

(et je peux confirmer qu'il fonctionne via la ligne de commande pendant 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.

Mars Robertson
la source
Un journal d' nginxerreur dans le journal?
masegaloeh
Dans cette configuration - comment exécutez-vous votre application express? Avez - vous besoin d'avoir un processus distinct comme foreverou pm2qui l' exécute, puis nginxseulement proxies à elle?
grammaire du
Je ne me souviens pas exactement ... Je me souviens que la réponse acceptée a fonctionné pour moi.
Mars Robertson

Réponses:

21

Vous exprimez configuré pour servir le chemin /index.html, mais vous avez besoin /test-express/index.html. Soit configurez express pour servir /test-express/index.htmlou faites nginx pour retirer /test-exressde la requête mandatée. Latter est aussi simple que d'ajouter des barres obliques de fin à locationet 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.

Alexey Ten
la source
2
Q: "Je suis presque sûr de manquer des détails évidents" A: "aussi simple que d'ajouter des barres obliques" (merci, j'étais littéralement coincé)
Mars Robertson