Nexus 3.24.0-02 私有仓库部署实战:Maven与NPM代理配置及避坑指南
简介nexus-3.24.0-02-unix.tar.gz 是 Sonatype 官方发布的 Nexus Repository Manager 3.24.0-02 版本 Unix/Linux 安装包面向 Java 与前端开发团队用于集中管理 Maven、NPM 等软件制品解决依赖分散、私服托管与内网加速下载等问题。压缩包约 149.69MB解压后主要包含 nexus-3.24.0-02 与 sonatype-work 两个目录前者存放服务运行所需的可执行文件、配置与库后者作为运行时工作目录保存制品、索引、日志及数据库内容部署时需保持独立以保障数据持久化与升级安全。该版本可作为 Maven 仓库代理也能充当 NPM 代理仓库通过配置 .npmrc 将 Nexus 设为默认注册表实现包的私有托管与统一分发。目前已有 212 人学习下载适合需要搭建企业级制品仓库、优化依赖管理流程的中高级开发者参考使用。1. 从一台内网构建机说起nexus-3.24.0-02-unix.tar.gz 到底能解决什么上周帮一个朋友排查 CI 流水线现象很典型同一份pom.xml开发本地mvn clean package秒过一到构建机上就卡在Downloading from central十几分钟不动最后超时失败。打开日志一看几十个依赖全在往公网仓库跑公司出口带宽被几个项目同时薅谁也别想快。这种场景下私有仓库不是「锦上添花」而是刚需。nexus-3.24.0-02-unix.tar.gz就是 Sonatype 官方发布的 Nexus Repository Manager 3.24.0-02 版本的 Unix 平台压缩包解压即用不需要编译核心价值是把 Maven、NPM、Docker、PyPI 等制品的缓存与托管收拢到内网一台机器上。它适合谁中小团队里负责搭基础设施的那一两个人或者像我这样经常要给别人「从零搭一套能跑的环境」的工程师。这篇不聊虚的就按我实际部署的顺序把解压、启动、配 Maven 代理、配 NPM 私服、以及几个我踩过的坑一条条拆开。2. 解压与启动把 tar.gz 跑成能访问的服务2.1 目录结构与两个关键路径拿到nexus-3.24.0-02-unix.tar.gz之后先别急着tar -zxvf完就启动。这个包解压出来是两层结构外层是nexus-3.24.0-02/里面才是真正的运行目录同时会生成一个sonatype-work/目录。这两个目录的关系必须先理清否则后面改配置、迁数据全是坑。nexus-3.24.0-02/是程序本体包含bin/、etc/、lib/、public/等。其中etc/nexus-default.properties控制端口和上下文路径bin/nexus是启动脚本。sonatype-work/是数据目录默认跟程序目录平级里面nexus3/下存着 blob 存储、配置、日志、索引。生产环境我一般会把这两个目录分开挂盘程序目录只读数据目录单独一块盘升级时直接换程序目录数据不动。# 解压到指定目录假设放在 /opt 下 tar -zxvf nexus-3.24.0-02-unix.tar.gz -C /opt # 进入程序目录 cd /opt/nexus-3.24.0-02 # 看一眼默认端口配置 cat etc/nexus-default.properties这段命令做完你会看到application-port8081和nexus-context-path/两行。端口 8081 是 Nexus 3 的默认 HTTP 端口如果这台机器上已经有服务占了 8081改这里就行不用去动别的文件。上下文路径一般保持/除非你要在同一台机器上用 Nginx 反代多个服务那可以改成/nexus。2.2 启动脚本与运行用户Nexus 3 不允许用 root 直接跑这是硬性限制。启动脚本里会检查当前用户root 执行会直接报错退出。所以标准做法是建一个专用用户把程序目录和数据目录的属主都给它。# 创建专用用户不分配登录 shell useradd -r -s /bin/false nexus # 把两个目录的属主改掉 chown -R nexus:nexus /opt/nexus-3.24.0-02 chown -R nexus:nexus /opt/sonatype-work # 切到 nexus 用户启动 su -s /bin/bash nexus -c /opt/nexus-3.24.0-02/bin/nexus start这里有个细节su -s /bin/bash是因为nexus用户没有登录 shell直接su nexus会失败。启动之后别急着访问Nexus 3 首次启动要初始化 OrientDB 和默认仓库大概需要 30 秒到 1 分钟。用tail -f /opt/sonatype-work/nexus3/log/nexus.log盯着看到Started Sonatype Nexus再访问http://ip:8081。提示如果启动脚本报Cannot allocate memory或者进程起来又挂先看sonatype-work/nexus3/log/nexus.log八成是 JVM 堆内存不够。3.24 默认堆上限是 2703MB小内存机器要在bin/nexus.vmoptions里调-Xmx。2.3 初始密码与管理员配置Nexus 3.24 的 admin 初始密码不再放在conf/下而是生成在数据目录里。首次访问 Web 界面会弹出一个向导提示你去sonatype-work/nexus3/admin.password文件里找密码。# 查看初始密码 cat /opt/sonatype-work/nexus3/admin.password拿到密码后登录向导会强制你改密码同时问是否开启匿名访问。这里我的建议是内部团队用匿名访问可以关掉所有拉取都走认证方便后面做权限细分如果只是当缓存代理、不涉及私有制品开着也无妨省得每个开发都要配账号。改完密码后那个admin.password文件会自动删除别想着回头再找。3. 配 Maven 代理仓库让构建机不再等公网3.1 创建 proxy 仓库的字段含义登录后进Settings - Repositories - Create repository选maven2 (proxy)。这个类型是专门用来代理远程仓库的它自己不存原始制品只做缓存。几个关键字段必须填对字段建议值说明Namemaven-central仓库标识后面 settings.xml 里要用Remote storagehttps://repo1.maven.org/maven2/远程仓库地址末尾斜杠别丢Blob storedefault默认存储多仓库可分开Version policyRelease代理中央仓库选 ReleaseLayout policyStrictMaven 2 格式保持默认Remote storage这一栏最容易翻车。有人图省事填了https://repo1.maven.org/maven2少个斜杠Nexus 拼接路径时会变成maven2org/apache/...直接 404。另外Version policy如果选成Mixed代理中央仓库时会把 snapshot 请求也放过去虽然中央仓库没有 snapshot但会多一次无效请求日志里全是 404 噪音。3.2 settings.xml 的 mirror 配置仓库建好后开发机和构建机上的~/.m2/settings.xml要加 mirror。注意是 mirror 不是 repositorymirror 会拦截所有对中央仓库的请求转到 Nexus。settings mirrors mirror !-- 唯一标识随便起但别重复 -- idnexus-maven-central/id !-- 拦截所有仓库请求* 表示通配 -- mirrorOf*/mirrorOf !-- Nexus 上 proxy 仓库的访问地址 -- urlhttp://192.168.1.100:8081/repository/maven-central//url /mirror /mirrors /settingsmirrorOf写*是最省事的做法所有仓库请求都走 Nexus。但如果你项目里还配了别的私服或者特殊仓库*会把它们也拦掉这时候要改成external:*或者显式排除。url末尾的斜杠同样不能少Maven 拼接 artifact 路径时依赖这个斜杠。3.3 验证缓存是否生效配完之后在开发机上删掉本地仓库里的某个依赖重新构建观察 Nexus 的Browse界面。第一次请求会看到 Nexus 去远程拉拉完存在maven-central仓库下第二次再删本地重新构建Nexus 直接返回缓存不再走公网。# 删掉本地某个依赖强制走 Nexus rm -rf ~/.m2/repository/com/google/guava # 重新构建观察日志里 Downloading from 的地址 mvn clean package -X 21 | grep Downloading from如果日志里显示Downloading from nexus-maven-central: http://192.168.1.100:8081/...说明 mirror 生效了。如果还是central: https://repo1.maven.org/...检查 settings.xml 的位置对不对——Maven 读的是~/.m2/settings.xml或者$M2_HOME/conf/settings.xml两个地方都有的话用户目录的优先级更高。4. 配 NPM 私服前端依赖也能收口4.1 三种 NPM 仓库类型怎么选Nexus 3.24 支持三种 NPM 仓库类型npm (proxy)、npm (hosted)、npm (group)。proxy 用来代理registry.npmjs.orghosted 用来存团队自己发的包group 把前两者聚合成一个地址对外。标准做法是建一个 proxy 加一个 hosted再用 group 合并。建 proxy 时Remote storage填https://registry.npmjs.org/其他默认。建 hosted 时Deployment policy选Allow redeploy否则同一个版本号不能重复发布调试时会很烦。group 仓库把 proxy 和 hosted 都加进去顺序上 hosted 放前面这样同名包优先走私有。4.2 .npmrc 指向 group 仓库前端项目根目录或者用户目录下建.npmrc指向 group 仓库的地址。# 项目级 .npmrc registryhttp://192.168.1.100:8081/repository/npm-group/ # 如果 hosted 仓库需要认证加下面这行 //192.168.1.100:8081/repository/npm-group/:_authTokenNpmToken.xxxxregistry地址末尾同样要斜杠。_authToken那行只有在 hosted 仓库开了认证、且你要npm publish时才需要。如果只是npm installproxy 仓库匿名可读的话不配 token 也能拉。# 验证 registry 是否生效 npm config get registry # 装一个包观察是否走 Nexus npm install lodash --loglevelhttp日志里出现http fetch GET 200 http://192.168.1.100:8081/repository/npm-group/lodash就对了。如果还是registry.npmjs.org检查.npmrc的层级——项目级覆盖用户级用户级覆盖全局别在错误的地方改了配置。4.3 发布私有包到 hosted 仓库团队内部组件要发布时在package.json里加publishConfig指向 hosted 仓库。{ name: team/utils, version: 1.0.0, publishConfig: { registry: http://192.168.1.100:8081/repository/npm-hosted/ } }注意name带 scope 时Nexus 的 hosted 仓库要允许对应的 scope。3.24 默认不限制 scope但如果你的 Nexus 开了 realm 权限要在Security - Realms里确认npm Bearer Token Realm是激活状态否则npm publish会报 401。5. 避坑与排查几个让我重装过两次的问题5.1 启动后 8081 端口不通现象bin/nexus start显示启动成功ps也能看到 Java 进程但浏览器访问http://ip:8081连接被拒。原因Nexus 3 默认只监听0.0.0.0但有些系统上nexus-default.properties里的application-host被改成了127.0.0.1或者防火墙没放行 8081。解决先ss -tlnp | grep 8081看监听地址。如果是127.0.0.1:8081改etc/nexus-default.properties里的application-host0.0.0.0重启。如果是防火墙firewall-cmd --add-port8081/tcp --permanent firewall-cmd --reload。5.2 磁盘写满导致 Nexus 假死现象Web 界面能打开但所有仓库操作都超时日志里刷No space left on device。原因sonatype-work/nexus3/blobs/下的 blob 存储把磁盘写满了。Nexus 3 的 blob 存储不像 Nexus 2 那样有独立的清理任务缓存只增不减。解决进Settings - Repository - Blob Stores看每个 store 的大小。清理的话建一个Cleanup Policy设置Format: maven2、Retention: 90 days然后绑到 proxy 仓库上。注意 cleanup policy 是异步执行的配完不会立刻释放空间要等任务跑完。5.3 Maven 拉取报 401 但匿名访问是开的现象开发机mvn构建报401 Unauthorized但 Nexus 上匿名访问明明开着浏览器直接访问仓库地址也能看到文件列表。原因settings.xml里配了server认证信息但id跟 mirror 的id对不上。Maven 用 mirror 的id去匹配 server 的id匹配不上就不带认证信息而某些仓库路径又要求认证。解决检查settings.xml里serverid和mirrorid是否完全一致。我一般统一用nexus-maven-central这个 id两边都写一样。5.4 NPM 安装报UNABLE_TO_VERIFY_LEAF_SIGNATURE现象npm install报证书验证失败但浏览器访问 Nexus 地址正常。原因Nexus 用了自签证书Node 的 CA 列表里没有。解决临时方案是npm config set strict-ssl false但不推荐。正规做法是把 Nexus 的 CA 证书导入系统信任链或者用npm config set cafile /path/to/ca.pem指定证书文件。5.5 升级时数据目录被覆盖现象换新版本 tar.gz 解压后发现之前的仓库配置和缓存全没了。原因新版本解压出来的sonatype-work/目录跟旧的平级启动时读的是新的空目录。解决升级时只替换nexus-3.24.0-02/程序目录sonatype-work/保持不动。启动前确认bin/nexus脚本里的-Dnexus-work参数指向的是旧数据目录。3.24 的启动脚本默认用相对路径找sonatype-work所以只要数据目录跟程序目录平级就不会丢。6. 进阶用脚本批量建仓库与 API 自动化手动在界面上点仓库建三五个还行建十几个就是体力活。Nexus 3 提供了 REST API可以用脚本批量创建。我一般会在部署完 Nexus 之后跑一个初始化脚本把常用的 proxy 仓库一次性建好。#!/bin/bash # Nexus 地址和认证信息 NEXUS_URLhttp://192.168.1.100:8081 NEXUS_USERadmin NEXUS_PASSyour_password # 创建 maven proxy 仓库的函数 create_maven_proxy() { local name$1 local remote$2 curl -s -u $NEXUS_USER:$NEXUS_PASS \ -X POST $NEXUS_URL/service/rest/v1/repositories/maven/proxy \ -H Content-Type: application/json \ -d { \name\: \$name\, \online\: true, \storage\: { \blobStoreName\: \default\, \strictContentTypeValidation\: true }, \proxy\: { \remoteUrl\: \$remote\, \contentMaxAge\: 1440, \metadataMaxAge\: 1440 }, \negativeCache\: { \enabled\: true, \timeToLive\: 1440 }, \httpClient\: { \blocked\: false, \autoBlock\: true }, \maven\: { \versionPolicy\: \RELEASE\, \layoutPolicy\: \STRICT\ } } } # 批量创建 create_maven_proxy maven-central https://repo1.maven.org/maven2/ create_maven_proxy maven-aliyun https://maven.aliyun.com/repository/public/这段脚本里contentMaxAge和metadataMaxAge单位是分钟1440 就是 24 小时。意思是缓存 24 小时后才去远程检查更新调大能减少对远程仓库的请求调小能更快拿到新版本。negativeCache是负缓存某个依赖在远程不存在时Nexus 会记住这个结果避免反复去远程问。autoBlock是自动阻断远程仓库连续失败达到阈值后Nexus 会暂时切断它防止拖垮整个实例。跑完脚本用curl -u admin:pass http://192.168.1.100:8081/service/rest/v1/repositories能列出所有仓库确认创建成功。这个 API 在 3.24 上是稳定的升级到更高版本也兼容。另一个我常用的技巧是定期清理缓存。Nexus 3.24 的 cleanup policy 只能按时间保留不能按大小。如果磁盘紧张可以写个脚本调service/rest/v1/repositories/{repoName}/invalidate-cache清空某个仓库的缓存但注意这个操作会把缓存全删掉下次拉取又要回源。我一般只在磁盘告急时用平时靠 cleanup policy 慢慢清。从那以后我每次部署完 Nexus都强制走一遍「建仓库 → 配 mirror → 删本地依赖验证 → 跑批量脚本」这个流程不跳过任何一步。因为跳过验证那一步后面出问题排查成本更高。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

