使用PM2部署pomelo服務(wù)器

pomelo服務(wù)器部署問(wèn)題

pemelo可以使用 'pomelo start -e production' 命令在服務(wù)器運(yùn)行生產(chǎn)環(huán)境的服務(wù)器代碼盼铁。pomelo自身缺少進(jìn)程監(jiān)控储藐,運(yùn)行過(guò)程中不方便獲取到進(jìn)程的運(yùn)行信息有送。而且pomelo沒(méi)有進(jìn)程保護(hù)控汉,當(dāng)進(jìn)程崩潰之后,不能自動(dòng)重啟進(jìn)程。pomelo提供的單服務(wù)器重啟動(dòng)功能不能使用授翻,至少目前的2.2.5版本中不能使用單個(gè)服務(wù)器重啟功能。當(dāng)完成某個(gè)服務(wù)器的代碼的修改之后孙咪,只能把全部服務(wù)器關(guān)掉堪唐,之后再全部啟動(dòng)一次。只修改后端服務(wù)器的代碼该贾,要讓代碼生效只能全部重啟一次羔杨,會(huì)導(dǎo)致全部玩家斷線重新連接。如果只是單獨(dú)重啟一個(gè)后端服務(wù)器杨蛋,則不會(huì)出現(xiàn)全部客戶(hù)端斷線重連的問(wèn)題兜材。

pm2配置文件

使用PM2部署項(xiàng)目,需要一份部署配置文件逞力,用于描述pomelo服務(wù)器的進(jìn)程信息曙寡。pomelo的進(jìn)程主要包括master進(jìn)程和各個(gè)功能服務(wù)器。

master進(jìn)程的配置,配置文件需要指定 log文件的目錄寇荧,項(xiàng)目代碼的目錄举庶。還有重要的一點(diǎn)是要指定進(jìn)程的模式mode=stand-alone,如果不指定master進(jìn)程的模式,導(dǎo)致pomelo多次啟動(dòng)服務(wù)器進(jìn)程揩抡,然后會(huì)看到系統(tǒng)里有不少重復(fù)進(jìn)程户侥。

{
  "name": "master",
  "script": "app.js",
  "args": [
    "serverType=master",
    "id=master-server-1",
    "host=47.100.96.55",
    "port=4060",
    "env=production",
    "mode=stand-alone"
  ],
  "watch": false,
  "out_file": "./logs/master-server-1_app.log",
  "error_file": "./logsmaster-server-1_error.log",
  "cwd": "/root/pomelo/PirateClashPomeloServer/game-server",
  "merge_logs": true,
  "exec_mode": "fork_mode"
}

其他功能服務(wù)器,需要配置各自的端口號(hào)碼和host地址峦嗤。具體的配置信息根據(jù)server.json的配置來(lái)蕊唐。


{
  "name": "gamehttp",
  "script": "app.js",
  "args": [
    "env=production",
    "id=gamehttp",
    "port=4050",
    "host=127.0.0.1",
    "serverType=gamehttp"
  ],
  "watch": false,
  "out_file": "./logs/gamehttp_app.log",
  "error_file": "./logs/gamehttp_error.log",
  "cwd": "/root/pomelo/PirateClashPomeloServer/game-server",
  "merge_logs": true,
  "exec_mode": "fork_mode"
}
 

使用腳本生成PM2配置文件

當(dāng)需要修改項(xiàng)目中master.json或者server.json文件時(shí),需要同步去修改 pm2的配置問(wèn)題烁设,會(huì)相當(dāng)麻煩替梨。于是寫(xiě)了一個(gè)node.js腳本,讀取master.json 和 server.json的文件內(nèi)容生成對(duì)應(yīng)的PM2配置文件generatePm2Config.js装黑。 根據(jù)實(shí)際情況修改變量cwd,envType, 生成的配置文件放到腳本的父目錄副瀑。


/**
 * Created by superzhan on 2018/3/19.
 *
 * 根據(jù)pomelo 的 servers.json 生成 pm2 啟動(dòng)文件
 */

var masterJsonFile = require('../game-server/config/master.json');
var serversJosnFile = require('../game-server/config/servers.json');

//pomelo 源碼目錄
var cwd='/root/pomelo/PirateClashPomeloServer/game-server';

//配置運(yùn)行環(huán)境 development production
var envType= 'production';

//模板數(shù)據(jù)
var processConfigType =   {
    "name"        : "",
    "script"      : "app.js",
    "args"        :  [] ,
    "watch": false,
    "out_file": "./logs/app.log",
    "error_file": "./logs/err.log",
    "cwd": "",
    "merge_logs": true,
    "exec_mode": "fork_mode",
};


