WedX - журнал о программировании и компьютерных науках

Backend и Frontend на одном порту

У меня есть экземпляр Windows ec2 на AWS, который отвечает интерфейсом на порту 80. Мой сервер работает на порту 5000. Можно ли как-то разместить интерфейс и сервер на одном и том же порту, не используя какой-либо порт на клиенте для остальных? API?

Внешний интерфейс:

www.example.com

Текущий бэкенд:

www.example.com:5000

Что я хотел бы, чтобы это было:

www.example.com/backend/

Как мне написать один файл index.js или server.js для внутренних и внешних маршрутов?


  • Вы готовы использовать обратный прокси-сервер Nginx? 17.01.2018

Ответы:


1

Конечно, разместить оба на одном и том же порту тривиально, это просто вопрос маршрутизации.

Например, используя express.js и имея статические файлы (CSS, изображения, HTML и т. д.) в папке с именем public:

const express = require('express')
const app = express()

app.use('/', express.static('public'))
app.get('/backend', (req, res) => res.send('Hello World!'))

app.listen(80, () => console.log('Example app listening on port 80!'))

Если вы создаете файл public/index.html:

<html>HI</html>

Затем вы можете получить его («внешний интерфейс»), запустив curl 'localhost:80/':

$ curl 'localhost:80/'
<html>HI</html>
$

Вы также можете получить доступ к своему «бэкэнду»:

$ curl 'localhost:80/backend'
Hello World!
$
17.01.2018

2

Я рекомендую вам разделить конечные точки вашего сервиса на поддомены.

Конечная точка службы

Конечная точка — это точка подключения, в которой отображаются HTML-файлы или активные страницы сервера. Конечные точки предоставляют информацию, необходимую для обращения к конечной точке веб-службы. Конечная точка предоставляет ссылку или спецификацию, которая используется для определения группы или семейства свойств адресации сообщений и предоставления сквозных характеристик сообщения, таких как ссылки на источник и место назначения конечных точек, а также идентичность сообщений для обеспечения единообразия. адресация независимых сообщений. Конечной точкой может быть ПК, КПК или терминал торговой точки Ссылка: Определение конечной точки службы.

Рекомендуемый поддомен для вашей конечной точки Frontend:

  • https://www.example.com
  • https://example.com В этом случае вам необходимо перенаправить на субдомен www

Для вашей конечной точки Backend вы можете использовать все, что хотите, но рекомендуемые субдомены для Backend:

  • https://api.example.com (наиболее часто используемый)
  • https://backend.example.com

Итак, в вашем случае рекомендации такие:

Вы можете сделать это, используя обратный прокси-сервер, такой как Nginx, или получить субдомен из объекта запроса в NodeJs.

Nginx — это веб-сервер, который также можно использовать в качестве обратного прокси-сервера, балансировщика нагрузки и кэша HTTP. Программное обеспечение было создано Игорем Сысоевым и впервые публично выпущено в 2004 году. В 2011 году была основана одноименная компания для оказания поддержки.

Первый подход

Использование Nginx в качестве балансировщика нагрузки HTTP

Вы можете настроить Nginx для балансировки запросов к вашему серверу следующим образом:

http {
    upstream backend {
        server localhost:5000;
    }

    upstream frontend {
        server localhost;
    }

    server {
        listen 80;

        server_name api.example.com;
        location / {
            proxy_pass https://backend;
        }
    }

    server {
        listen 80;

        server_name www.example.com example.com;
        location / {
            proxy_pass https://frontend;
        }
    }
}

Второй подход

Используйте expressjs, чтобы получить субдомен из объекта запроса.

req.subdomains

Массив поддоменов в доменном имени запроса.

Документация:

// Host: "tobi.ferrets.example.com"
req.subdomains
// => ["ferrets", "tobi"]

В вашем случае ваши возможные поддомены: www или api

// Host: "www.example.com"
req.subdomains
// => ["www"]

Or

// Host: "api.example.com"
req.subdomains
// => ["api"]

Вот как вы должны обработать запрос в своем server.js

var subDomain = req.subdomains[0];
 
if (subdomain === 'api') {
    processBackendRequest();
} else {
    processFrontendRequest();
}
17.01.2018
  • Я тоже предпочел бы это, но как это сделать в локальной сети? Я хочу обслуживать API REST на основе фляги на subdomain.hostname.local и интерфейс vuejs на hostname.local 30.12.2018

  • 3

    Единственный реальный способ избежать необходимости указывать номер порта — использовать пост 80 для HTTP или 443 для HTTPS.

    Если вы используете IIS, вы можете запустить свой внешний интерфейс как веб-сайт с именем «example.com», а затем под этим веб-сайтом иметь другое «приложение» с именем «бэкэнд».

    Все HTTP-запросы для www.example.com будут направляться на корневой веб-сайт. Запросы на www.example.com/backend будут направляться в «бэкэнд»-приложение на веб-сайте example.com.

    Однако ServerFault может быть более подходящим местом для вопросов по IIS.

    17.01.2018
  • Обратите внимание: по умолчанию я выбрал IIS, как вы упомянули Windows. Может быть, лучше уточнить фактическое используемое программное обеспечение хостинга. 17.01.2018
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]