数字主权认证DSSC:软件测试团队的合规转型与实践

数字主权认证DSSC:软件测试团队的合规转型与实践

最近我所在的项目组接到一项新任务:为一款正在做出海准备的产品通过“数字主权认证(DSSC)”的准入审核。说实话,我一开始真没把这事放在心上,觉得这种合规认证是法务和市场部门该操心的事,测试无非是配合出…

2026/10/18 18:02:50 阅读更多 →
item_get电商商品详情接口对接实战:签名、频控与数据清洗指南

item_get电商商品详情接口对接实战:签名、频控与数据清洗指南

1. 项目概述做电商数据这块,绕不开“商品详情接口”这五个字。前阵子有个项目要对接某图书电商平台的商品信息做比价监控,技术选型时最后敲定了 item_get 这个接口。接口本身并不神秘,本质就是一个 HTTP 服务:你传一个商品 ID 过去…

2026/10/18 18:02:50 阅读更多 →
Fluent管道仿真:压降与壁面剪切力数值计算全流程指南

Fluent管道仿真:压降与壁面剪切力数值计算全流程指南

简介:面向流体仿真初学者与相关工程人员的Fluent管道仿真案例包,围绕直管稳态流动中的压降与壁面剪切力计算展开,项目基于有限元方法完成几何建模、网格划分与求解设置,可用于验证达西公式、分析壁面剪应力分布规律,并…

