最近在使用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)程的問題?
不停的查找資料,最后在這個
中找到了答案:自定義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ù)量了嗎...