Общая идея веб-страницы:
Как перенаправить пользователя на соответствующую страницу в соответствии с 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
ведет на страницу магазина?
Я думаю, что это не относится к реакции. React — это библиотека браузера, и она не может обрабатывать доменную часть.
Я не рекомендую обрабатывать эту часть с помощью Express, так как для этого необходимо использовать обратный прокси-сервер, вам лучше использовать Nginx, Apache, какой-либо другой серверный движок для обработки поддоменов.
То, что вы запланировали, может быть размещено так,
Домен
Сервер
Клиент
Я также рекомендую статический файловый хостинг для приложения реакции администратора, если вы этого не сделаете. нужно выставить админку для поисковика.
Итак, допустим, я использую серверную часть Heroku для Express, означает ли это, что мне нужно создать 2 приложения отдельно, а не объединять их вместе, чтобы в результате получилось: API из домена будет указывать на foo.herokuapp.com
, а API из поддомена будет указывать на bar.herokuapp.com
? Или я должен объединить их вместе и определить с помощью vhost
? В этом случае, где мы должны настроить NGINX для обратного прокси?
Означает ли это, что мне нужно настроить nginx на сайте размещения статических файлов и использовать обратный прокси-сервер либо для обслуживания реакции администратора, либо для реакции магазина, тогда весь API будет просто указывать на приложение Heroku? Таким образом, в этом случае мы можем либо разделить приложение Heroku, API, указывающее на foo.herokuapp.com/
или bar.herokuapp.com/
, либо просто объединить их и добавить некоторые работы в дизайн REST API. Например, /
реагировать на все запросы от администратора и /shop/
реагировать на все запросы из магазина?
Я хочу еще раз прояснить свою идею: во-первых, создайте приложение Heroku со ссылкой на пакет сборки , затем мы отправляем наш внешний репозиторий, который содержит 2 разных приложения React, приложение для администратора и магазина, в Heroku приложение, которое мы создали. Затем мы настраиваем параметр NGINX (еще не знаем, где и как настраивать, все еще нужно немного прочитать) внутри пакета сборки, чтобы мы могли обслуживать разные приложения React в соответствии с типом входящего URL-адреса, будь то домен или субдомен.
Затем экспресс-бэкэнд будет развернут в другом приложении Heroku (или, может быть, в 2 приложениях Heroku для микросервисной архитектуры) и обработает весь REST API, а затем вернет данные JSON обратно в приложение React. Это?
Во-первых, я никогда не использовал Heroku для хостинга, поэтому мое решение может отличаться для вашей среды. но я думаю, что вся концепция будет работать для вас.
На ваши вопросы нет фиксированного ответа, но то, что я думаю сейчас, может быть вам полезно :) Для ваших вопросов есть много подвопросов, поэтому я выделил их.
И я не владею английским языком, так что между вами и мной может быть некоторое недопонимание, пожалуйста, дайте мне знать, если я ошибаюсь в том, что я понял из вашего вопроса.
(Что я понял: может ли приложение реагировать на размещение SSR)
A. Вы можете обслуживать реагирующее приложение с SSR, используя разделение кода и рендеринг на стороне сервера, вам лучше использовать рендеринг на стороне сервера. для некоторых метатегов и страниц, необходимых для SEO, если вам не требуется полное приложение SSR. Если вам нужен полный ssr, для него также есть модный фреймворк Next.js. Возможно, вы уже знаете об этом, судя по тому, что вы упомянули Vercel.
(Что я понял: может ли приложение реагировать на другой сервер? NGINX = использование экземпляра сервера, Vercel: использование бессерверной архитектуры )
A. Также это может быть размещено таким образом. Кажется, что этот больше похож на реакцию. Но я не рекомендую Vercel для хостинга, так как для службы электронной коммерции требуется много конечных точек, Ознакомьтесь с ценовой политикой Vercel.
A. Вы можете разместить несколько хостов для ресурсов компьютера или нет. В случае, если вы планируете использовать несколько хостов, вам может понадобиться прокси-сервер для указания других серверов, Напротив, для одного хоста обратный прокси-сервер указывает на каждое приложение.
А. Нет фиксированного ответа. вы можете добиться того, чего хотите, используя vhost или экспресс-поддомен-обработчик. Или оба.
Моя концепция решения заключается в использовании одного экземпляра сервера с обратным прокси. Позвольте Nginx разместить несколько ваших приложений на одном сервере.
Список приложений.
Я использовал 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
Как построить Структуру.
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.
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
.
.
.
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 для обработки разных запросов?
Поэтому я считаю, что NGINX настроен внутри EC2 и работает перед внутренним сервером. Это означает, что на сайте веб-хостинга я просто создаю другой CNAME и указываю на IP/экземпляр EC2 и позволяю веб-серверу NGINX определять целевой URL-адрес для отправки запроса?
Если мое приложение React развернуто в S3, то я просто меняю location / { proxy_pass http:// }
на IP или URL-адрес моей корзины S3?
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
S3 находится не в экземпляре EC2, а где-то в центре обработки данных AWS. Таким образом, виртуальный хост не является решением для ведра маршрута S3. Вместо этого вы можете использовать Route53 для маршрутизации корзины S3 для вашего домена.
Если у вас уже есть домен. Вы можете настроить сервер имен так, чтобы он указывал на сервер имен AWS. Вы можете получить NS/DNS из консоли Route 53 после регистрации домена.
Между тем, есть проблема со статическим хостингом, реагирующим на приложение (S3-подобный хостинг), вам нужно отказаться от SSR. Поскольку S3 является статическим хостом, он не может работать так, как Lambda или экземпляр сервера.
S3 просто извлечет сохраненный файл для запроса, в данном случае это будет файл сборки для реагирующего приложения. Так что на вашем месте я бы выбрал S3 только для административного приложения, так как SEO не имеет значения для административного приложения.
Пусть ваш корневой домен (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. Я правильно понимаю?
Да, это то, о чем я говорю, братан, я думаю, что это хорошо для тебя!
Эй, чувак, спасибо за столько информации! Я многому научился из вашего ответа и очень ценю его, надеюсь, мне удастся успешно развернуть приложение. Спасибо.
Удачи в вашем развитии, и я рад, что мой ответ полезен!
О, я забыл часть маршрутизации. Большинство приложений React используют маршрутизацию браузера, а не серверную маршрутизацию.