前两天将一个egg部署到服务器时,用npm start就是启动不了,错误信息为无权限创建log目录。查看工作目录权限,当前用户是有权限的,看了源码,原来是用的npm包的问题。这里简单记录下解决过程。

首先,在生产环境下的启动是通过egg-script 启动的。在启动时,终端会有如下输出:

Save log file to /XXX/XXX

我们查看egg-script的源码,在他的start命令中,找到Save log file,如下

clipboard.png
下一步,找到这个logDir变量声明的地方,往前看就能找到,如下代码:

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

那么这个homeDir()是什么呢?它是npm包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;
};

这就很清楚了,我的服务器是centos,登录账户的userInfo最终返回的homedir就是系统根目录,'/',而不是我的项目工作目录,由于运维设置,我没有权限在系统/logs下写权限,所以出现了一开始提到的错误。

找到原因后就很好办了,按上面的源码,在启动脚本里,先创建个MOCK_HOME_DIR的环境变量,并指定到项目目录即可。


座大山
83 声望15 粉丝