当服务器closures/崩溃时,节点JS自动重启所有的永久JS进程

我正在使用永久的js让我的节点服务器在AWS EC2上24/7全天候运行。

我使用这个命令

forever start index.js 

但是,我注意到有一段时间它随机停止了这个过程,我的网站就停止了。 我必须手动ssh到我的服务器再次运行它通过做:

 forever restartall 

然后它进行备份。 有什么办法可以定义一个超时,可以说,如果服务器/网站在5秒内没有响应200,然后自动重新启动所有永久进程?

我是新来的,如果有人可以给我一步一步的例子,这将是非常棒的。

NodeJS服务器不应该无故停止。 大多数时候,这是因为500错误,将停止服务器,那么你将不得不重新启动它。 forever是默认使用node来启动你的服务器。

nodemon是一个npm包,当代码更改或服务器停止时,可以重新启动服务器。

你可以一起使用forevernodemon

 forever start nodemon --exitcrash app.js 

要么

 forever start -c nodemon app.js 

我会build议使用PM2

运行服务器生产服务器的最佳select是哪一个

以这种方式运行你的应用程序的优点是什么?

  • 易于安装和运行。
  • 如果PM2崩溃,PM2会自动重启你的应用程序。

  • PM2会logging你的未处理的exception – 在这种情况下,在/home/safeuser/.pm2/logs/app-err.log文件中。

  • 使用一个命令,PM2可以确保在服务器重新引导时,它pipe理的任何应用程序都会重新启动。 基本上,您的节点应用程序将作为服务启动。

ref: https : //www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

所以这是一个使用cron运行脚本的例子,可以重启服务/执行一些自动化的任务。 基本上,我创build了一些脚本,我需要在我的服务器上以一定的时间间隔运行。 对于你的情况,你需要创build一个脚本来自动检查forever restartall的状态,如果返回错误的响应,请运行上面提到的forever restartall命令。 crontab中

你可以通过在服务器上创build一个新的crontab项来设置它。 就剧本而言, 我决不是一个bash剧本大师; 我做了一个简单的脚本,适合我。 这是一个检查我的机器上的服务,如果它没有运行,重新启动它的例子。

 #!/bin/bash zabbix_server="service zabbix-server" zabbix_agent="service zabbix-agent" logfile=zabbix_auto_restart.log logfilePath=/etc/scripts/zabbix/$logfile zabbix_server_running=0 zabbix_agent_running=0 grep_agent (){ local retval=$(ps -ef | grep -v grep | grep zabbix_agentd | wc -l) echo $retval } grep_server (){ local retval=$(ps -ef | grep -v grep | grep zabbix_server | wc -l) echo $retval } check_zabbix_agentd (){ if (( $(grep_agent) <= 0 )) then sudo /etc/init.d/zabbix-agent start echo `date` "$zabbix_agent was stopped... Restarting" >> $logfilePath echo "************************************************" >> $logfilePath #Send email to notify that the script ran echo "$(date) $zabbix_agent was restarted from zabbix_restart.sh" | mutt -s "Zabbix Auto-restart Script Just Ran" evan.bechtol@ericsson.com else let zabbix_agent_running=1 fi } check_zabbix_server (){ if (( $(grep_server) <= 0 )) then sudo /etc/init.d/zabbix-server start echo `date` "$zabbix_server was stopped... Restarting" >> $logfilePath echo "************************************************" >> $logfilePath #Send email to notify that the script ran echo "$(date) $zabbix_server was restarted from zabbix_restart.sh" | mutt -s "Zabbix Auto-restart Script Just Ran" evan.bechtol@ericsson.com else let zabbix_server_running=1 fi } main_loop (){ until ((zabbix_server_running == 1 && zabbix_agent_running == 1)); do check_zabbix_agentd check_zabbix_server sleep 1.5 done } main_loop 

这个video是一个非常棒的节点部署系列的一部分,最终在UNIX服务器上使用一个服务…也许它可以帮助你。 顺便说一句,这是值得看所有四个video… Youtube-Link

你有没有考虑pm2作为替代。 pm2有一些漂亮的function,比如:

  • 运行群集
  • 重新启动集群中的实例(零停机时间部署)
  • 资源监控(显示实时cpu和内存使用情况)
  • 使用clipipe理所有pm2进程

您也可以通过添加--restart-delay <delay>选项来控制重新启动。

