vitkarpov / ask-me

:mortar_board: Ask me about JavaScript, programming and technologies (anything actually)
1 stars 0 forks source link

Как настроить php (netcat) в качестве бекенда для nodejs-сервера #1

Closed proudwax closed 8 years ago

proudwax commented 8 years ago

Данные: Сервер: 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?

Если мои представления о том как должно получиться не верны, то как должно быть?)))

vitkarpov commented 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);
  });
});
vitkarpov commented 8 years ago

Проблема возникла, когда необходимо было в netcat отправлять запросы на добавление товара.

При таком подходе получится, что nginx передает все полученные куки «как есть» в nodejs-сервер.

Далее в nodejs проверяем авторизацию:

Если авторизован, то мы можем спокойно идти в netcat, который не проверяет авторизацию никогда, потому никогда из браузера не виден и мы совершаем необходимые действия. Когда все готово и netcat ответил, что все прошло хорошо, отправляет ответ пользователю (если это запрос аяксом АПИ, а не запрос страницы — то отправляем json).

proudwax commented 8 years ago
  1. Конфиг nginx для определённого домена должен располагаться в etc/nginx/sites-available/test.com? А если каталога sites-available вообще нет, значит nginx не выступает в роли прокси?
  2. Возможно ли получить доступ к админке cms из браузера, к примеру если использовать поддомен и направить его на localhost:1090?
vitkarpov commented 8 years ago

Конфиг 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 «как есть».

Полезные ссылки

proudwax commented 8 years ago

Вопрос про удобное размещение файлов разных технологий в одном каталоге) Есть каталог на сервере public_html, в который можно складировать файлы и для nodejs и для php, но может лучше разделить на каталоги? То есть будут к примеру: public_html/php и public_html/nodejs, а в конфиге nginx прописать root'ы для нужных партов.

vitkarpov commented 8 years ago

Как раз для 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 файлики).