2026/10/18 18:01:50 阅读更多 →

最新新闻

MarkEzd.dll二次开发全攻略:激光打标机与自动化产线集成

MarkEzd.dll二次开发全攻略:激光打标机与自动化产线集成

简介:一套面向激光打标行业开发者与 C# 工程师的 EZCAD 二次开发资源包。EZCAD 是工业激光标记场景下的常用上位机软件,支持图形编辑、文字处理、条形码/二维码生成与序列号递增;EZCAD2 在界面友好度、图形处理能力与自动化流程上进一步升级。…

2026/10/18 19:17:19 阅读更多 →
STM32F407固件库LWIP以太网移植:从PHY配置到TCP通信的排坑指南

STM32F407固件库LWIP以太网移植:从PHY配置到TCP通信的排坑指南

简介:一份面向STM32F407开发者的以太网与LWIP协议栈实战资源包,涵盖固件库驱动到网络协议栈的完整代码,适合嵌入式初学者及希望在ARM平台实现联网功能的中级开发者。压缩包内共2000个文件,包括1041个头文件、881个C源文件和78个文…

2026/10/18 19:17:19 阅读更多 →
SpringBoot+Vue毕业设计实战:抗疫物资管理系统从数据库设计到部署答辩

SpringBoot+Vue毕业设计实战:抗疫物资管理系统从数据库设计到部署答辩

