2016-05-12 19 views
7

我使用永久js讓我的節點服務器在AWS EC2上全天候運行。當服務器宕機/崩潰時,節點JS自動重啓所有永久JS進程

我使用這個命令

forever start index.js 

然而,我注意到,一段時間後它隨機停止的過程和我的網站會下降。我必須手動ssh到我的服務器再次運行它:

forever restartall 

然後它進行備份。有沒有什麼辦法可以定義一個超時時間,可以說服務器/網站在5秒內沒有響應200,然後自動重新啓動所有進程?

我對此很陌生,如果有人能爲我提供一步一步的例子,那就太棒了。

+2

如果這是一個* NIX的機器,那麼你可以簡單地定義在一個cron作業運行檢查過程中的狀態,必要時重新啓動一個shell腳本。 –

+0

可能重複[在系統重新啓動時自動啓動永久(節點)](http://stackoverflow.com/questions/13385029/automatically-start-forever-node-on-system-restart) –

+0

@EvanBechtol它在AWS EC2 t2 .micro linux ubuntu ..我對此完全陌生,請給出代碼示例如何以及在何處定義和運行shell腳本?謝謝,我會標記它最好的答案:) – Faizan

回答

0

想通了。這個問題是由於我的EC2實例中有更少的RAM可用。我將RAM升級至2 GB,至今尚未遇到此類故障。

節點還可以使未捕獲的異常錯誤,但我的主要問題是由於內存較少。

希望這可以幫助別人。

+1

雖然這是你的問題的答案,它並不真的回答提出的問題。你可能會在未來再次遇到這個問題,而且更多的負載和垂直縮放通常不是答案。 – juz

+1

你應該真的看看pm2,就像我上面的回答一樣。您可以在任何時間點使用'pm2 monit ' –

2

因此,這是一個使用cron來運行可以重新啓動服務/執行一些自動化任務的腳本的示例。基本上,我創建了一些腳本,我需要在服務器上以特定時間間隔運行。對於你的情況,你需要創建一個腳本來自動檢查forever.js的狀態,如果它返回錯誤的響應,請運行上面提到的forever restartall命令。 crontab

您可以在服務器上設置爲creating a new crontab entry。至於腳本去,我絕不是一個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" [email protected] 

     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" [email protected]n.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 
2

此視頻是一個真棒與UNIX的服務器上使用服務結束了節點的部署系列的一部分...也許它可以幫助你。順便說一句,這是值得看全部四個視頻... Youtube-Link

10

一個NodeJS服務器不應該停止無故。大部分時間,這是因爲500錯誤會停止服務器,那麼您將不得不重新啓動它。 forever默認情況下使用node來啓動服務器。

nodemon是一個npm包,當代碼更改或服務器停止時,可以重新啓動服務器。

您可以通過執行使用forevernodemon在一起:

forever start nodemon --exitcrash app.js 

forever start -c nodemon app.js 
1

你有沒有考慮pm2作爲替代。PM2有一些漂亮整潔的功能,如:

  • 運行的集羣
  • 一(零停機時間部署)
  • 資源監控重啓實例集羣之一(顯示實時的CPU和內存使用率)
  • 管理所有使用cli的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 - e.g. --ignore-watch="test node_modules "some scripts"" 
--node-args <node_args>    space delimited arguments to pass to node in cluster mode - e.g. --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 [email protected] -g ; pm2 update 

More examples in https://github.com/Unitech/pm2#usagefeatures 

Deployment help: 

$ pm2 deploy help 
+0

查看實時內存使用情況。在早些時候調查此問題時,我會閱讀有關永久性問題的幾個問題。 PM2是我在此基礎上的選擇,儘管經過數月的使用,我沒有任何理由抱怨。 –

相關問題