前两天将一个egg部署到服务器时,用npm start就是启动不了,错误信息为无权限创建log目录。查看工作目录权限,当前用户是有权限的,看了源码,原来是用的npm包的问题。这里简单记录下解决过程。
首先,在生产环境下的启动是通过egg-script 启动的。在启动时,终端会有如下输出:
Save log file to /XXX/XXX
我们查看egg-script的源码,在他的start命令中,找到Save log file,如下
下一步,找到这个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的环境变量,并指定到项目目录即可。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。