升级到npm@8.1.0后root执行npm start自动切换为ubuntu用户问题求助
问题原因
该问题是npm 8.x版本自带的安全机制导致的:从npm v5.10.0版本开始,官方新增了自动降权的安全规则,当使用root账户执行npm run/start等脚本命令时,npm会自动将脚本的执行用户切换为当前项目目录的所有者。
从你提供的环境信息来看,/site/exmonitor项目目录的所有者为ubuntu用户,因此npm执行node ./bin/www时实际是用ubuntu身份运行的。而Linux系统默认只允许root账户绑定1024以下的特权端口,80端口属于特权端口范畴,普通用户没有绑定权限,因此抛出权限不足的报错。
低版本npm没有这套自动降权逻辑,所以你升级npm到8.1.0之后才会出现该问题。
修复方案
你可以根据自己的使用场景选择以下任意一种方案解决:
- 关闭npm自动降权配置
执行命令npm config set unsafe-perm true,如果需要全局生效可以加上-g参数。配置生效后用root执行npm start就不会自动切换到ubuntu用户,可直接绑定80端口。 - 给node程序授予绑定特权端口的权限
执行命令sudo setcap 'cap_net_bind_service=+ep' /usr/local/node-v16.13.0-linux-x64/bin/node,该命令会给node二进制文件开放网络端口绑定的特权,之后即使用普通用户身份运行node服务,也可以正常绑定80等1024以下的端口,安全性比直接用root运行服务更高。 - 用反向代理转发请求(生产环境推荐)
修改你的node服务监听3000这类非特权端口,额外部署nginx服务监听80端口,将收到的请求转发到后端的node服务。该方案完全不需要修改npm或node的权限配置,同时nginx可以处理静态资源、负载均衡等额外需求,是生产环境的标准实践。 - (不推荐)修改项目目录所有者为root
执行chown -R root:root /site/exmonitor将项目目录所有者改为root,npm执行脚本时就会保持root身份运行,但该方案会带来额外的安全风险,不建议使用。
内容的提问来源于stack exchange,提问作者Tree Hugger
相关产品推荐
相关产品推荐

