Маршрутизация доменов и поддоменов в NodeJS или ReactJs

Общая идея веб-страницы:

  1. domain.com : ведет на страницу входа для администратора и продавца.
  2. shop.domain.com : ведет в магазин продавца.
  3. Планируется использовать React.js в качестве внешнего интерфейса и Nodejs (Express Js) в качестве внутреннего интерфейса.
  4. Не решил разместить все на Heroku или только серверную часть Nodejs на Heroku и React.js где-то еще, поскольку мы разделяем процесс разработки.

Как перенаправить пользователя на соответствующую страницу в соответствии с URL-адресом доступа (с поддоменом или без него)

На самом деле, есть пакет от npm с именем express-subdomain-handler, который помогает маршрутизировать домен и субдомен на стороне сервера, и я без проблем сделал это и развернул в Heroku.

app.use(subdomainHandler({
    baseUrl: 'localhost',
    prefix: 'subdomain',
    logger: true
}));

app.get('/', function (request, response) {
    response.send('WELCOME TO LOCALHOST');
});

app.get('/subdomain/:shop', function (request, response) {
    response.send('WELCOME TO SUBDOMAIN');
});

Я считаю, что указанная выше маршрутизация больше связана с рендерингом на стороне сервера, поскольку она отображает соответствующую страницу только в соответствии с URL-адресом (или конечной точкой), к которому осуществляется доступ. Но можно ли таким образом визуализировать приложение React? Потому что то, что я делал раньше, это просто рендеринг страницы .ejs, поэтому я не уверен в этом, и я никогда раньше не работал с React.js.

Во-вторых, что, если я размещу приложение React на другом сервере, может быть, Vercel или NGINX или что-то еще, и получу доступ к серверной службе в героку с помощью REST API, будет ли это правильным методом развертывания веб-сайта? Если да, будет ли маршрутизация домена и поддомена выполняться на сайте хостинга приложения React или внутри самого кода, а не через expressjs в Heroku? Поскольку я считаю, что expressjs будет нести ответственность только за создание серии конечных точек для прослушивания. Например, внутри express.js:

app.get('/hello', (req, res) => {
   res.send("Hello from domain");
})

app.get('/subdomain/hello', (req, res) => {
   res.send("Hello from subdomain");
})

И реагирующему приложению просто нужно будет получить доступ к этому API, не принимая во внимание проблему маршрутизации поддоменов и доменов на бэкэнде. Я считаю, что это так или иначе известно как рендеринг на стороне клиента, поскольку каждый REST API будет возвращать данные JSON для рендеринга.

Итак, если я поступаю таким образом, как мы определяем страницу, которая будет отображаться приложением React, в соответствии с URL-адресом, к которому осуществляется доступ? Например, если domain.com ведет на страницу панели инструментов, а shop.domain.com ведет на страницу магазина?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
4 882
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, что это не относится к реакции. React — это библиотека браузера, и она не может обрабатывать доменную часть.

Я не рекомендую обрабатывать эту часть с помощью Express, так как для этого необходимо использовать обратный прокси-сервер, вам лучше использовать Nginx, Apache, какой-либо другой серверный движок для обработки поддоменов.

То, что вы запланировали, может быть размещено так,

Домен

  1. создать домен.com
  2. добавить псевдоним к shopping.domain.com

Сервер

  1. создать сервер администратора, клиентский сервер
  2. обратный прокси этих серверов

Клиент

  1. создать 2 реактивных проекта.
  2. domain.com обслуживает файл сборки реакции администратора.
  3. shop.domain.com обслуживает файл сборки магазина.

Я также рекомендую статический файловый хостинг для приложения реакции администратора, если вы этого не сделаете. нужно выставить админку для поисковика.

О, я забыл часть маршрутизации. Большинство приложений React используют маршрутизацию браузера, а не серверную маршрутизацию.

hellikiam 11.12.2020 10:11

Итак, допустим, я использую серверную часть Heroku для Express, означает ли это, что мне нужно создать 2 приложения отдельно, а не объединять их вместе, чтобы в результате получилось: API из домена будет указывать на foo.herokuapp.com, а API из поддомена будет указывать на bar.herokuapp.com? Или я должен объединить их вместе и определить с помощью vhost? В этом случае, где мы должны настроить NGINX для обратного прокси?