//最后的結(jié)果數(shù)據(jù)
var resultJson={};
resultJson.apps=new Array();


var  clone = function(origin) {
    if(!origin) {
        return;
    }
    var obj = {};
    for(var f in origin) {
        obj[f] = origin[f];
    }
    return obj;
};

//
var masterConfig = masterJsonFile[envType];
var serversConfig = serversJosnFile[envType];

//生成master 的配置
var pm2Master = clone( processConfigType );
pm2Master.name="master";
pm2Master.args = new Array();
pm2Master.args.push('serverType=master');
pm2Master.args.push('id='+masterConfig.id);
pm2Master.args.push('host='+masterConfig.host);
pm2Master.args.push('port='+masterConfig.port);
pm2Master.args.push('env='+envType);
pm2Master.args.push('mode=stand-alone');
pm2Master.cwd= cwd;
pm2Master.out_file = './logs/'+masterConfig.id+"_app.log";
pm2Master.error_file='./logs'+masterConfig.id+'_error.log';
resultJson.apps.push(pm2Master);

//生成當(dāng)個(gè)服務(wù)器的配置
for(serverType in serversConfig)
{
    var servers = serversConfig[serverType];
    for(var i=0;i<servers.length;++i)
    {
        var singleServer= servers[i];

        var appPm2Config =  clone(processConfigType);
        appPm2Config.name=singleServer.id;
        appPm2Config.args= new Array();
        appPm2Config.args.push('env='+envType);
        appPm2Config.args.push('id='+singleServer.id);
        appPm2Config.args.push('port='+singleServer.port);
        appPm2Config.args.push('host='+singleServer.host);
        appPm2Config.args.push('serverType='+serverType);

        if(singleServer.frontend !=null)
        {
            appPm2Config.args.push('frontend='+ singleServer.frontend);
            appPm2Config.args.push('clientPort='+singleServer.clientPort);
        }

        appPm2Config.cwd= cwd;
        appPm2Config.out_file = './logs/'+ singleServer.id+'_app.log';
        appPm2Config.error_file = './logs/'+singleServer.id+'_error.log';

        resultJson.apps.push(appPm2Config);
    }
}



//生成結(jié)果數(shù)據(jù)
var resultFileStr = JSON.stringify(resultJson);
//console.log(resultFileStr);


var fs = require('fs');

fs.writeFile('../pomeloPm2Start.json', resultFileStr, function (err) {
    if (err) {
        console.log(err);
    } else {
        console.log('finish genereate Server pm2 config');
    }
});

PM2管理

啟動(dòng)服務(wù)器使用命令 pm2 start pomeloPm2Start.json ,pomeloPm2Start.json是上面生成的配置文件。

監(jiān)控命令 pm2 monit 查看各個(gè)進(jìn)程的運(yùn)行狀態(tài)恋谭, pm2 log 輸出工程的log, pm2 list 列出所有的服務(wù)器進(jìn)程

單個(gè)服務(wù)器的重啟 pm2 restart processId, processId 對(duì)應(yīng)服務(wù)器進(jìn)程的Id.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糠睡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疚颊,更是在濱河造成了極大的恐慌铜幽,老刑警劉巖滞谢,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件串稀,死亡現(xiàn)場(chǎng)離奇詭異除抛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)母截,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)到忽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人清寇,你說(shuō)我怎么就攤上這事喘漏。” “怎么了华烟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵翩迈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盔夜,道長(zhǎng)负饲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任喂链,我火速辦了婚禮返十,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椭微。我一直安慰自己洞坑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布蝇率。 她就那樣靜靜地躺著迟杂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪本慕。 梳的紋絲不亂的頭發(fā)上排拷,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音间狂,去河邊找鬼攻泼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鉴象,可吹牛的內(nèi)容都是我干的忙菠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纺弊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牛欢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起淆游,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤傍睹,失蹤者是張志新(化名)和其女友劉穎隔盛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拾稳,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吮炕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了访得。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龙亲。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悍抑,靈堂內(nèi)的尸體忽然破棺而出鳄炉,到底是詐尸還是另有隱情,我是刑警寧澤搜骡,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布拂盯,位于F島的核電站,受9級(jí)特大地震影響记靡,放射性物質(zhì)發(fā)生泄漏谈竿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一簸呈、第九天 我趴在偏房一處隱蔽的房頂上張望榕订。 院中可真熱鬧,春花似錦蜕便、人聲如沸劫恒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)两嘴。三九已至,卻和暖如春憔辫,著一層夾襖步出監(jiān)牢的瞬間仿荆,已是汗流浹背锦亦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工舔庶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞧甩,地道東北人亲配。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洒疚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容