Closed proudwax closed 8 years ago
В целом, направление мысли — правильное: пользователь всегда должен общаться только с одним доменом.
На все запросы непосредственно из браузера отвечает nginx
. Почему nginx
в данном случае называют прокси-сервером? По сути, все запросы nginx
проксирует в nodejs
.
Конфиг nginx
может выглядеть как-то так:
proxy_pass http://nodejs;
proxy_set_header Host $host;
upstream nodejs {
server 127.0.0.1:1080;
}
Соответственно, на машине на которой стоит nginx
должен быть поднят nodejs
(localhost) на 1080 порту.
За что отвечает nodejs-сервер, который принимает проксированные запросы из nginx
?
Netcat в данном случае, совершенно верно, отдает json на запросы по определенным урлам. Браузер ничего не знает про эти урлы — это внутреннее АПИ.
Чтобы nodejs-сервер смог ходить в netcat, необходимо поднять php-процесс так же на localhost, на данной машинке, но уже на другом порту. Пусть это будет localhost:1090
. Важно понимать, что из браузера невозможность сделать запрос к netcat, потому что localhost не виден из внешней сети.
В какие урлы ходить решают конкретные обработчики запросов в nodejs-сервере.
Пример на expressjs:
// методы этого объекта принимают request
// ходят в определенные урлы в `netcat` (под капотом ходит в localhost:1090)
var backend = require('backend');
app.get('/cart', function(req, res) {
Promise.all([
// информация для пользователя в шапке: имя, аватарка, если неавторизован, то ничего
backend.getUserInfo(req),
// информация для корзины текущего пользователя, если неавторизован, то ничего
backend.getCart(req)
]).then(function(responses) {
// разбираем полученный json,
// возможно как-то преобразуем
// накладываем шаблоны — получаем html
req.send(html);
});
});
Проблема возникла, когда необходимо было в netcat отправлять запросы на добавление товара.
При таком подходе получится, что nginx передает все полученные куки «как есть» в nodejs-сервер.
Далее в nodejs проверяем авторизацию:
Если авторизован, то мы можем спокойно идти в netcat
, который не проверяет авторизацию никогда, потому никогда из браузера не виден и мы совершаем необходимые действия. Когда все готово и netcat
ответил, что все прошло хорошо, отправляет ответ пользователю (если это запрос аяксом АПИ, а не запрос страницы — то отправляем json).
etc/nginx/sites-available/test.com
? А если каталога sites-available вообще нет, значит nginx
не выступает в роли прокси?localhost:1090
?Конфиг nginx для определённого домена должен располагаться в etc/nginx/sites-available/test.com?
Да, нужно создать папочку с название под нужный домен в sites-available
и сделать там нужный конфиг, а так же симлинк на эту папку в sites-enabled
.
А если каталога sites-available вообще нет, значит nginx не выступает в роли прокси?
Да, а так же нужно написать правильный конфиг.
Возможно ли получить доступ к админке cms из браузера, к примеру если использовать поддомен и направить его на localhost:1090?
Да, именно так и следует поступить, чтобы было удобнее заходить в админку.
location /netcat/admin/ {
proxy_pass http://localhost:1090/netcat/admin/;
}
Запрос будет проксирован в netcat «как есть».
Полезные ссылки
Вопрос про удобное размещение файлов разных технологий в одном каталоге)
Есть каталог на сервере public_html,
в который можно складировать файлы и для nodejs и для php, но может лучше разделить на каталоги? То есть будут к примеру: public_html/php
и public_html/nodejs
, а в конфиге nginx прописать root'ы
для нужных партов.
Как раз для php
не должен быть прописан root
вовсе и он не должен быть доступен публично. Весь смысл в том, чтобы спрятать бекенд за nginx наглухо – из браузера доступа не будет (помним, что по умолчанию netcat не будет проверять авторизацию, а просто отдавать данные, доверяя nodejs, как прокси).
На самом деле, что php, что nodejs приложения, можно разместить где угодно. Главное — запустить веб-серверы (php и nodejs) на разных портах.
Пусть nodejs запущен на 1080, тогда:
server {
location / {
proxy_pass http://localhost:1080;
}
}
Сразу можно настроить раздачу статики (собранные css, js файлики), пусть они лежат рядом с приложением в папочке public (а само приложение в /usr/local/www/my-site).
server {
location / {
proxy_pass http://localhost:1080;
}
location /public/ {
root /usr/local/www/my-site/public/
}
}
В итоге, все запросы из браузера будут проксироваться в nodejs-сервер, все запросы на /public/ будут проксироваться на файловую систему (там будут статичные css,js файлики).
Данные: Сервер: Ubuntu node v4.4.3 on 14.04 (digitalocean.com) CMS: netcat
Было: Два домена, на одном (php) cms выдаёт json, на другом (express js) json->bemjson->html. Проблема возникла, когда необходимо было в netcat отправлять запросы на добавление товара. (Как я понял, если делать запрос на добавление товара с другого домена, товар не добавится так как необходимы cookie).
Выход: на одном домене поместить nodejs + php
Как я понял: nginx принимает запросы и выступает в роли триггера, раскидывает или на php сервер или на nodejs. Пользователь работает в пределах одного домена.
Вопросы: Как понять, что nginx выступает в роли прокси-сервера? Как настроить nginx для работы на одном домене с php и nodejs?
Если мои представления о том как должно получиться не верны, то как должно быть?)))