K the Kelvin 12.12.2020 03:53

Означает ли это, что мне нужно настроить nginx на сайте размещения статических файлов и использовать обратный прокси-сервер либо для обслуживания реакции администратора, либо для реакции магазина, тогда весь API будет просто указывать на приложение Heroku? Таким образом, в этом случае мы можем либо разделить приложение Heroku, API, указывающее на foo.herokuapp.com/ или bar.herokuapp.com/, либо просто объединить их и добавить некоторые работы в дизайн REST API. Например, / реагировать на все запросы от администратора и /shop/ реагировать на все запросы из магазина?

K the Kelvin 12.12.2020 04:43

Я хочу еще раз прояснить свою идею: во-первых, создайте приложение Heroku со ссылкой на пакет сборки , затем мы отправляем наш внешний репозиторий, который содержит 2 разных приложения React, приложение для администратора и магазина, в Heroku приложение, которое мы создали. Затем мы настраиваем параметр NGINX (еще не знаем, где и как настраивать, все еще нужно немного прочитать) внутри пакета сборки, чтобы мы могли обслуживать разные приложения React в соответствии с типом входящего URL-адреса, будь то домен или субдомен.

K the Kelvin 12.12.2020 05:58

Затем экспресс-бэкэнд будет развернут в другом приложении Heroku (или, может быть, в 2 приложениях Heroku для микросервисной архитектуры) и обработает весь REST API, а затем вернет данные JSON обратно в приложение React. Это?

K the Kelvin 12.12.2020 05:58

Во-первых, я никогда не использовал Heroku для хостинга, поэтому мое решение может отличаться для вашей среды. но я думаю, что вся концепция будет работать для вас.

На ваши вопросы нет фиксированного ответа, но то, что я думаю сейчас, может быть вам полезно :) Для ваших вопросов есть много подвопросов, поэтому я выделил их.

И я не владею английским языком, так что между вами и мной может быть некоторое недопонимание, пожалуйста, дайте мне знать, если я ошибаюсь в том, что я понял из вашего вопроса.

В. Но можно ли таким образом визуализировать приложение React?

(Что я понял: может ли приложение реагировать на размещение SSR)

A. Вы можете обслуживать реагирующее приложение с SSR, используя разделение кода и рендеринг на стороне сервера, вам лучше использовать рендеринг на стороне сервера. для некоторых метатегов и страниц, необходимых для SEO, если вам не требуется полное приложение SSR. Если вам нужен полный ssr, для него также есть модный фреймворк Next.js. Возможно, вы уже знаете об этом, судя по тому, что вы упомянули Vercel.

В. Что, если я размещу приложение React на другом сервере, может быть, Vercel, NGINX или что-то еще, и получу доступ к серверной службе в героку с помощью REST API?

(Что я понял: может ли приложение реагировать на другой сервер? NGINX = использование экземпляра сервера, Vercel: использование бессерверной архитектуры )

A. Также это может быть размещено таким образом. Кажется, что этот больше похож на реакцию. Но я не рекомендую Vercel для хостинга, так как для службы электронной коммерции требуется много конечных точек, Ознакомьтесь с ценовой политикой Vercel.

В. Итак, допустим, я использую серверную часть Heroku для Express, значит ли это, что мне нужно создать 2 приложения по отдельности, а не объединять их вместе?

A. Вы можете разместить несколько хостов для ресурсов компьютера или нет. В случае, если вы планируете использовать несколько хостов, вам может понадобиться прокси-сервер для указания других серверов, Напротив, для одного хоста обратный прокси-сервер указывает на каждое приложение.

В. Экспресс-обработчик поддоменов против vhost

А. Нет фиксированного ответа. вы можете добиться того, чего хотите, используя vhost или экспресс-поддомен-обработчик. Или оба.

Моя концепция решения заключается в использовании одного экземпляра сервера с обратным прокси. Позвольте Nginx разместить несколько ваших приложений на одном сервере.

Что я рекомендую:

