Docker(centos7.2)環(huán)境部署eggjs應(yīng)用填坑記錄

最近在使用eggjs開發(fā)web應(yīng)用,在docker(centos7.2)環(huán)境下部署時遇到些問題,在此記錄下:

問題1:Save log file to /xxx/logs

egg通過egg-script啟動應(yīng)用,egg-script的啟動日志保存到了用戶目錄,如終端輸入如下:

Save log file to /root/logs

而運(yùn)維沒有開通線上環(huán)境的root目錄訪問權(quán)限,egg官方關(guān)于日志部分的介紹沒有提到如何自定義egg-script啟動日志的保存路徑。百度了下,發(fā)現(xiàn)了這篇文章:

《【eggjs】部署egg時碰到的日志權(quán)限問題 》

作者也遇到了同樣的問題,并給了解決方案。相關(guān)代碼如下:

//egg-scripts/lib/cmd/start.js

// whether run in the background.
if (isDaemon) {
      this.logger.info(`Save log file to ${logDir}`);
      const [ stdout, stderr ] = yield [ getRotatelog(argv.stdout), getRotatelog(argv.stderr) ];
      options.stdio = [ 'ignore', stdout, stderr, 'ipc' ];
      options.detached = true;

再看下logDir的定義:

const HOME = homedir();
const logDir = path.join(HOME, 'logs');

homedir來自node-homedir模塊:

const os = require('os');
 
module.exports = () => {
  if (process.env.MOCK_HOME_DIR) return process.env.MOCK_HOME_DIR;
  if (os.userInfo && os.userInfo().homedir) {
    return os.userInfo().homedir;
  } else if (os.homedir) {
    return os.homedir();
  }
  return process.env.HOME;
};

從上面代碼的意思可以知道:如果定義了環(huán)境變量MOCK_HOME_DIR,會使用環(huán)境變量,否則返回用戶根路徑,centos的用戶根路徑為/root/。那我們在啟動應(yīng)用前定義下MOCK_HOME_DIR環(huán)境變量應(yīng)該可以解決問題:

export MOCK_HOME_DIR = 日志路徑

然而并沒有作用,是因為不同進(jìn)程的問題?

不停的查找資料,最后在這個

eggjs#issue3912

中找到了答案:自定義MOCK_HOME_DIR的方法,在start命令中添加:

"start": "MOCK_HOME_DIR=/export/Logs/start egg-scripts start --daemon --title=egg-server-server"

問題2:leader does not be active in xxxms on port xxx

這個問題困擾了我很久,日志如下:

[ClusterClient] nodejs.Error:leader does not be active in 60000ms on port:38205
[egg-scripts]     at Function.waitFor (/export/App/server/node_modules/cluster-client/lib/server.js:238:15)
[egg-scripts]     at processTicksAndRejections (internal/process/task_queues.js:97:5)
[egg-scripts]     at async ClusterClient.[ClusterClient#createClient] (/export/App/server/node_modules/cluster-client/lib/wrapper/cluster.js:42:7)
[egg-scripts]     at async ClusterClient.[ClusterClient#init] (/export/App/server/node_modules/cluster-client/lib/wrapper/base.js:71:25)
 pid: 530
 
[egg-scripts] nodejs.Error: [ClusterClient] leader does not be active in 60000ms on port:38205
[egg-scripts]     at Function.waitFor (/export/App/server/node_modules/cluster-client/lib/server.js:238:15)
[egg-scripts]     at processTicksAndRejections (internal/process/task_queues.js:97:5)
[egg-scripts]     at async ClusterClient.[ClusterClient#createClient] (/export/App/server/node_modules/cluster-client/lib/wrapper/cluster.js:42:7)
[egg-scripts]     at async ClusterClient.[ClusterClient#init] (/export/App/server/node_modules/cluster-client/lib/wrapper/base.js:71:25)
[egg-scripts] 
[egg-scripts] pid: 565
...

日志沒有直接指出具體原因,但是從日志中可以看到一些信息,這個錯誤是來自于cluster-client(nodejs多進(jìn)程解決方案,可以充分利用多核CPU)模塊,同時通過pid可以發(fā)現(xiàn),egg-scripts創(chuàng)建個很多進(jìn)程。那是不是進(jìn)程數(shù)量的問題?查閱了下資料,egg-scripts可以設(shè)置進(jìn)程數(shù)量,start命令中添加--workers即可:

"start": "MOCK_HOME_DIR=/export/Logs/start egg-scripts start --daemon --title=egg-server-server --workers 4"

問題很快得到解決,再看下--workers參數(shù)的定義:

- `workers` - numbers of app workers, default to `process.env.EGG_WORKERS`, if unset, egg will use `os.cpus().length`  as default.

默認(rèn)數(shù)量是cpu的內(nèi)核數(shù)量,打印了下線上機(jī)器是96核,docker限制了最大進(jìn)程數(shù)量了嗎...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容