Wie konfiguriere ich Nginx so, dass es mit Express funktioniert?

12

Ich versuche, nginx so zu konfigurieren, dass es proxy_passAnfragen an meine Node-Apps sendet. Frage zu StackOverflow hat viele positive Bewertungen erhalten: /programming/5009324/node-js-nginx-and-now und ich verwende die Konfiguration von dort.

(Da es sich jedoch um eine Frage zur Serverkonfiguration handelt, sollte diese auf ServerFault ausgeführt werden.)

Hier ist die Nginx-Konfiguration:

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

Verwenden eines einfachen Knotens:

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/');

Es klappt! Überprüfen Sie: http://services.stefanow.net/test-http

Mit 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/');

Es funktioniert nicht :( Siehe: http://services.stefanow.net/test-express


Ich weiß, dass etwas los ist.

a) test-express läuft NICHT Bildbeschreibung hier eingeben

b) text-express läuft

Bildbeschreibung hier eingeben

(und ich kann bestätigen, dass es über die Kommandozeile läuft, während ssh auf dem Server läuft)

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

Ich habe versucht, Header wie hier beschrieben zu setzen: http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/ (funktioniert immer noch nicht)

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;

Ich habe auch versucht, '127.0.0.1' durch 'localhost' zu ersetzen und umgekehrt


Bitte beraten. Ich bin mir ziemlich sicher, dass ich einige offensichtliche Details vermisse und ich würde gerne mehr erfahren. Vielen Dank.

Mars Robertson
quelle
Irgendein Login nginxFehlerprotokoll?
Masegaloeh
In diesem Setup - wie führen Sie Ihre Express-Anwendung aus? Benötigen Sie einen separaten Prozess wie foreveroder pm2der ihn nginxausführt , dann nur Proxies dazu?
Grammatik
Ich kann mich nicht genau erinnern ... Ich erinnere mich, dass die akzeptierte Antwort für mich funktioniert hat.
Mars Robertson

Antworten:

21

Sie drücken den für die Zustellung konfigurierten Pfad aus /index.html, benötigen ihn jedoch /test-express/index.html. Entweder konfigurieren Sie express als Server, /test-express/index.htmloder Sie lassen nginx /test-exressvon der Proxy-Anfrage abschneiden. Letzteres ist so einfach wie das Hinzufügen von abschließenden Schrägstrichen zu locationund proxy_pass.

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

Weitere Informationen finden Sie unter http://nginx.org/r/proxy_pass .

Alexey Ten
quelle
2
F: „Ich bin ziemlich sicher , dass ich vermisse einige offensichtliche Detail“ A: „so einfach wie add folgende Schrägstriche“ (danke, ich war buchstäblich stecken)
Mars Robertson