Как настроить nginx, чтобы он работал с Express?

12

Я пытаюсь настроить nginx, чтобы он proxy_passзапрашивал приложения моего узла. Вопрос о StackOverflow получил много положительных отзывов: /programming/5009324/node-js-nginx-and-now, и я использую конфигурацию оттуда.

(но поскольку вопрос касается конфигурации сервера, он должен быть на ServerFault)

Вот конфигурация 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;
  }
}

Используя простой узел:

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

Оно работает! Проверьте: http://services.stefanow.net/test-http

Используя экспресс:

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

Это не работает :( См .: http://services.stefanow.net/test-express


Я знаю, что что-то происходит.

а) тест-экспресс НЕ работает введите описание изображения здесь

б) работает экспресс-экспресс

введите описание изображения здесь

(и я могу подтвердить, что он работает через командную строку, пока ssh на сервере)

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

Я попытался установить заголовки, как описано здесь: http://www.nginxtips.com/how-to-setup-nginx-as-proxy-for-nodejs/ (по-прежнему не работает)

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;

Я также попытался заменить «127.0.0.1» на «localhost» и наоборот


Пожалуйста, порекомендуйте. Я уверен, что упустил некоторые очевидные детали, и я хотел бы узнать больше. Спасибо.

Марс Робертсон
источник
Любой журнал в nginxжурнале ошибок?
masegaloeh
В этой настройке - как у вас работает экспресс-приложение? Вам нужен отдельный процесс, подобный foreverили pm2запускающий его, а затем nginxпросто прокси к нему?
грамматика
Я не могу вспомнить точно ... Я помню, что принятый ответ сработал для меня.
Марс Робертсон

Ответы:

21

Вы экспресс настроен для обслуживания пути /index.html, но вам требуется /test-express/index.html. Либо настройте express для обслуживания, /test-express/index.htmlлибо заставьте nginx убрать /test-exressиз прокси-запроса. Последние так же просто, как добавить косые черты locationи proxy_pass.

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

Смотрите http://nginx.org/r/proxy_pass для деталей.

Алексей Тен
источник
2
Q: «Я почти уверен, что упускаю некоторые очевидные детали» A: «так просто, как добавить косые черты» (спасибо, я буквально застрял)
Марс Робертсон