Список приложений.

  1. реагировать хост - приложение nodejs
  2. клиентский хост API - приложение nodejs
  3. хост реакции администратора - приложение nodejs
  4. клиентский хост API - приложение nodejs

Я использовал AWS S3 для размещения приложений React и EC2 для приложений API.

Концепция структуры.

( NS / DNS ) : domain.com points your-ip
    |
    ( Server instance )
        |
        ( Nginx ) - virtual hosting
            |
            ( www.domain.com ) --- > client react host : ( node app for server side rendering ) : React rendered file for each route. 
                                                       Or you can just respond with index.html for all route for skipping SSR
            |
            ( api.domain.com ) --- > clinet api host : api.domain.com/what, api.domain.com/what/ever?you=want
            |
            ( admin.domain.com ) ---> admin react host : admin.domain.com/* : sending index.html  //static hosting and let all route point for index.html
            |
            ( admin-api.domain.com ) ---> admin react host : Only if you want to seperate. Or you can combine this with api.domain.com using subrouter

Как построить Структуру.

Шаг 1. Размещение сервера.

I don't know much about Heroku but I guess there are aws ec2-like service(cloud computing) and s3-like service(static file service),
This can be single or multiple depending your choice. let's say you wanna go with single server and use virtual host for multiple service end point.

Шаг 2. Настройка сетевого уровня

let's say name-server and DNS server part is network layer. I used AWS Route 53 for this.

    2.1 Buy an domain
    www.your-service.com 
    
    2.2 Add some CNAME to point your web-server host
    - your-service.com,
    - www.your-service.com
    - api.your-service.com,
    - admin.your-service.com    
.
.
.

Шаг 3. Создайте приложение nodejs (прикладной уровень)

I'm assuming that you had one already judging by code in your question.

ubuntu@ip-your-ip:~/project$ ls
api  cli   admin   admin-api   config   libraries  middlewares  models  node_modules   package.json 

ubuntu@ip-your-ip:~/project$ cd api

ubuntu@ip-your-ip:~/project/api$ ls
README.md  app.js  bin  config.json  pm2.config.js  node_modules  package.json  routes

ubuntu@ip-your-ip:~/project/api$ pm2 start pm2.config

PM2 — это деамонизатор приложений узла, вы можете использовать для этого любой демон.

ссылка на ПМ2. https://pm2.keymetrics.io/docs/usage/application-declaration/

Шаг 3. Точки Nginx для приложения nodejs


nano /etc/nginx/nginx.conf

listen 80;
server_name client.domain.com;
location / {
             proxy_http_version 1.1;
             proxy_pass  http://localhost:3000;
}

listen 80;
server_name api.domain.com;
location / {
             proxy_http_version 1.1;
             proxy_pass  http://localhost:3001;
}

listen 80;
server_name admin.domain.com;
location / {
             proxy_http_version 1.1;
             proxy_pass  http://localhost:4000;
}

listen 80;
server_name admin-api.domain.com;
location / {
             proxy_http_version 1.1;
             proxy_pass  http://localhost:4001;
}

Я надеюсь, что это решение будет полезным для вас :)

Я очень ценю ваши усилия по ответам на мои вопросы! Я думаю, что я собираюсь использовать один сервер с несколькими конечными точками службы (кстати, сейчас я рассматриваю EC2 для серверной части), но у меня есть несколько вопросов относительно вашего ответа. Означает ли multiple service endpoints, что я создаю для разных конечных точек, api/ для domain.com и /api/subdomain для subdomain.domain.com для обработки разных запросов?

K the Kelvin 14.12.2020 06:40

Поэтому я считаю, что NGINX настроен внутри EC2 и работает перед внутренним сервером. Это означает, что на сайте веб-хостинга я просто создаю другой CNAME и указываю на IP/экземпляр EC2 и позволяю веб-серверу NGINX определять целевой URL-адрес для отправки запроса?

K the Kelvin 14.12.2020 06:44

Если мое приложение React развернуто в S3, то я просто меняю location / { proxy_pass http:// } на IP или URL-адрес моей корзины S3?

K the Kelvin 14.12.2020 06:46
Ответ принят как подходящий

1. О субдомене

api/ и api/subdomain могут быть реализованы с помощью виртуального хоста NGINX, но поскольку вы запланировали виртуальный хостинг для поддомена, api.domain.com.

перейти с api.domain.com/foo, sub.domain.com/bar кажется более разумным!

Бывший.

listen 80;
server_name api.domain.com/api;
location / {
             proxy_http_version 1.1;
             proxy_pass  http://localhost:4000;
}

listen 80;
server_name api.domain.com/api/subdomain;
location / {
             proxy_http_version 1.1;
             proxy_pass  http://localhost:4000;
             #notice that api application is one and you are seperating namespace in it.
             #you can do the same thing in Node.js with subrouter. ( check out Router API in Nodejs official Site )
}
api.domain.com/foo, sub.domain.com/bar
listen 80;
server_name api.domain.com;
location / {
             proxy_http_version 1.1;
             proxy_pass  http://localhost:4000;#this one is node application listening port 4000
}

listen 80;
server_name sub.domain.com/;
location / {
             proxy_http_version 1.1;
             proxy_pass  http://localhost:4001;#and this is node application listening port 4001
}

Доступ в первом случае.


    GET    api.domain.com/api/foo
    GET    api.domain.com/api/subdomain/bar

Доступ во втором случае.


    GET    api.domain.com/foo
    GET    sub.domatin.com/bar


2. Так верно. Пусть каждый CNAME указывает на ваш EC2 (или любое веб-приложение на любом экземпляре сервера) в качестве источника


3. Вам не нужно настраивать серверный движок для вашего экземпляра S3.

S3 находится не в экземпляре EC2, а где-то в центре обработки данных AWS. Таким образом, виртуальный хост не является решением для ведра маршрута S3. Вместо этого вы можете использовать Route53 для маршрутизации корзины S3 для вашего домена.

Если у вас уже есть домен. Вы можете настроить сервер имен так, чтобы он указывал на сервер имен AWS. Вы можете получить NS/DNS из консоли Route 53 после регистрации домена.

Между тем, есть проблема со статическим хостингом, реагирующим на приложение (S3-подобный хостинг), вам нужно отказаться от SSR. Поскольку S3 является статическим хостом, он не может работать так, как Lambda или экземпляр сервера.

S3 просто извлечет сохраненный файл для запроса, в данном случае это будет файл сборки для реагирующего приложения. Так что на вашем месте я бы выбрал S3 только для административного приложения, так как SEO не имеет значения для административного приложения.

Сделать SSR с экспрессом

Пусть ваш корневой домен (www.domain.com) указывает на клиентский сервер nodejs в EC2. И вложите файл сборки реакции для сервера. Приложение React SSR через Express довольно сложно объяснить, но есть множество примеров, так что вы можете погуглить.


Помимо темы, я создал свое приложение для электронной коммерции на S3, и я сожалею об этом, потому что часть SSR непростая. Есть много решений по этому поводу, но среди них фреймворк next.js кажется лучшим выбором для ssr как можно скорее.

Спасибо за ваш очень информативный ответ. Итак, в основном, если SSR: тогда я должен развернуть все в EC2 и работать на 1. О субдомене для обратного прокси, иначе, если CSR, я могу просто разделить развертывание на EC2 для экспресс и S3 для React, а затем с помощью Route 53, CNAME будет напрямую указывать на корзину S3. В этом случае не имеет значения на виртуальном хостинге серверная часть в соответствии с доменом и подпрограммой или нет, так как все запросы API могут быть направлены непосредственно в EC2 в методе доступа в первом случае. И придерживаться CSR означает отказаться от SEO. Я правильно понимаю?

K the Kelvin 14.12.2020 09:15

Да, это то, о чем я говорю, братан, я думаю, что это хорошо для тебя!

hellikiam 14.12.2020 09:33

Эй, чувак, спасибо за столько информации! Я многому научился из вашего ответа и очень ценю его, надеюсь, мне удастся успешно развернуть приложение. Спасибо.

K the Kelvin 14.12.2020 09:50

Удачи в вашем развитии, и я рад, что мой ответ полезен!

hellikiam 14.12.2020 10:04

Другие вопросы по теме