詳解node如何實(shí)現(xiàn)多進(jìn)程?如何部署node項(xiàng)目_第1頁
詳解node如何實(shí)現(xiàn)多進(jìn)程?如何部署node項(xiàng)目_第2頁
詳解node如何實(shí)現(xiàn)多進(jìn)程?如何部署node項(xiàng)目_第3頁
詳解node如何實(shí)現(xiàn)多進(jìn)程?如何部署node項(xiàng)目_第4頁
詳解node如何實(shí)現(xiàn)多進(jìn)程?如何部署node項(xiàng)目_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第詳解node如何實(shí)現(xiàn)多進(jìn)程?如何部署node項(xiàng)目?昨天有小伙伴問express項(xiàng)目該如何部署。于是整理了這篇文章,主要講述如何部署一個(gè)基于nodejs開發(fā)的服務(wù)端程序,供有需要的朋友們參考。

文章包含幾個(gè)部分:

線程和進(jìn)程

node.js實(shí)現(xiàn)多進(jìn)程

服務(wù)器安裝Node.js環(huán)境

使用PM2管理Node.js項(xiàng)目

使用Nginx實(shí)現(xiàn)接口服務(wù)的代理轉(zhuǎn)發(fā)

進(jìn)程VS線程

進(jìn)程(process)是計(jì)算機(jī)操作系統(tǒng)分配和調(diào)度任務(wù)的基本單位。打開任務(wù)管理器,可以看到其實(shí)在計(jì)算機(jī)的后臺(tái)運(yùn)行著非常多的程序,每個(gè)程序都是一個(gè)進(jìn)程。

現(xiàn)代瀏覽器基本都是多進(jìn)程架構(gòu)的,以Chrome瀏覽器為例,打開更多工具-任務(wù)管理器,就能看到當(dāng)前瀏覽器的進(jìn)程信息,其中一個(gè)頁面就是一個(gè)進(jìn)程,除此之外,還有網(wǎng)路進(jìn)程,GPU進(jìn)程等。

多進(jìn)程的架構(gòu),得以保證應(yīng)用更穩(wěn)定的運(yùn)行。還是以瀏覽器為例,假如所有的程序都運(yùn)行在一個(gè)進(jìn)程中,如果網(wǎng)絡(luò)出現(xiàn)故障,或者頁面渲染出錯(cuò)問題,都會(huì)導(dǎo)致整個(gè)瀏覽器的崩潰。通過多進(jìn)程的架構(gòu),哪怕網(wǎng)絡(luò)進(jìn)程崩潰了,它不會(huì)影響到已有頁面的展示,最壞也就是暫時(shí)不能接入網(wǎng)絡(luò)。

線程(thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。舉一個(gè)例子,一個(gè)程序好比是一家公司,下設(shè)多個(gè)部門,就是若干個(gè)進(jìn)程;每個(gè)部門的通力合作使得公司正常運(yùn)行,而線程就是員工,是具體干活的人。

我們都知道JavaScript是一門單線程語言。這么設(shè)計(jì)是因?yàn)樵缙贘S主要用來編寫腳本程序,負(fù)責(zé)實(shí)現(xiàn)頁面的交互效果。如果設(shè)計(jì)成多線程語言,一是沒有必要,二是多個(gè)線程共同操作一個(gè)dom節(jié)點(diǎn),那么瀏覽器該聽誰的?當(dāng)然隨著技術(shù)的發(fā)展,現(xiàn)在的JS也支持了多線程,不過僅用來處理一些和dom操作無關(guān)的邏輯。

單進(jìn)程存在的問題

單線程單進(jìn)程帶來一個(gè)嚴(yán)重的問題,一個(gè)運(yùn)行中的node.js程序,一旦主線程掛掉,那么這個(gè)進(jìn)程也就掛掉了,整個(gè)應(yīng)用也就隨之掛掉。再者,現(xiàn)代計(jì)算機(jī)大都是多核CPU,四核八線程,八核十六線程,都是很常見的設(shè)備了。而node.js作為一個(gè)單進(jìn)程的程序,白白浪費(fèi)掉了多核CPU的性能。

針對(duì)這種情況,我們需要一個(gè)合適的多進(jìn)程模型,將一個(gè)單進(jìn)程的node.js程序變?yōu)槎噙M(jìn)程的架構(gòu)。

Node.js的多進(jìn)程實(shí)現(xiàn)