每到毕业设计季,我后台总能收到一堆高相似度的问题:SpringBoot 和 Vue 到底怎么连起来?物资管理系统的数据库表要建几张才够?论文里的测试数据怎么造才不像编的?部署文档写到什么程度才算完整?这些问题背后…

2026/10/18 19:17:19 阅读更多 →
JavaScript鼠标事件总结:从点击到拖拽的完整实战指南

JavaScript鼠标事件总结:从点击到拖拽的完整实战指南

平时接需求的时候,最常见的前端交互就是鼠标点击、拖拽、右键菜单这一类。很多人项目做多了,click用得很顺,但真要把「按住拖动」「滚轮缩放」「自定义右键菜单」做稳,就会发现鼠标事件这套东西比想象中复杂不少。javascript鼠标事…

2026/10/18 19:17:19 阅读更多 →
自监督学习加速药物分子研发:全链路解析与实战调优

自监督学习加速药物分子研发:全链路解析与实战调优

自监督学习这几年在各行各业都火得不行,从自然语言处理到计算机视觉,基本都靠这套思路把数据红利吃干榨净。但真正让我觉得“这技术落进现实能直接换钱”的,还是它在药物分子研发里的表现。我自己拿某跨平台分子表征系统试跑过几轮实验&#…

2026/10/18 19:17:19 阅读更多 →
博客发布全流程测试:从内容准备到SEO优化

博客发布全流程测试:从内容准备到SEO优化

1. 项目概述:一次全新的内容发布测试好久没完整跑一遍博客发布流程了,这次我借“测试一下博文”这个项目,把整套内容生产链从头到尾梳理了一遍。标题起得随意,但背后要做的事一点也不随意:验证写作环境、检查排版渲染、…

2026/10/18 19:16:15 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →