Как запустить приложение node.js в качестве фоновой службы?

504

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


Исходное сообщение :

Я хочу, чтобы мой сервер node.js работал в фоновом режиме, то есть: когда я закрываю свой терминал, я хочу, чтобы мой сервер продолжал работать. Я гуглил это и придумал этот урок , однако он не работает как задумано. Поэтому вместо того, чтобы использовать этот демон-сценарий, я подумал, что я просто использовал перенаправление вывода ( 2>&1 >> fileчасть), но это тоже не выходит - я получаю пустую строку в моем терминале, как будто он ожидает вывода / ошибок.

Я также пытался перевести процесс в фоновый режим, но как только я закрываю свой терминал, процесс также прекращается.

Так, как я могу оставить это работающим, когда я выключаю свой локальный компьютер?


Лучшие решения :

Питер Крайтоф
источник
3
Я думаю, что он хотел закрыть свою локальную систему
Камаль Редди
46
он имел в виду, что закрытие сессии ssh завершает задачу
thedjaney
5
github.com/Unitech/pm2 - очень ухоженный и очень стабильный менеджер процессов, попробуйте!
Unitech
1
Вы можете использовать экран ( aperiodic.net/screen/quick_reference )
Карантан

Ответы:

435

Копирование моего собственного ответа из Как я могу запустить приложение Node.js как его собственный процесс?

Ответ 2015 года : почти каждый дистрибутив Linux поставляется с systemd, что означает, что навсегда, monit, PM2 и т. Д. Больше не нужны - ваша ОС уже выполняет эти задачи .

Создайте myapp.serviceфайл (очевидно, заменив «myapp» именем вашего приложения):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Обратите внимание, если вы новичок в Unix: /var/www/myapp/app.js должно быть #!/usr/bin/env nodeв самой первой строке.

Скопируйте файл службы в /etc/systemd/system.

Начни с systemctl start myapp.

Включите его при загрузке с systemctl enable myapp.

Смотрите логи с journalctl -u myapp

Это взято из раздела Как мы развертываем приложения для узлов в Linux, выпуск 2018 года , который также включает команды для генерации AWS / DigitalOcean / Azure CloudConfig для построения серверов Linux / узлов (включая .serviceфайл).

mikemaccana
источник
4
Выскочка, когда доступно, тоже хорошее решение. В любом случае, вам не следует полагаться на процесс nodejs, чтобы поддерживать работающий демон nodejs. Это одна задача для ОС исключительно. killall nodejs и навсегда ушел ....
131
19
Обратите внимание, что также возможно запускать службы systemd как пользователь. Смотрите, например, этот учебник . Вы можете поместить свой сервисный файл в ~/.config/systemd/user, запустить его с systemctl --user start myapp, включить его с systemctl --user enable myapp.
cdauth
5
Спасибо за этот ответ. Это то, что я хочу, чистый и ясный
bmavus
5
Я принял этот ответ вместо «вечного» ответа, так как я также думаю, что это лучший способ сделать это. Есть похожие ответы для Mac и Windows, но я думаю, что большинство ищет решение для Linux.
Питер Крайтоф
11
в EC2 путь AMI / etc / systemd / system не существует. Можете ли вы указать правильный путь в AWS EC2 Linux AMI?
Рене Мишель
241

Вы можете использовать Forever, простой инструмент CLI для обеспечения непрерывной работы данного скрипта узла (т. Е. Навсегда): https://www.npmjs.org/package/forever

напоить
источник
4
С последним узлом я не смог заставить его остановить приложение с помощью имени скрипта (ошибка) - а также - как правило, плохо себя ведет (был на OS-X) - все построено из исходного кода, как ни странно. Оставил вещи в плохом состоянии, не вселил в меня уверенность.
Майкл Нил
4
В то время как nohup добивается цели, навсегда - лучшее решение, так как он демонизирует процесс. Отличный инструмент!
Питер Крайтоф
5
Кстати, более простое руководство доступно здесь: Поддерживайте сервер node.js вместе с Forever
kehers
2
Некоторое время я пользовался Forever, в начале все было нормально, но потом произошла катастрофа. Навсегда не мог больше управлять процессами и позволял им дичать. Все еще пытаюсь найти лучшее решение. Я постараюсь использовать nohup
LN
5
Джеффри - нет, вам нужно сделать это forever start /path/to/yourApp.jsв скрипте запуска вашего сервера.
mikermcneil
215