特此全力输出这个工具的帮助。

 pm2 --help ------------- Looking for a complete monitoring and management tool for PM2? _ _ _ _ | | _____ _ _ _ __ ___ ___| |_ _ __(_) ___ ___ (_) ___ | |/ / _ \ | | | '_ ` _ \ / _ \ __| '__| |/ __/ __| | |/ _ \ | < __/ |_| | | | | | | __/ |_| | | | (__\__ \_| | (_) | |_|\_\___|\__, |_| |_| |_|\___|\__|_| |_|\___|___(_)_|\___/ |___/ Features - Real Time Dashboard - CPU/Memory monitoring - HTTP monitoring - Event notification - Custom value monitoring - Real Time log display Checkout https://keymetrics.io/ ------------- [PM2] Spawning PM2 daemon [PM2] PM2 Successfully daemonized Usage: pm2 [cmd] app Commands: start [options] <file|json|stdin|app_name|pm_id...> start and daemonize an app deploy <file|environment> deploy your json startOrRestart <json> start or restart JSON file startOrReload <json> start or gracefully reload JSON file startOrGracefulReload <json> start or gracefully reload JSON file stop [options] <id|name|all|json|stdin...> stop a process (to start it again, do pm2 restart <app>) restart [options] <id|name|all|json|stdin...> restart a process scale <app_name> <number> scale up/down a process in cluster mode depending on total_number param reload <name|all> reload processes (note that its for app using HTTP/HTTPS) gracefulReload <name|all> gracefully reload a process. Send a "shutdown" message to close all connections. id <name> get process id by name delete <name|id|script|all|json|stdin...> stop and delete a process from pm2 process list sendSignal <signal> <pm2_id|name> send a system signal to the target process ping ping pm2 daemon - if not up it will launch it updatePM2 update in-memory PM2 with local PM2 update (alias) update in-memory PM2 with local PM2 install|module:install <module|git:/> install or update a module and run it forever module:update <module|git:/> update a module and run it forever module:generate [app_name] Generate a sample module in current folder uninstall|module:uninstall <module> stop and uninstall a module publish|module:publish Publish the module you are currently on set <key> <value> sets the specified config <key> <value> multiset <value> multiset eg "key1 val1 key2 val2 get [key] get value for <key> conf [key] [value] get / set module config values config <key> [value] get / set module config values unset <key> clears the specified config <key> interact [options] [secret_key|command] [public_key] [machine_name] linking action to keymetrics.io - command can be stop|info|delete|restart link [options] [secret_key|command] [public_key] [machine_name] linking action to keymetrics.io - command can be stop|info|delete|restart web launch a health API on port 9615 dump dump all processes for resurrecting them later save (alias) dump all processes for resurrecting them later resurrect resurrect previously dumped processes startup [platform] auto resurrect process at startup. [platform] = ubuntu, centos, redhat, gentoo, systemd, darwin, amazon logrotate copy default logrotate configuration generate generate an ecosystem.json configuration file ecosystem generate an ecosystem.json configuration file reset <name|id|all> reset counters for process describe <id> describe all parameters of a process id desc <id> (alias) describe all parameters of a process id info <id> (alias) describe all parameters of a process id show <id> (alias) describe all parameters of a process id list list all processes ls (alias) list all processes l (alias) list all processes status (alias) list all processes jlist list all processes in JSON format prettylist print json in a prettified JSON monit launch termcaps monitoring m (alias) launch termcaps monitoring flush flush logs reloadLogs reload all logs logs [options] [id|name] stream logs file. Default stream all logs kill kill daemon pull <name> [commit_id] updates repository for a given app forward <name> updates repository to the next commit for a given app backward <name> downgrades repository to the previous commit for a given app gc force PM2 to trigger garbage collection deepUpdate performs a deep update of PM2 * Options: -h, --help output usage information -V, --version output the version number -v --version get version -s --silent hide all messages -m --mini-list display a compacted list without formatting -f --force force actions -n --name <name> set a <name> for script -i --instances <number> launch [number] instances (for networked app)(load balanced) -l --log [path] specify entire log file (error and out are both included) -o --output <path> specify out log file -e --error <path> specify error log file -p --pid <pid> specify pid file -k --kill-timeout <delay> delay before sending final SIGKILL signal to process --max-memory-restart <memory> specify max memory amount used to autorestart (in megaoctets) --restart-delay <delay> specify a delay between restarts (in milliseconds) --env <environment_name> specify environment to get specific env variables (for JSON declaration) -x --execute-command execute a program using fork system -u --user <username> define user when generating startup script --hp <home path> define home path when generating startup script -c --cron <cron_pattern> restart a running process based on a cron pattern -w --write write configuration in local folder --interpreter <interpreter> the interpreter pm2 should use for executing app (bash, python...) --interpreter-args <arguments> interpret options (alias of --node-args) --log-date-format <momentjs format> add custom prefix timestamp to logs --no-daemon run pm2 daemon in the foreground if it doesn't exist already --skip-env do not refresh environmnent on restart/reload --source-map-support force source map support --only <application-name> with json declaration, allow to only act on one application --disable-source-map-support force source map support --merge-logs merge logs from different instances but keep error and out separated --watch [paths] watch application folder for changes --ignore-watch <folders|files> folder/files to be ignored watching, chould be a specific name or regex - eg --ignore-watch="test node_modules "some scripts"" --node-args <node_args> space delimited arguments to pass to node in cluster mode - eg --node-args="--debug=7001 --trace-deprecation" --no-color skip colors --no-vizion start an app without vizion feature (versioning control) --no-autorestart start an app without automatic restart --no-treekill Only kill the main process, not detached children --no-pmx start an app without pmx --no-automation start an app without pmx Basic Examples: Start an app using all CPUs available + set a name : $ pm2 start app.js -i 0 --name "api" Restart the previous app launched, by name : $ pm2 restart api Stop the app : $ pm2 stop api Restart the app that is stopped : $ pm2 restart api Remove the app from the process list : $ pm2 delete api Kill daemon pm2 : $ pm2 kill Update pm2 : $ npm install pm2@latest -g ; pm2 update More examples in https://github.com/Unitech/pm2#usagefeatures Deployment help: $ pm2 deploy help 

弄清楚了。 这个问题是由于我的EC2实例中有更less的RAM可用。 我升级到2 GB的内存,并没有经历到目前为止的崩溃。

节点也可以使未捕获的exception错误,但我的主要问题是由于内存较less。

希望这可以帮助别人。