Node.js實(shí)現(xiàn)多進(jìn)程架構(gòu)有兩種常用方案,都是使用原生模塊,分別是child_process模塊和cluster模塊。

child_process

child_process是node.js的內(nèi)置模塊,看名字也能猜到它負(fù)責(zé)的是和子進(jìn)程有關(guān)的事。

我們不再細(xì)說該模塊的具體用法,實(shí)際上它大概只有六七個(gè)方法,還是非常容易理解的。我們使用其中的一個(gè)fork方法來演示如何實(shí)現(xiàn)多進(jìn)程以及多進(jìn)程之間的通信。

先看下準(zhǔn)備好的演示案例的目錄結(jié)構(gòu):

我們使用http模塊創(chuàng)建了一個(gè)httpserver,當(dāng)有/sum請(qǐng)求進(jìn)來時(shí),會(huì)通過child_process模塊創(chuàng)建一個(gè)子進(jìn)程,并通知子進(jìn)程執(zhí)行計(jì)算的邏輯,同時(shí)父進(jìn)程也要監(jiān)聽子進(jìn)程發(fā)來的消息:

//child_process.js

consthttp=require(http)

const{fork}=require(child_process)

constserver=http.createServer((req,res)={

if(req.url==/sum){

//fork方法接收一個(gè)模塊路徑,然后開啟一個(gè)子進(jìn)程,將模塊在子進(jìn)程中運(yùn)行

//childProcess表示創(chuàng)建的子進(jìn)程

letchildProcess=fork(./sum.js)

//發(fā)消息給子進(jìn)程

childProcess.send(子進(jìn)程開始計(jì)算)

//父進(jìn)程中監(jiān)聽子進(jìn)程的消息

childProcess.on(message,(data)={

res.end(data+)

//監(jiān)聽子進(jìn)程的關(guān)閉事件

childProcess.on(close,()={

//子進(jìn)程正常退出和報(bào)錯(cuò)掛掉,都會(huì)走到這里

console.log(子進(jìn)程關(guān)閉)

childProcess.kill()

//監(jiān)聽子進(jìn)程的錯(cuò)誤事件

childProcess.on(error,()={

console.log(子進(jìn)程報(bào)錯(cuò))

childProcess.kill()

if(req.url==/hello){

res.end(hello)

//模擬父進(jìn)程報(bào)錯(cuò)

if(req.url==/error){

thrownewError(父進(jìn)程出錯(cuò))

res.end(hello)

server.listen(3000,()={

console.log(Serverisrunningon3000)

})

sum.js用來模擬子進(jìn)程要執(zhí)行的任務(wù)。子進(jìn)程監(jiān)聽父進(jìn)程發(fā)來的消息,處理計(jì)算任務(wù),然后將結(jié)果發(fā)送給父進(jìn)程:

//sum.js

functiongetSum(){

letsum=0

for(leti=0;i10000*1000*100;i++){

sum+=1

returnsum

//process是node.js中一個(gè)全局對(duì)象,表示當(dāng)前進(jìn)程。在這里也就是子進(jìn)程。

//監(jiān)聽主進(jìn)程發(fā)來的消息

process.on(message,(data)={

console.log(主進(jìn)程的消息:,data)

constresult=getSum()

//將計(jì)算結(jié)果發(fā)送給父進(jìn)程

process.send(result)

})

打開終端,運(yùn)行命令node1.child_process:

訪問瀏覽器:

接著來模擬子進(jìn)程報(bào)錯(cuò)的情況:

//sum.js

functiongetSum(){

//....

//子進(jìn)程運(yùn)行5s后,模擬進(jìn)程掛掉

setTimeout(()={

thrownewError(報(bào)錯(cuò))

},1000*5)

process.on(message,(data)={

//...

})

再次訪問瀏覽器,5秒之后觀察控制臺(tái):

子進(jìn)程已經(jīng)掛掉了,然后再訪問另一個(gè)url:/hello,

可見,父進(jìn)程依然能正確處理請(qǐng)求,說明子進(jìn)程報(bào)錯(cuò),并不會(huì)影響父進(jìn)程的運(yùn)行。

接著我們來模擬父進(jìn)程報(bào)錯(cuò)的場(chǎng)景,注釋掉sum.js模塊的模擬報(bào)錯(cuò),然后重啟服務(wù),瀏覽器訪問/error:

發(fā)現(xiàn)父進(jìn)程掛掉后,整個(gè)node.js程序自動(dòng)退出了,服務(wù)完全崩潰,沒有挽回的余地。

可見,通過child_process的fork方法實(shí)現(xiàn)node.js的多進(jìn)程架構(gòu)并不復(fù)雜。進(jìn)程間的通信主要通過send和on方法,從這個(gè)命名上也能知道,其底層應(yīng)該是一個(gè)發(fā)布訂閱模式。

但是它存在一個(gè)嚴(yán)重的問題,雖然子進(jìn)程不影響父進(jìn)程,但是一旦父進(jìn)程出錯(cuò)掛掉,所有的子進(jìn)程會(huì)被一鍋端掉。所以,這種方案適用于將一些復(fù)雜耗時(shí)的運(yùn)算,fork出一個(gè)單獨(dú)的子進(jìn)程去做。更準(zhǔn)確的來說,這種用法是用來代替多線程的實(shí)現(xiàn),而非多進(jìn)程。

cluster

使用child_process模塊實(shí)現(xiàn)多進(jìn)程,貌似不堪大用。所以一般更推薦使用cluster模塊來實(shí)現(xiàn)node.js的多進(jìn)程模型。

cluster,集群的意思,這個(gè)名詞相信大家都不陌生。打個(gè)比方,以前公司只有一個(gè)前臺(tái),有時(shí)候太忙就沒辦法及時(shí)接待訪客?,F(xiàn)在公司分配了4個(gè)前臺(tái),即使有三個(gè)都在忙,也還有一個(gè)能接待新來的訪客。集群大致也就是這個(gè)意思,對(duì)于同一件事,合理的分配給不同的人去干,以此來保證這件事能做到最好。

cluster模塊的使用也比較簡(jiǎn)單。如果當(dāng)前進(jìn)程是主進(jìn)程,則根據(jù)CPU的核數(shù)創(chuàng)建合適數(shù)量的子進(jìn)程,同時(shí)監(jiān)聽子進(jìn)程的exit事件,有子進(jìn)程退出,就重新fork新的子進(jìn)程。如果不是子進(jìn)程,則進(jìn)行實(shí)際業(yè)務(wù)的處理。

consthttp=require(http)

constcluster=require(cluster)

constcpus=require(os).cpus()

if(cluster.isMaster){

//程序啟動(dòng)時(shí)首先走到這里,根據(jù)CPU的核數(shù),創(chuàng)建出多個(gè)子進(jìn)程

for(leti=0;icpus.length;i++){

//創(chuàng)建出一個(gè)子進(jìn)程

cluster.fork()

//當(dāng)任何一個(gè)子進(jìn)程掛掉后,cluster模塊會(huì)發(fā)出exit事件。此時(shí)通過再次調(diào)用fork來來重啟進(jìn)程。

cluster.on(exit,()={

cluster.fork()

}else{

//fork方法執(zhí)行創(chuàng)建子進(jìn)程,同時(shí)會(huì)再次執(zhí)行該模塊,此時(shí)邏輯就會(huì)走到這里

constserver=http.createServer((req,res)={

console.log(process.pid)

res.end(ok)

server.listen(3000,()={

console.log(Serverisrunningon3000,pid:+process.pid)

}

啟動(dòng)服務(wù):

可以看到,cluster模塊創(chuàng)建出了非常多的子進(jìn)程,好像是每個(gè)子進(jìn)程都運(yùn)行著同一個(gè)web服務(wù)。

需要注意的是,此時(shí)并非是這些子進(jìn)程共同監(jiān)聽同一個(gè)端口。端口的監(jiān)聽依然是由createServer方法創(chuàng)建的server去負(fù)責(zé),將請(qǐng)求轉(zhuǎn)發(fā)給各個(gè)子進(jìn)程。

我們編寫一個(gè)請(qǐng)求腳本,來請(qǐng)求上面的服務(wù),看下效果。

//request.js

consthttp=require(http)

for(leti=0;i1000;i++){

http.get(http://localhost:3000)

}

http模塊不僅可以創(chuàng)建httpserver,還能用來發(fā)送http請(qǐng)求。Axios支持瀏覽器和服務(wù)器環(huán)境,在服務(wù)器端就是使用http模塊發(fā)送http請(qǐng)求。

使用node命令執(zhí)行該文件,再看下原來的控制臺(tái):

打印出了具體處理請(qǐng)求的不同子進(jìn)程的進(jìn)程ID。

這就是通過cluster模塊實(shí)現(xiàn)的nodd.js的多進(jìn)程架構(gòu)。

當(dāng)然,我們?cè)诓渴餹ode.js項(xiàng)目時(shí)不會(huì)這么干巴巴的寫和使用cluster模塊。有一個(gè)非常好用的工具,叫做PM2,它是一個(gè)基于cluster模塊實(shí)現(xiàn)的進(jìn)程管理工具。在后面的章節(jié)中會(huì)介紹它的基本用法。

到此為止,我們花了一部分篇幅介紹node.js中多進(jìn)程的知識(shí),其實(shí)僅是想要交代下為什么需要使用pm2來管理node.js應(yīng)用。本文由于篇幅有限,再加上描述不夠準(zhǔn)確/詳盡,僅做簡(jiǎn)單介紹。如果是第一次接觸這一塊內(nèi)容的朋友,可能沒有太明白,也不打緊,后面會(huì)再出一篇更細(xì)節(jié)的文章。

準(zhǔn)備一個(gè)express項(xiàng)目

本文已經(jīng)準(zhǔn)備了一個(gè)使用express開發(fā)的示例程序,

constexpress=require(express)

constMock=require(mockjs)

constapp=express()

app.get(/api/users,(req,res)={

constuserList=Mock.mock({

userList|10:[{

id|+1:1,

name:@cname,

email:@email

setTimeout(()={

thrownewError(服務(wù)器故障)

},5000)

res.status(200)

res.json(userList)

app.listen(3000,()={

console.log(服務(wù)啟動(dòng):3000)

})

本地測(cè)試一下,在終端中執(zhí)行命令:

nodeserver.js

打開瀏覽器,訪問用戶列表接口:

五秒鐘后,服務(wù)器會(huì)掛掉:

后面我們使用pm2來管理應(yīng)用后,就可以解決這個(gè)問題。

討論:express項(xiàng)目是否需要打包

通常完成一個(gè)vue/react項(xiàng)目后,我們都會(huì)先執(zhí)行打包,再進(jìn)行發(fā)布。其實(shí)前端項(xiàng)目要進(jìn)行打包,主要是因?yàn)槌绦蜃罱K的運(yùn)行環(huán)境是瀏覽器,而瀏覽器存在各種兼容性問題和性能問題,比如:

高級(jí)語法的不支持,需要將ES6+編譯為ES5語法

不能識(shí)別.vue,.jsx,.ts文件,需要編譯

減少代碼體積,節(jié)省帶寬資源,提高資源加載速度

......

而使用express.js或者koa.js開發(fā)的項(xiàng)目,并不存在這些問題。并且,Node.js采用CommonJS模塊化規(guī)范,有緩存的機(jī)制;同時(shí),只有當(dāng)模塊在被用到時(shí),才會(huì)被導(dǎo)入。如果進(jìn)行打包,打包成一個(gè)文件,其實(shí)就浪費(fèi)了這個(gè)優(yōu)勢(shì)。所以針對(duì)node.js項(xiàng)目,并不需要打包。

服務(wù)器安裝Node.js

本文以CentOS系統(tǒng)為例進(jìn)行演示。

為了方便切換node的版本,我們使用nvm來管理node。

Nvm(NodeVersionManager),就是Node.js的版本管理工具。通過它,可以讓node在多個(gè)版本之間進(jìn)行任意切換,避免了需要切換版本時(shí)反復(fù)的下載和安裝的操作。

Nvm的官方倉庫是/nvm-sh/nvm。因?yàn)樗陌惭b腳本存放在githubusercontent站點(diǎn)上,經(jīng)常訪問不了。所以我在gitee上新建了它的鏡像倉庫,這樣就能從gitee上訪問到它的安裝腳本了。

通過curl命令下載安裝腳本,并使用bash執(zhí)行腳本,會(huì)自動(dòng)完成nvm的安裝工作:

#curl-o-/hsyq/nvm/raw/master/install.sh|bash

當(dāng)安裝完成之后,我們?cè)俅蜷_一個(gè)新的窗口,來使用nvm:

[root@ecs-221238~]#nvm

-v0.39.1

可以正常打印版本號(hào),說明nvm已經(jīng)安裝成功了。

安裝Node.js

現(xiàn)在就可以使用nvm來安裝和管理node了。

查看可用的node版本:

#nvmls-remote

安裝node:

#nvminstall18.0.0

查看已經(jīng)安裝的node版本:

[root@ecs-221238~]#nvmlist

-v18.0.0

default-18.0.0(-v18.0.0)

iojs-N/A(default)

unstable-N/A(default)

node-stable(-v18.0.0)(default)

stable-18.0(-v18.0.0)(default)

選擇一個(gè)版本進(jìn)行使用:

#nvmuse18.0.0

需要注意的一點(diǎn),在Windows上使用nvm時(shí),需要使用管理員權(quán)限執(zhí)行nvm命令。在CentOS上,我默認(rèn)使用root用戶登錄的,因而沒有出現(xiàn)問題。大家在使用時(shí)遇到了未知錯(cuò)誤,可以搜索一下解決方案,或者嘗試下是否是權(quán)限導(dǎo)致的問題。

在安裝node的時(shí)候,會(huì)自動(dòng)安裝npm。查看node和npm的版本號(hào):

[root@ecs-221238~]#node-v

v18.0.0

[root@ecs-221238~]#npm-v

8.6.0

默認(rèn)的npm鏡像源是官方地址:

[root@ecs-221238~]#npmconfiggetregistry

/

切換為國內(nèi)淘寶的鏡像源:

[root@ecs-221238~]#npmconfigsetregistry

到此為止,服務(wù)器就已經(jīng)安裝好node環(huán)境和配置好npm了。

項(xiàng)目上傳到服務(wù)器

方法有很多,或者從Github/GitLab/Gitee倉庫中下載到服務(wù)器中,或者本地通過ftp工具上傳。步驟很簡(jiǎn)單,不再演示。

演示項(xiàng)目放到了/www目錄下:

服務(wù)器開放端口

一般云服務(wù)器僅開放了22端口用于遠(yuǎn)程登錄。而常用的80,443等端口并未開放。另外,我們準(zhǔn)備好的express項(xiàng)目運(yùn)行在3000端口上。所以需要先到云服務(wù)器的控制臺(tái)中,找到安全組,添加幾條規(guī)則,開放80和3000端口。

使用PM2管理應(yīng)用

在開發(fā)階段,我們可以使用nodemon來做實(shí)時(shí)監(jiān)聽和自動(dòng)重啟,提高開發(fā)效率。在生產(chǎn)環(huán)境,就需要祭出大殺器PM2了。

首先全局安裝pm2:

#npmi-gpm2

執(zhí)行pm2-v命令查看是否安裝成功:

[root@ecs-221238~]#pm2

-v5.2.0

切換到項(xiàng)目目錄,先把依賴裝上:

cd/www/express-demo

npminstall

然后使用pm2命令來啟動(dòng)應(yīng)用。

pm2startapp.js-imax

//或者

pm2startserver.js-i2

PM2管理應(yīng)用有fork和cluster兩種模式。在啟動(dòng)應(yīng)用時(shí),通過使用-i參數(shù)來指定實(shí)例的個(gè)數(shù),會(huì)自動(dòng)開啟cluster模式。此時(shí)就具備了負(fù)載均衡的能力。

-i:instance,實(shí)例的個(gè)數(shù)??梢詫懢唧w的數(shù)字,也可以配置成max,PM2會(huì)自動(dòng)檢查可用的CPU的數(shù)量,然后盡可能多地啟動(dòng)進(jìn)程。

此時(shí)應(yīng)用就啟動(dòng)好了。PM2會(huì)以守護(hù)進(jìn)程的形式管理應(yīng)用,這個(gè)表格展示了應(yīng)用運(yùn)行的一些信息,比如運(yùn)行狀態(tài),CPU使用率,內(nèi)存使用率等。

在本地的瀏覽器中訪問接口:

Cluster模式是一個(gè)多進(jìn)程多實(shí)例的模型,請(qǐng)求進(jìn)來后會(huì)分配給其中一個(gè)進(jìn)程處理。正如前面我們看過的cluster模塊的用法一樣,由于pm2的守護(hù),即使某個(gè)進(jìn)程掛掉了,也會(huì)立刻重啟該進(jìn)程。

回到服務(wù)器終端,執(zhí)行pm2logs命令,查看下pm2的日志:

可見,id為1的應(yīng)用實(shí)例掛掉了,pm2會(huì)立刻重啟該實(shí)例。注意,這里的id是應(yīng)用實(shí)例的id,并非進(jìn)程id。

到這里,一個(gè)express項(xiàng)目的簡(jiǎn)單部署就完成了。通過使用pm2工具,基本能保證我們的項(xiàng)目可以穩(wěn)定可靠的運(yùn)行。

PM2常用命令小結(jié)

這里整理了一些pm2工具常用的命令,可供查詢參考。

#Fork模式

pm2startapp.js--nameapp#設(shè)定應(yīng)用的名字為app

#Cluster模式

#使用負(fù)載均衡啟動(dòng)4個(gè)進(jìn)程

pm2startapp.js-i4

#將使用負(fù)載均衡啟動(dòng)4個(gè)進(jìn)程,具體取決于可用的CPU

pm2startapp.js-i0

#等同于上面命令的作用

pm2startapp.js-imax

#給app擴(kuò)展額外的3個(gè)進(jìn)程

pm2scaleapp+3

#將app擴(kuò)展或者收縮到2個(gè)進(jìn)程

pm2scaleapp2

#查看應(yīng)用狀態(tài)

#展示所有進(jìn)程的狀態(tài)

pm2list

#用原始JSON格式打印所有進(jìn)程列表

pm2jlist

#用美化的JSON打印所有進(jìn)程列表

pm2prettylist

#展示特定進(jìn)程的所有信息

pm2describe0

#使用儀表盤監(jiān)控所有進(jìn)程

pm2monit

#日志管理

#實(shí)時(shí)展示所有應(yīng)用的日志

pm2logs

#實(shí)時(shí)展示app應(yīng)用的日志

pm2logsapp

#使用json格式實(shí)時(shí)展示日志,不輸出舊日志,只輸出新產(chǎn)生的日志

pm2logs--json

#應(yīng)用管理

#停止所有進(jìn)程

pm2stopall

#重啟所有進(jìn)程

pm2restartall

#停止指定id的進(jìn)程

pm2stop0

#重啟指定id的進(jìn)程

pm2restart0

#刪除id為0進(jìn)程

pm2delete0

#刪除所有的進(jìn)程

pm2deleteall

每一條命令都可以親自嘗試一下,看看效果。

這里特別展示下monit命令,它可以在終端中啟動(dòng)一個(gè)面板,實(shí)時(shí)展示應(yīng)用的運(yùn)行狀態(tài),通過上下箭頭可以切換pm2管理的所有應(yīng)用:

進(jìn)階:使用pm2配置文件

PM2的功能十分強(qiáng)大,遠(yuǎn)不止上面的這幾個(gè)命令。在真實(shí)的項(xiàng)目部署中,可能還需要配置日志文件,watch模式,環(huán)境變量等等。如果每次都手敲命令是十分繁瑣的,所以pm2提供了配置文件來管理和部署應(yīng)用。

可以通過以下命令來生成一份配置文件:

[root@ecs-221238express-demo]#pm2initsimple

File/www/express-demo/ecosystem.config.jsgenerated

會(huì)生成一個(gè)ecosystem.config.js文件:

module.exports={

apps:[{

name:app1,

script:./app.js

}

也可以自己創(chuàng)建一個(gè)配置文件,比如app.config.js:

constpath=require(path)

module.exports={

//一份配置文件可以同時(shí)管理多個(gè)node.js應(yīng)用

//apps是一個(gè)數(shù)組,每一項(xiàng)都是一個(gè)應(yīng)用的配置

apps:[{

//應(yīng)用名稱

name:express-demo,

//應(yīng)用入口文件

script:./server.js,

//啟動(dòng)應(yīng)用的模式,有兩種:cluster和fork,默認(rèn)是fork

exec_mode:cluster,

//創(chuàng)建應(yīng)用實(shí)例的數(shù)量

instances:max,

//開啟監(jiān)聽,當(dāng)文件變化后自動(dòng)重啟應(yīng)用

watch:true,

//忽略掉一些目錄文件的變化。

//由于把日志目錄放到了項(xiàng)目路徑下,一定要將其忽略,否則應(yīng)用啟動(dòng)產(chǎn)生日志,pm2監(jiān)聽到變化就會(huì)重啟,重啟又產(chǎn)生日志,就會(huì)進(jìn)入死循環(huán)

ignore_watch:[

node_modules,

logs

//錯(cuò)誤日志存放路徑

err_file:path.resolve(__dirname,logs/error.log),

//打印日志存放路徑

out_file:path.resolve(__dirname,logs/out.log),

//設(shè)置日志文件中每條日志前面的日期格式

log_date_for

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論