Вопрос:
У меня есть экземпляр ec2 Windows на AWS, который отвечает интерфейсом на порту 80. Мой сервер работает на порту 5000. Есть ли способ, которым я могу разместить как интерфейс, так и бэкэнд на одном и том же порту, не используя какой-либо порт на клиенте для остальных API?
Внешний интерфейс:
www.example.com
Текущий бэкэнд:
www.example.com:5000
Что бы я хотел:
www.example.com/backend/
Как мне написать один файл index.js или server.js для обоих бэкэнд и Frontend-маршрутов?
Лучший ответ:
Несомненно, тривиально размещать как на одном и том же порту (-ах), это просто вопрос маршрутизации.
Например, используя 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>
Затем вы можете получить его (“frontend”), запустив curl ‘localhost:80/’:
$ curl ‘localhost:80/’ <html>HI</html> $
Вы также можете получить доступ к своим “бэкэндам”:
$ curl ‘localhost:80/backend’ Hello World! $ Ответ №1Содержание
- Я рекомендую вам разделить свои конечные точки обслуживания в субдоменах
- Конечная точка обслуживания
- Для вашей конечной точки Frontend рекомендуемый субдомен:
- Для конечной точки Backend вы можете использовать все, что хотите, но рекомендуемые субдомены для Backend:
- Итак, в вашем случае рекомендации:
- Первый подход
- Второй подход
- Я рекомендую вам разделить свои конечные точки обслуживания в субдоменах
- Конечная точка обслуживания
- Для вашей конечной точки Frontend рекомендуемый субдомен:
- Для конечной точки Backend вы можете использовать все, что хотите, но рекомендуемые субдомены для Backend:
- Итак, в вашем случае рекомендации:
- Первый подход
- Второй подход
Я рекомендую вам разделить свои конечные точки обслуживания в субдоменах
Конечная точка обслуживания
Конечная точка – это точка подключения, в которой отображаются файлы HTML или активные серверные страницы. Конечные точки предоставляют информацию, необходимую для решения конечной точки веб-службы. Конечная точка предоставляет ссылку или спецификацию, которая используется для определения группы или семейства свойств адресации сообщений и предоставляет сквозные характеристики сообщений, такие как ссылки для источника и назначения конечных точек, а также идентификационные сообщения, позволяющие единообразно адресация “независимых” сообщений. Конечной точкой может быть терминал ПК, КПК или точка доступа. Ссылка: определение конечной точки обслуживания.
Для вашей конечной точки Frontend рекомендуемый субдомен:
- http://www.example.com
- http://example.com Для этого случая вам нужно перенаправить на субдомен www
Для конечной точки Backend вы можете использовать все, что хотите, но рекомендуемые субдомены для Backend:
- (наиболее часто используемый)
Итак, в вашем случае рекомендации:
- Frontend: http://www.example.com
- Бэкэнд:
Вы можете выполнить это, используя либо обратный прокси, как Nginx, либо получение субдомена из объекта запроса в NodeJ.
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 http://backend; } } server { listen 80; server_name www.example.com example.com; location / { proxy_pass http://frontend; } } }
Второй подход
Используйте expressjs для получения субдомена из объекта запроса.
req.subdomains
Массив поддоменов в доменном имени запроса.
Документация:
// Host: «tobi.ferrets.example.com» req.subdomains // => [«ferrets», «tobi»]
В вашем случае ваши возможные субдомены: www или api
// Host: «www.example.com» req.subdomains // => [«www»]
Или же
// Host: «api.example.com» req.subdomains // => [«api»]
Вот как вы должны обрабатывать запрос в своем server.js
var subDomain = req.subdomains[0]; if (subdomain === ‘api’) { processBackendRequest(); } else { processFrontendRequest(); } Ответ №2
Единственный реальный способ предотвратить указание номера порта – использовать пост 80 для HTTP или 443 для HTTPS.
Если вы используете IIS, вы можете использовать свой интерфейс на веб-сайте под названием example.com, а затем на этом веб-сайте есть еще одно “приложение”, называемое “backend”.
Все HTTP-запросы на www.example.com перейдут на корневой сайт. Запросы на www.example.com/backend будут направлены на “бэкэнд-приложение” на веб-сайте example.com.
ServerFault может быть более подходящим местом, чтобы задавать вопросы IIS.