ОБНОВЛЕНИЕ - Как упомянуто в одном из ответов ниже, у PM2 есть действительно хорошая функциональность, отсутствующая навсегда. Подумайте об этом.

Оригинальный ответ

Используйте nohup :

nohup node server.js &

РЕДАКТИРОВАТЬ Я хотел бы добавить, что принятый ответ действительно путь. Я использую вечно в случаях, когда нужно не спать. Мне нравится делать npm install -g foreverтак, что это в пути узла, а затем просто сделатьforever start server.js

NG.
источник
136
Крутая часть, чтобы знать: это nohupозначает, no hangupчто происходит со старых времен, когда вы хотели, чтобы вы поддерживали процесс, когда вы «зависаете» свой модем.
jAndy
1
в настоящее время это скорее название сигнала 1, который получают процессы, чтобы предупредить, что пользователь закрыл оболочку (или, конечно, потерял модемное соединение: P)
lapo
7
Это не лучшее решение, потому что, если приложение обнаружит неперехваченную ошибку, процесс узла завершится и не перезапустится. Тем не менее, это разумный вариант для развития.
Энди Э
1
Как бы я добавил к этому переменные среды? Например: PORT = 80 узел server.js
Pardoner
1
Проверьте этот ответ от SO - stackoverflow.com/questions/8825460/…
NG.
67

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

screen
node myserver.js
>>CTRL-A then hit D

Экран отсоединится и выживет после выхода из системы. Затем вы можете вернуть его обратно с помощью screen -r. Нажмите на руководство по экрану для более подробной информации. Вы можете назвать экраны и еще много чего, если хотите.

