Como configurar o nginx para que ele funcione com o Express?

12

Estou tentando configurar o nginx para que ele proxy_passsolicite aos meus aplicativos de nó. A pergunta no StackOverflow tem muitos upvotes: /programming/5009324/node-js-nginx-and-now e estou usando a configuração a partir daí.

(mas como a pergunta é sobre a configuração do servidor, ela deve estar no ServerFault)

Aqui está a configuração 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 nó simples:

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

Não funciona :( Veja: http://services.stefanow.net/test-express


Eu sei que algo está acontecendo.

a) test-express NÃO está sendo executado insira a descrição da imagem aqui

b) o text-express está em execução

insira a descrição da imagem aqui

(e posso confirmar que está sendo executado via linha de comando enquanto o ssh estiver no 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

Tentei definir cabeçalhos conforme descrito aqui: http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/ (ainda não 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;

Eu também tentei substituir '127.0.0.1' por 'localhost' e vice-versa


Por favor informar. Tenho certeza de que sinto falta de alguns detalhes óbvios e gostaria de aprender mais. Obrigado.

Mars Robertson
fonte
Algum log de log de nginxerro?
Masjaloeh
Nesta configuração - como você está executando seu aplicativo expresso? Você precisa ter um processo separado como foreverou pm2que o execute e, em seguida, nginxapenas proxies para ele?
gramática
Não me lembro exatamente ... Lembro que a resposta aceita funcionou para mim.
Mars Robertson

Respostas:

21

Você expressa configurado para servir o caminho /index.html, mas exige /test-express/index.html. Configure o express para servir /test-express/index.htmlou faça com que o nginx /test-exressretire da solicitação em proxy. Ultimamente é tão simples quanto adicionar barras finais a locatione proxy_pass.

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

Veja http://nginx.org/r/proxy_pass para obter detalhes.

Alexey Ten
fonte
2
Q: "Eu tenho certeza que eu perca algum detalhe óbvio" A: "tão simples como add arrastando barras" (obrigado, eu estava literalmente preso)
Mars Robertson