AWS Ubuntu运行npm run prod提示mix权限被拒绝问题求助
问题背景
- 运行环境:Laravel 8 + Laravel Mix,Node 14.15.0、npm 8.13.2,部署在AWS Ubuntu服务器,本地同配置环境运行无异常
- 触发场景:未对项目代码做任何修改的前提下,突然出现执行
npm run prod构建失败 - 已尝试操作:将/tmp目录权限设置为777、修改/tmp目录所有者为当前登录用户,均未解决问题
- 报错信息:
> prod > npm run production > production > mix --production /tmp/production65665869399.sh: 2: mix: Permission denied
排查思路
报错核心是npm运行脚本时生成的临时shell文件无执行权限,按优先级从高到低排查:
- 不要默认把问题归因为/tmp目录本身的读写权限,先确认npm实际使用的临时目录路径,部分环境会自定义npm临时存储路径,和系统默认/tmp不一致
- 检查临时目录所在磁盘分区的挂载参数:如果分区带
noexec挂载标识,哪怕目录权限设为777,目录内的可执行文件也无法运行,这类问题通常是系统安全策略更新、自动调整挂载规则后突发,和项目代码无关 - 检查项目依赖内的mix二进制文件是否丢失可执行权限,部分场景下依赖文件权限会被系统安全规则、文件同步操作意外修改
可落地解决方法
按排查顺序逐一验证:
- 修复临时目录挂载限制
执行以下命令查看临时目录挂载参数:
如果输出结果包含# 查看npm实际使用的临时目录 npm config get tmp # 查看对应目录的挂载参数 mount | grep 替换为上一步输出的临时目录路径noexec参数,先执行临时修复验证:
验证构建正常后,编辑# 替换路径为实际的npm临时目录路径,默认是/tmp就填/tmp sudo mount -o remount,exec /tmp/etc/fstab文件,删除对应临时目录挂载行里的noexec配置,保存后重新挂载即可永久生效。 - 自定义npm临时目录绕开挂载限制
如果没有权限修改系统挂载配置,可以在项目目录内新建专属临时目录,指定npm使用该目录(项目目录所在分区默认不会带noexec限制):# 在项目根目录执行 mkdir -p .npm-tmp npm config set tmp ./.npm-tmp # 重新执行构建 npm run prod - 修复依赖文件权限
如果以上操作都无效,先检查mix二进制权限:
如果权限位没有ls -l node_modules/.bin/mixx(可执行)标识,直接重新安装依赖恢复权限即可:
不想重装依赖也可以直接给对应文件加可执行权限:rm -rf node_modules npm installchmod +x node_modules/.bin/mix
内容的提问来源于stack exchange,提问作者Mo Baqeri
相关产品推荐
相关产品推荐