казарка
источник
2
Кроме того, Tmux это хорошо. Работает как экран (CTRL-B по умолчанию вместо CTRL-A, но настраивается). Tmux имеет панели (разделенные экраны).
snapfractalpop
1
на экране тоже есть панели
Билли Мун
Я использую это с пару недель для метеорного приложения. `$ screen -dr 'для отсоединения и повторного подключения может иногда требоваться.
Vinay Vemula
Для меня самый простой способ сделать работу. Но я согласен, не лучшее решение
Pomme De Terre
Это решение не сохраняется после перезагрузки системы
wnasich
60

Обновление 2016 года: в серии node-windows / mac / linux используется общий API для всех операционных систем, поэтому это абсолютно актуальное решение. Однако; node-linux создает системные файлы инициализации. Поскольку популярность systemd продолжает расти, это действительно лучший вариант для Linux. PR приветствуется, если кто-то хочет добавить поддержку systemd в node-linux :-)

Оригинальная тема:

Сейчас это довольно старый поток, но ноды-окна предоставляют еще один способ создания фоновых сервисов в Windows. Это свободно основано на nssmконцепции использования exeоболочки вокруг скрипта вашего узла. Однако; он использует winsw.exeвместо этого и предоставляет настраиваемую оболочку узла для более детального контроля над тем, как процесс запускается / останавливается при сбоях. Эти процессы доступны как любой другой сервис:

введите описание изображения здесь

Модуль также запекает в некоторых журналах событий:

введите описание изображения здесь

Демонизация вашего скрипта осуществляется с помощью кода. Например:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

Модуль поддерживает такие вещи, как закрытие перезапусков (чтобы плохие скрипты не мешали вашему серверу) и увеличение временных интервалов между перезапусками

Поскольку службы узлов Windows работают, как и любые другие, можно управлять / контролировать службу с помощью любого программного обеспечения, которое вы уже используете.

Наконец, нет никаких makeзависимостей. Другими словами, просто npm install -g node-windowsбудет работать. Вам не нужна Visual Studio, .NET или магия нод-гипса, чтобы установить это. Кроме того, это MIT и BSD лицензированы.

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

Corey
источник
8
Теперь я перенес это на node-mac , предоставляя ту же функциональность в OSX.
Кори
1
Я пришел к тому, чтобы запланировать пару программ для Node и встать перед решением выбрать нод-окна, навсегда или Kue. Я склоняюсь к окнам узлов, но хотел бы понять, почему бы не использовать Forever или Kue, когда я хочу планировать и контролировать дюжину программ узлов. Некоторые работают вечно. Нужен мониторинг тоже.
Кристиан Вестербик
5
Node-windows использует собственную ОС для управления фоновыми службами и собственный журнал событий для ведения журнала. Forever имеет свой собственный мониторинг и логи. Я написал статью об этом на medium.com/p/2a602ea657a2. Похоже, вам нужно планировать свои скрипты, а не запускать их все время в качестве фоновых сервисов. Такие проекты, как Kue и Agenda, предназначены для этого. Окна Node & Forever служат для других целей.
Кори
1
@Corey, как мне запустить пример, включенный в node-mac?, Из терминала, я попробовал узел install.js, но, похоже, он не забирает helloworld.js
Эдвин Икечукву Okonkwo
@ Эдвин - Лучше всего открыть новый вопрос с более подробной информацией о проблеме, включая код, который вы используете.
Кори
28

ОБНОВЛЕНИЕ : я обновил, чтобы включить последние от pm2:

во многих случаях использование службы systemd является самым простым и наиболее подходящим способом управления процессом узла. для тех, кто выполняет многочисленные процессы узлов или независимо запускает микросервисы узлов в одной среде, pm2 - более полнофункциональный инструмент.

https://github.com/unitech/pm2

http://pm2.io

  • он имеет действительно полезную функцию мониторинга -> симпатичный графический интерфейс для мониторинга нескольких процессов с помощью командной строки pm2 monitили списка процессов сpm2 list
  • организованный журнал управления -> pm2 logs
  • другие вещи:
    • Конфигурация поведения
    • Поддержка исходной карты
    • PaaS совместимый
    • Смотреть и Перезагрузить
    • Модульная система
    • Макс перезагрузка памяти
    • Кластерный режим
    • Горячая перезагрузка
    • Рабочий процесс разработки
    • Скрипты запуска
    • Авто завершение
    • Рабочий процесс развертывания
    • Мониторинг ключевых показателей
    • API
закром
источник
20

Если вы просто хотите запустить скрипт без перерыва до его завершения, вы можете использовать его, nohupкак уже упоминалось в ответах здесь. Однако ни один из ответов не предоставляет полную команду, которая также регистрирует stdinи stdout.

nohup node index.js >> app.log 2>&1 &
  • В >>означает добавление к app.log.
  • 2>&1гарантирует, что ошибки также отправляются stdoutи добавляются в app.log.
  • Окончание &гарантирует, что ваш текущий терминал отключен от команды, чтобы вы могли продолжить работу.

Если вы хотите запустить сервер узла (или что-то, что должно запуститься при перезагрузке сервера), вы должны использовать systemd / systemctl .

Xeoncross
источник
1
лучший ответ м8.
bholagabbar
1
хорошо объяснил
Прахар Пракаш Бхардвадж
19

Если вы используете OSX, то самый простой способ создать настоящий системный процесс - использовать его launchdдля запуска.

Создайте plist, подобный этому, и поместите его в / Library / LaunchDaemons с именем top-level-domain.your-domain.application.plist(для его размещения вам нужно быть пользователем root):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

Когда закончите, выпустите это (как root):

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

и ты бежишь.

И вы все равно будете работать после перезагрузки.

Для других вариантов в листе списка просмотрите man-страницу здесь: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

Ларс Кристенсен
источник
Какой пользователь будет запускать службу? Есть ли способ установить пользователя?
rjmunro
15

Попробуйте запустить эту команду, если вы используете nohup -

nohup npm start 2>/dev/null 1>/dev/null&

Вы также можете использовать навсегда, чтобы запустить сервер

forever start -c "npm start" ./ 

PM2 также поддерживает npm start

pm2 start npm -- start
Химаншу Теотия
источник
2
спасибо, это работало отлично. pm2 start npm -- start
Ядавр
13

Я просто использую модуль демона npm:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

В последнее время я также использую mon (1) от TJ Holowaychuk для запуска и управления простыми приложениями для узлов.

Журнал
источник
12

Я использую Supervisor для разработки. Это просто работает. Когда вы вносите изменения в файл .js, Supervisor автоматически перезапускает ваше приложение с этими загруженными изменениями.

Вот ссылка на его страницу Github

Установить:

sudo npm установить супервизор -g

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

Вы можете использовать nohup и supervisor, чтобы приложение вашего узла работало в фоновом режиме даже после выхода из системы.

руководитель sudo nohup myapp.js &

Дональд Гари
источник
1
Я думаю, что на практике супервизор является лучшим вариантом, чем большинство модулей-демонов, особенно используемых вместе с веб-крюком для проверки обновлений.
Иан Коллинз
Я второй этот. Если вы измените файлы PHP, перезапустите сервер Apache или Nginx? Точно нет. Тогда зачем перезагружать весь сервер Node.js, даже просто изменив одну строку кода? Хотя это может быть не лучшим решением, при аренде с Supervisor вам не нужно беспокоиться о процессе перезапуска (фактически перезапуск все же происходит).
Чжан Базз
7

Node.js в качестве фонового сервиса в WINDOWS XP

Установка:

  1. Установите WGET http://gnuwin32.sourceforge.net/packages/wget.htm через исполняемый файл установщика
  2. Установите GIT http://code.google.com/p/msysgit/downloads/list через исполняемый файл установщика
  3. Установите NSSM http://nssm.cc/download/?page=download, скопировав nnsm.exe в папку% windir% / system32
  4. Создайте c: \ node \ helloworld.js

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
  5. Откройте командную консоль и введите следующее (setx, только если установлен Resource Kit)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
  6. Отличный пакетный вкус - создать c: \ node \ ServiceMe.cmd

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause

Управление сервисом:

  • Сами службы теперь доступны через Пуск-> Выполнить-> services.msc или через Пуск-> Выполнить-> MSCONFIG-> Службы (и отметьте «Скрыть все службы Microsoft»).
  • Сценарий будет префикс каждого узла, созданного с помощью пакетного сценария, с помощью 'node-'.
  • Также их можно найти в реестре: " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "
Page2PagePro
источник
7

Принятый ответ, вероятно, является лучшим производственным ответом, но для быстрого взлома, выполняя работу разработчика, я нашел это:

nodejs scriptname.js & не сработало, потому что nodejs, казалось, сожрал &, и поэтому это не позволило мне продолжать использовать терминал без сценария script.js.

Но я положил nodejs scriptname.jsв файл .sh, и nohup sh startscriptname.sh &работал.

Определенно не производственная вещь, но она решает проблему «мне нужно продолжать использовать мой терминал и не хочу запускать 5 разных терминалов».

ArtHare
источник
4

Если вы используете nodejs на сервере Linux, я думаю, что это лучший способ.

Создайте сценарий службы и скопируйте в /etc/init/nodejs.conf

запуск службы: запуск узла sudo servicejs

остановка службы: остановка службы sudo

Сервисный скрипт

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script
Педро Мунис
источник
4

Обновление
за июнь 2017: Решение для Linux: (Red Hat). Предыдущие комментарии не работают для меня. Это работает для меня на Amazon Web Service - Red Hat 7. Надеюсь, что это работает для кого-то там.

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add
Эман Джейм
источник
Очень интересно, мне просто интересно, iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080чем он занимается. Можете ли вы дать мне более подробную информацию, пожалуйста. Я не уверен , но я думаю , что он перенаправляет трафик 80на 8080котором узел сервера прослушивает, не так ли?
Шакиба Мошири
3

используйте nssm лучшее решение для windows, просто скачайте nssm , откройте cmd в каталоге nssm и введите

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

при этом будет установлена ​​новая служба Windows, которая будет указана на сайте services.msc, откуда вы можете запускать или останавливать службу, эта служба будет запускаться автоматически, и вы можете настроить ее перезагрузку в случае сбоя.

Аун Ризви
источник
2

Чтобы завершить различные предлагаемые варианты, вот еще одна: daemonкоманда в GNU / Linux, о которой вы можете прочитать здесь: http://libslack.org/daemon/manpages/daemon.1.html . (извинения, если это уже упоминалось в одном из комментариев выше).

Рави
источник
1

Проверьте фугу! Помимо запуска большого количества рабочих, вы также можете демонизировать процесс вашего узла!

http://github.com/pgte/fugue

Шрипад Кришна
источник
1

Кто-нибудь заметил тривиальную ошибку позиции «2> & 1»?

2>&1 >> file

должно быть

>> file 2>&1
osexp2003
источник
1

Я использую tmux для среды разработки нескольких окон / панелей на удаленных хостах. Отсоединить и поддерживать процесс в фоновом режиме очень просто. Посмотрите на Tmux

Карл Покус
источник
1

Для людей, использующих более новые версии модуля daemon npm - вам нужно передавать файловые дескрипторы вместо строк:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});
Виктор Нонов
источник
0

PM2 - это менеджер производственных процессов для приложений Node.js со встроенным балансировщиком нагрузки. Это позволяет вам поддерживать приложения в актуальном состоянии, перезагружать их без простоев и облегчать общие задачи системного администратора. https://github.com/Unitech/pm2

Арезки Лебдири
источник
серьезные проблемы с потреблением памяти! пойти на phusion + nginx
Ризван Патель
0

Я удивлен, что никто не упомянул Гувнора

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

введите описание изображения здесь

Изменить: Тем не менее, я не уверен, работает ли он на окнах. Я использовал это только на Linux.

мистифицировать
источник
4
Кажется устаревшим с 2017 года. Сборка не удалась. Никаких кодов не было в прошлом году. Под вопросом.
Азатар
0

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

Есть поддержка докеров для Windows, macOS и большинства / основных дистрибутивов Linux. Установка Docker на поддерживаемой платформе довольно проста и хорошо документирована. Настроить приложение Node.js так же просто, как поместить его в контейнер и запустить этот контейнер, убедившись, что он перезапускается после завершения работы.

Создать изображение контейнера

Предполагая, что ваше приложение доступно в / home / me / my-app на этом сервере, создайте текстовый файл Dockerfile в папке / home / me / my-app с содержимым, подобным этому:

FROM node:lts-alpine
COPY /my-app /app
CMD ["/app/server.js"]

Создайте изображение, используя команду как это:

docker build -t myapp-as-a-service /home/me

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

Начать контейнер

Используйте эту команду для запуска контейнера:

docker run -d --restart always -p 80:3000 myapp-as-a-service

Эта команда предполагает, что ваше приложение прослушивает порт 3000, и вы хотите, чтобы оно было выставлено на порту 80 вашего хоста.

Это очень ограниченный пример, но это хорошая отправная точка.

Томас Урбан
источник
0

Если вы используете pm2, вы можете использовать его с autorestartустановленным на false:

экосистема $ pm2

Это сгенерирует образец ecosystem.config.js:

module.exports = {
  apps: [
    {
      script: './scripts/companies.js',
      autorestart: false,
    },
    {
      script: './scripts/domains.js',
      autorestart: false,
    },
    {
      script: './scripts/technologies.js',
      autorestart: false,
    },
  ],
}

$ pm2 start ecosystem.config.js

Жюльен Ле Купанец
источник
-1

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

screen -dmS newScreenName nohup node myserver.js >> logfile.log

Я также добавляю >> logfileбит в конце, чтобы я мог легко сохранить console.log()операторы узла .

Почему я использовал сценарий оболочки? Я также добавил оператор if, который проверял, node myserver.jsзапущен ли уже процесс.

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

Анвар Хадж Джефферсон-Джордж
источник
2
Я столкнулся с этой проблемой и довольно плохо знаком с Linux. Как бы вы сделали это без экрана или nohup?
Крейг Нортон