Сборка, npm serve, npm навсегда: как сохранить развернутый сайт (реакция + nodejs)

Я развернул веб-сайт (React + node.js) с помощью VDS (hostvds). Я установил apache 2, npm serve и npm навсегда.

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

Что я сделал для развертывания приложения:

-Для запуска бэкэнда я использую: forever server.js (используя консоль VDS)

-Для запуска внешнего интерфейса в папке /var/www/html, куда я переместил свою папку сборки, я использую сборку serve (используя puTTy)

Все работает отлично, но когда я выхожу из puTTy, интерфейс перестает работать.

Может ли кто-нибудь сказать мне, как запустить и сохранить интерфейс? Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему бы вам не попробовать использовать навсегда для внешнего интерфейса? Если я хорошо помню, весь смысл службы навсегда состоит в том, чтобы поддерживать выполнение команды, даже если вы остановите терминал. Я бы попробовал что-то вроде навсегда start -c "npm start".

Спасибо за Ваш ответ. Если я попробую «навсегда запустить -c» npm start, результатом будет много «помощи». Первый: «помощь: использование навсегда [действие] [опция] СКРИПТ [опции сценария]. Если я просто попробую запустить npm, мое приложение будет работать (пока я не выйду из puTTy). Если я попытаюсь отредактировать package.json в «script»: {«start»: «навсегда запустить src/App.js», это не сработает...

Dary 09.02.2023 19:56
Ответ принят как подходящий

Проблема, с которой вы столкнулись, заключается в том, что команда, которую вы запускаете впереди, подключена к tty, и когда вы закрываете соединение, команда также умирает. На обратной стороне этого не происходит, потому что инструмент навсегда отсоединяет его, чтобы он мог эффективно работать вечно. Ваш вопрос можно резюмировать так: «Как запустить несколько команд в автономном режиме?» Быстрый поиск дает некоторые результаты, которые могут достичь того, что вы ищете, например с помощью экрана. У вас есть несколько подходов:

Op1: использование экрана

# run backend command
screen -dm "npm start"
# run frontend command
screen -dm "npm start"

Обратите внимание, что команда screen используется для создания новых сеансов и их отключения от tty. Так что nohup может справиться с вашей проблемой. и

Op2: Использование службы systemd

Другой, более надежный способ — это использование сервисов systemd и управление жизненным циклом с помощью команды systemctl. Таким образом, вы можете определить политики перезапуска (автоматический перезапуск при сбое), а также автоматический запуск при перезагрузке машины. Вам нужно будет создать две разные единицы, одну для задней части и одну для передней.

Создайте файлы

/etc/systemd/система/backend.service

[Unit]
Description=My backend

[Service]
Type=simple
Restart=always
User=nobody
Group=nobody
WorkingDirectory=/your/back/dir
ExecStart=/usr/bin/npm start

[Install]
WantedBy=multi-user.target

/etc/systemd/system/frontend.service

[Unit]
Description=My frontennd

[Service]
Type=simple
Restart=always
User=nobody
Group=nobody
WorkingDirectory=/your/front/dir
ExecStart=/usr/bin/npm start

[Install]
WantedBy=multi-user.target

После создания файлов вы можете управлять жизненным циклом службы с помощью systemctl:

Запустите приложения:

systemctl start [backend|frontend]

Остановите приложения:

systemctl stop [backend|frontend]

Проверить состояние:

systemctl status [backend|frontend]

Чтобы включить автозапуск при загрузке, просто включите службы с помощью systemctl enable [backend|frontend]. Вы можете отключить его, используя `systemctl disable [backend|frontend].

Op3: статический интерфейс

Выполнение вариантов 1 и 2 решит вашу проблему, но имейте в виду, что вы обслуживаете интерфейс с помощью npm, когда его можно собрать в статические файлы и обслуживать напрямую с помощью apache2, что уменьшит потребление процессора/памяти и будет намного быстрее. Это касается только внешнего интерфейса, бэкэнд динамический, и ему нужен вариант 1 или 2.

Поскольку вы упоминаете об этом, я предполагаю, что вы знаете, как работает apache2, поэтому просто build внешнее приложение для создания простых файлов html, css и js, затем переместите их в папку apache2, и оно будет предоставлять файлы пользователям для вас.

cd /your/front/folder
npm run build
cp -r build/ /var/www/html

Подробнее о сборке статики здесь

Резюме

Running commands in a shell will attach them and if you close the shell they will die unless you detach them. You can use detaching tools like screen or nohup, or you can change the approach for this specific scenario and use services to handle the lifecycle (apache2 is also a service).

Отличный ответ, очень полный и полезный. Проблема решена, спасибо!

Dary 16.02.2023 01:27

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