GitLab npm包仓库执行npm install时请求URL变为内网地址问题咨询
GitLab npm源请求自动跳转内网IP问题排查
问题现象
使用GitLab 14.7.3版本,按如下命令配置Package Registry npm源:
npm config set "@scope:registry" http://hightop.com:9000/api/v4/projects/1234/packages/npm/ npm config set -- '//hightop.com:9000/api/v4/projects/1234/packages/npm/:_authToken' "glpat-token"
执行npm install时出现两类报错:
- 标签名非法错误:
npm ERR! code EINVALIDTAGNAME npm ERR! Invalid tag name "@zhaolingli:vuepress-theme-dark": Tags may not have any characters that encodeURIComponent encodes.
- 包404错误,实际请求地址从配置的
http://hightop.com:9000变成了GitLab内网地址http://192.168.5.242:
npm ERR! code E404 npm ERR! 404 Not Found - GET http://192.168.5.242/api/v4/projects/1234/packages/npm/@zhaolingli/vuepress-theme-dark/-/@zhaolingli/vuepress-theme-dark-1.0.1.tgz npm ERR! 404 '@zhaolingli/vuepress-theme-dark@1.0.1' is not in the npm registry.
根因分析
问题由两个配置错误共同导致:
- npm scope配置不匹配:配置源时指定的scope是
@scope,但实际要安装的包前缀是@zhaolingli,npm无法将该包的请求路由到你配置的GitLab源,才会先抛出标签名非法错误。 - GitLab实例对外地址配置错误:GitLab生成npm包元数据时,tarball下载地址会直接读取实例配置的
external_url值。你的GitLab后台external_url配置的是内网地址http://192.168.5.242,因此即使你npm源配了对外域名http://hightop.com:9000,npm拿到元数据后还是会顺着元数据里的内网地址去请求包文件,最终触发404。
修复步骤
- 修正npm scope配置,将源绑定到实际包使用的
@zhaolingli作用域:
# 先删掉之前配错的scope源 npm config delete "@scope:registry" npm config delete "//hightop.com:9000/api/v4/projects/1234/packages/npm/:_authToken" # 重新配置正确的scope源 npm config set "@zhaolingli:registry" http://hightop.com:9000/api/v4/projects/1234/packages/npm/ npm config set -- '//hightop.com:9000/api/v4/projects/1234/packages/npm/:_authToken' "glpat-token"
- 修正GitLab实例的对外地址配置:登录GitLab服务器,编辑
/etc/gitlab/gitlab.rb文件,找到external_url配置项,将值修改为对外暴露的访问地址http://hightop.com:9000,保存后执行如下命令重载配置:
sudo gitlab-ctl reconfigure
配置重载完成后,GitLab返回的npm包元数据里的tarball地址会自动替换为对外域名,不会再出现跳转内网IP的问题。
内容的提问来源于stack exchange,提问作者PasseRR
相关产品推荐
相关产品推荐

