[英]How to make a node.js application run permanently?
在 Debian 服務器上,我安裝了 Node.js。我了解如何使用此命令行從 putty 啟動應用程序:
node /srv/www/MyUserAccount/server/server.js
並通過地址50.51.52.53:8080
和端口)訪問它。
但是一旦我關閉膩子,我就無法再到達地址50.51.52.53:8080
。
如何讓一個Node.js的應用永久運行?
你可以猜到,我是 Linux 和 Node.js 的初學者。
你可以像這樣使用 npm永久安裝:
sudo npm install -g forever
然后使用以下命令啟動您的應用程序:
forever server.js
或作為服務:
forever start server.js
Forever 在您的應用程序因某種原因崩潰或停止時重新啟動。 要將重新啟動限制為 5,您可以使用:
forever -m5 server.js
列出所有正在運行的進程:
forever list
請注意括號中的整數,並按如下方式使用它來停止進程:
forever stop 0
重新啟動正在運行的進程:
forever restart 0
如果您正在處理應用程序文件,則可以使用-w
參數在server.js
文件更改時自動重新啟動:
forever -w server.js
盡管其他答案解決了 OP 的問題,但它們都有些矯枉過正,並沒有解釋他或她遇到此問題的原因。
關鍵是這一行,“我關閉putty,然后我無法到達地址”
當您在 Putty 上登錄到遠程主機時,您已經啟動了一個 SSH linux 進程,並且從該 SSH 會話鍵入的所有命令都將作為該進程的子進程執行。
您的問題是,當您關閉 Putty 時,您正在退出 SSH 會話,這會殺死該進程和任何活動的子進程。 當您關閉 putty 時,您無意中殺死了您的服務器,因為您在前台運行它。 為了避免這種行為,通過將 & 附加到您的命令在后台運行服務器:
node /srv/www/MyUserAccount/server/server.js &
這里的問題是缺乏 linux 知識,而不是關於 node.js 的問題。 有關更多信息,請查看: http : //linuxconfig.org/understanding-foreground-and-background-linux-processes
更新:
正如其他人提到的,節點服務器在退出終端時仍然可能死亡。 我遇到的一個常見問題是,即使節點進程在 bg 中運行,它的 stdout 和 stderr 仍然指向終端。 這意味着如果節點服務器寫入console.log 或console.error,它將收到管道損壞錯誤並崩潰。 這可以通過管道輸出過程來避免:
node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &
如果問題仍然存在,那么您應該研究諸如tmux或nohup之類的東西,它們仍然比特定於節點的解決方案更強大,因為它們可用於運行所有類型的進程(數據庫、日志服務、其他語言)。
一個可能導致服務器退出的常見錯誤是,在運行nohup node your_path/server.js &
您只需單擊一下即可關閉 Putty 終端。 您應該改用exit
命令,然后您的節點服務器將啟動並運行。
您可以使用PM2 ,它是具有內置負載均衡器的 Node.js 應用程序的生產流程管理器。
安裝 PM2
$ npm install pm2 -g
啟動應用程序
$ pm2 start app.js
如果您使用快遞,那么您可以像這樣啟動您的應用程序
pm2 start ./bin/www --name="app"
列出所有正在運行的進程:
$ pm2 list
它將列出所有進程。 然后,您可以通過以下命令使用應用程序的 ID 或名稱來停止/重新啟動您的服務。
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
顯示日志
$ pm2 logs ['all'|app_name|app_id]
我建議尋找諸如Forever 之類的東西,以便在發生崩潰時重新啟動 Node,並為您處理守護進程。
如果您只想始終在終端中運行您的節點應用程序,只需使用 screen.
在 ubuntu/debian 上安裝:
sudo apt-get install screen
用法:
$ screen
$ node /path/to/app.js
ctrl + a
然后ctrl + d
關閉
返回:
一屏: screen -r
如果有多個屏幕,您可以使用以下命令列出所有屏幕: screen -ls
然后: screen -r pid_number
你可以簡單地使用這個
nohup node /srv/www/MyUserAccount/server/server.js &
這將保持應用程序運行並關閉它,您將不得不殺死它。
為此,您可以安裝htop
,然后搜索節點,然后將其殺死
Forever是一個非常好的 NodeJs 模塊,可以做到這一點。
通過在命令行中鍵入來forever
安裝
$ npm install forever -g
然后使用以下命令運行 node.js 腳本
$ forever start /path/to/script.js
你已准備好出發。 另外你可以運行
$ forever list
查看所有正在運行的腳本。 您可以通過鍵入終止任何特定腳本
$ forever stop [pid]
其中[pid]
是您將從list
命令獲取的腳本的進程 ID。 要停止所有腳本,您可以鍵入
$ forever stopall
在開發過程中,我建議使用nodemon 。 每當文件更改時,它都會重新啟動您的服務器。 正如其他人指出的那樣, Forever是一種選擇,但在生產中,這完全取決於您使用的平台。 您通常希望使用操作系統推薦的方式來保持服務正常運行(例如http://www.freedesktop.org/wiki/Software/systemd/ )。
安裝
$ [sudo] npm install forever -g
您可以使用永遠來連續運行腳本
forever start server.js
forever list
停止服務
forever stop server.js
這是我一直用於個人項目的新貴解決方案:
將它放在/etc/init/node_app_daemon.conf
:
description "Node.js Daemon"
author "Adam Eberlin"
stop on shutdown
respawn
respawn limit 3 15
script
export APP_HOME="/srv/www/MyUserAccount/server"
cd $APP_HOME
exec sudo -u user /usr/bin/node server.js
end script
這也將在應用程序崩潰時處理重新生成應用程序。 如果應用程序在 15 秒內崩潰 3 次或更多次,它將放棄重新生成應用程序的嘗試。
我發現永遠把工作做得很好。
假設你已經安裝了 npm,如果沒有,就這樣做
sudo apt-get install npm
然后永久安裝
npm install forever --global
現在你可以像這樣運行它
forever start app.js
首先全局安裝pm2
npm install -g pm2
然后開始
pm2 start bin/www
另一種方法是為您的應用程序創建一個系統單元。 在“/etc/systemd/system”文件夾中創建一個“XXX.service”文件,類似於:
[Unit]
Description=swagger
After=network.target
[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
一個好處是該應用程序將作為服務運行,如果崩潰,它會自動重新啟動。
您也可以使用 sytemctl 來管理它:
systemctl start XXX
啟動服務, systemctl stop XXX
停止服務, systemctl stop XXX
systemctl enable XXX
在系統啟動時自動啟動應用程序。
無需安裝任何其他軟件包。
運行這個命令
node server.js > stdout.txt 2> stderr.txt &
server.js是您的服務器文件,也可以是api.js
之后點擊“退出”關閉終端
exit
嘗試pm2
使您的應用程序永遠運行。
npm install -g pm2
然后使用
pm2 start server.js
要列出和停止應用程序,請使用 commnds
pm2 list
pm2 stop 0
眾所周知,有很多選擇可以做到這一點。 這是一個純粹的 Shell 解決方案,不需要額外的程序/包。
如果由於某種原因/錯誤而崩潰,此解決方案將重新啟動server.js
。
假設這是一個run.sh
:
#!/usr/bin/env sh
while :; do
node server.js
echo "Restarting..."
sleep 1
done
確保使run.sh
文件可執行:
chmod +x run.sh
並運行它:
./run.sh
如果你想在后台運行它:
./run.sh &
在后台超級安靜地運行(分離,沒有任何輸出):
( ./run.sh > /dev/null 2>&1 & )
我推薦使用 PM2,它是 Node.js 應用程序的進程管理器。 PM2 提供了一種簡單的方法來管理和守護應用程序(將它們作為服務運行)。
永遠包對我有用,只有一件事,它取決於deep-equal ,所以如果您在安裝它時遇到問題,例如:
npm -g install forever
嘗試:
npm -g install forever deep-equal@1.1.1
反而。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.