¿Cómo configurar nginx para que funcione con Express?

12

Estoy tratando de configurar nginx para que proxy_passsolicite a mis aplicaciones de nodo. La pregunta sobre StackOverflow obtuvo muchos votos positivos: /programming/5009324/node-js-nginx-and-now y estoy usando config desde allí.

(pero como la pregunta es sobre la configuración del servidor, se supone que debe estar en ServerFault)

Aquí está la configuración de 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;
  }
}

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

¡Funciona! Verificación: http://services.stefanow.net/test-http

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

No funciona :( Ver: http://services.stefanow.net/test-express


Sé que algo está pasando.

a) test-express NO se está ejecutando ingrese la descripción de la imagen aquí

b) se está ejecutando text-express

ingrese la descripción de la imagen aquí

(y puedo confirmar que se ejecuta a través de la línea de comandos mientras ssh en el servidor)

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

Intenté configurar encabezados como se describe aquí: http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/ (todavía no funciona)

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;

También intenté reemplazar '127.0.0.1' con 'localhost' y viceversa


Por favor avise. Estoy bastante seguro de que extraño algunos detalles obvios y me gustaría aprender más. Gracias.

Mars Robertson
fuente
¿Algún log in nginxerror log?
masegaloeh
En esta configuración, ¿cómo está ejecutando su aplicación express? ¿Necesitas tener un proceso separado como forevero pm2que lo ejecute, luego nginxsolo se delegue?
gramática el
No puedo recordar exactamente ... Recuerdo que la respuesta aceptada funcionó para mí.
Mars Robertson

Respuestas:

21

Expresa configurado para servir ruta /index.html, pero lo requiere /test-express/index.html. Configure express para servir /test-express/index.htmlo haga que nginx se /test-exresselimine de la solicitud proxy. Este último es tan simple como agregar barras diagonales finales a locationy proxy_pass.

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

Ver http://nginx.org/r/proxy_pass para más detalles.

Alexey Ten
fuente
2
P: "Estoy bastante seguro de que pierdo algunos detalles obvios" A: "tan simple como agregar barras diagonales" (gracias, estaba literalmente atascado)
Mars Robertson