Я развернул веб-сайт (React + node.js) с помощью VDS (hostvds). Я установил apache 2, npm serve и npm навсегда.
Проблема: Я не могу поддерживать внешний интерфейс и серверную часть одновременно, когда я выхожу из puTTy.
Что я сделал для развертывания приложения:
-Для запуска бэкэнда я использую: forever server.js (используя консоль VDS)
-Для запуска внешнего интерфейса в папке /var/www/html, куда я переместил свою папку сборки, я использую сборку serve (используя puTTy)
Все работает отлично, но когда я выхожу из puTTy, интерфейс перестает работать.
Может ли кто-нибудь сказать мне, как запустить и сохранить интерфейс? Спасибо
Почему бы вам не попробовать использовать навсегда для внешнего интерфейса? Если я хорошо помню, весь смысл службы навсегда состоит в том, чтобы поддерживать выполнение команды, даже если вы остановите терминал. Я бы попробовал что-то вроде навсегда start -c "npm start".
Проблема, с которой вы столкнулись, заключается в том, что команда, которую вы запускаете впереди, подключена к tty, и когда вы закрываете соединение, команда также умирает. На обратной стороне этого не происходит, потому что инструмент навсегда отсоединяет его, чтобы он мог эффективно работать вечно. Ваш вопрос можно резюмировать так: «Как запустить несколько команд в автономном режиме?» Быстрый поиск дает некоторые результаты, которые могут достичь того, что вы ищете, например с помощью экрана. У вас есть несколько подходов:
# run backend command
screen -dm "npm start"
# run frontend command
screen -dm "npm start"
Обратите внимание, что команда screen используется для создания новых сеансов и их отключения от tty. Так что nohup может справиться с вашей проблемой. и
Другой, более надежный способ — это использование сервисов systemd и управление жизненным циклом с помощью команды systemctl
. Таким образом, вы можете определить политики перезапуска (автоматический перезапуск при сбое), а также автоматический запуск при перезагрузке машины. Вам нужно будет создать две разные единицы, одну для задней части и одну для передней.
[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
[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].
Выполнение вариантов 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
Подробнее о сборке статики здесь
Отличный ответ, очень полный и полезный. Проблема решена, спасибо!
Спасибо за Ваш ответ. Если я попробую «навсегда запустить -c» npm start, результатом будет много «помощи». Первый: «помощь: использование навсегда [действие] [опция] СКРИПТ [опции сценария]. Если я просто попробую запустить npm, мое приложение будет работать (пока я не выйду из puTTy). Если я попытаюсь отредактировать package.json в «script»: {«start»: «навсегда запустить src/App.js», это не сработает...