Назад | Перейти на главную страницу

Настройка приложения Node вместе с сервером nginx

Я пытаюсь настроить новый узел вместе с моим предыдущим приложением PHP.

Сценарий

Я хочу разместить приложение NodeJs на сервере по ссылке www.xyz.com/nodeApp

Что я пробовал

Мой подход заключался в том, чтобы проксировать все запросы, сделанные на www.xyz/nodeApp на порт 8142, откуда сервер узла подхватит.

Я добавил следующую конфигурацию прокси в файл nginx из www.xyz.com.

location ~ ^/nodeApp(.*)$ {
   proxy_http_version 1.1;
   proxy_pass_request_body on;
   proxy_set_header Host $host;
   proxy_set_header Scheme $scheme;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_pass http://127.0.0.1:8142$1$is_args$args;
   proxy_buffering off;
}

Результат

При попадании в www.xyz.com/nodeApp/, все работает. Узловой сервер принимает запрос и обслуживает css и js файлы по ссылке www.xyz.com/nodeApp/app.js и т.п.

Но (без косой черты в конце)

При попадании в www.xyz.com/nodeApp, это не работает. Узловой сервер принимает запрос и обслуживает html страница правильно, но css и js файлы обслуживаются по ссылке www.xyz.com/app.js и т.д. Так приложение ломается.

Где я не прав?

Мой файл сервера узла

var express = require("express");
var app = express();

app.use(express.static(__dirname + '/build'));

var port = process.env.PORT || 8142;
app.listen(port, function() {
  console.log("Listening on " + port);
});

Вам следует упростить конфиг:

location /nodeApp/ {
   proxy_http_version 1.1;
   proxy_set_header Host $host;
   proxy_set_header Scheme $scheme;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_pass http://127.0.0.1:8142/;
   proxy_buffering off;
}

В этом случае nginx позаботится о конце слэша. Видеть http://nginx.org/r/location

Если местоположение определяется строкой префикса, которая заканчивается символом косой черты, и запросы обрабатываются одним из proxy_pass, [...], то выполняется специальная обработка. В ответ на запрос с URI, равным этой строке, но без косой черты в конце, постоянное перенаправление с кодом 301 будет возвращено на запрошенный URI с добавленной косой чертой.

Также нет необходимости в переменных в proxy_pass. Nginx заменит префикс /nodeApp/ с участием / и автоматически добавлять строки запроса.