简介:Nexus Repository Manager 3.24.0-02 的 Unix/Linux 安装包,面向使用 Maven、Gradle 或 NPM 的 Java 与前端开发团队,用于搭建私有仓库、代理远程依赖并统一管理软件组件。压缩包约 149.69MB,解压后主要包含 nexus-3.24.0-02 与 sonatype-work 两个目录:前者存放服务运行所需的可执行文件、配置与库,后者作为运行时工作目录,保存制品、索引、日志及数据库内容,部署时需保持独立以保障数据持久化与升级安全。通过编辑 conf/nexus.properties 或使用 Web 界面,可配置端口、代理仓库、存储库组与权限;针对 NPM 场景,还能将 Nexus 设为默认注册表,缓存常用包以提升内网下载速度。目前已有 212 人学习下载,适合需要集中管理 Maven、NPM 等组件的开发者参考部署。
1. 从 nexus-3.24.0-02-unix.tar.gz 说起:一个压缩包背后到底藏着什么
如果你在内部工具链里看到nexus-3.24.0-02-unix.tar.gz这个文件名,第一反应大概率是「又一个要手动部署的中间件」。它确实是一个压缩包,但解压之后你得到的不是一堆散装脚本,而是一套完整的制品仓库服务。很多团队在搭建私有依赖管理时,绕不开这个包:Java 项目要拉 Maven 依赖,前端要拉 npm 包,运维要存 Docker 镜像,如果全部走公网,速度慢、断点多、审计也麻烦。把这个包在本地或内网跑起来,就等于给自己建了一个「依赖中转站」。
这个标题里的版本号3.24.0-02和unix后缀,决定了它只面向类 Unix 环境,并且自带 Jetty 容器和 JRE 依赖声明。换句话说,你不需要额外装 Tomcat,但必须准备好匹配的 JDK。适合谁看?适合那些手里有这台机器、想在内网把制品仓库跑起来、又不想被复杂集群方案劝退的工程师。接下来我会按「解压前准备 → 启动 → 仓库配置 → 排错 → 进阶」的顺序,把这个包从落地到用顺的路径讲清楚。
2. 解压前先把运行环境对齐:JDK、目录与系统参数
2.1 为什么 JDK 版本是第一个翻车点
nexus-3.24.0-02这个版本对 JDK 的要求比较明确:需要 JDK 8 或 JDK 11,并且是 64 位。很多人拿到包直接tar -zxvf然后./nexus start,结果日志里出现Unsupported major.minor version或者NoClassDefFoundError,回头查半天才发现机器上默认java是 JDK 17。这不是玄学,是字节码版本不兼容。
我一般会先确认三件事:java -version输出的版本号、JAVA_HOME是否指向正确的 JDK 目录、当前用户是否有权限读取该目录。如果机器上装了多个 JDK,不要依赖PATH里的默认值,直接在启动脚本里显式指定。
# 查看当前 java 版本和 JAVA_HOME java -version echo $JAVA_HOME # 如果默认版本不对,临时切换(假设 JDK 11 装在 /usr/lib/jvm/java-11-openjdk) export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH # 再次确认 java -version逻辑说明:java -version看的是PATH里第一个java,而 Nexus 启动脚本会优先读JAVA_HOME。两者不一致时,以JAVA_HOME为准。参数上,JDK 11 比 JDK 8 在 TLS 和 GC 上更适合长期运行,如果团队没有历史包袱,优先选 JDK 11。
2.2 解压位置和运行用户的选择
unix.tar.gz解压后是一个nexus-3.24.0-02目录和一个sonatype-work目录。前者是程序本体,后者是数据、日志、配置和仓库内容。很多人图省事直接解压到/root下,然后用 root 跑,短期没问题,长期会踩两个坑:一是数据目录权限混乱,二是后续想换用户启动时文件属主对不上。
常见做法是建一个专用用户,把程序目录放在/opt或/usr/local,数据目录单独挂一块盘或至少单独放一个路径。下面是一套我常用的初始化命令。
# 创建专用用户和组(如果已有可跳过) sudo groupadd -r nexus sudo useradd -r -g nexus -d /opt/nexus -s /bin/false nexus # 解压到 /opt sudo tar -zxvf nexus-3.24.0-02-unix.tar.gz -C /opt # 改属主 sudo chown -R nexus:nexus /opt/nexus-3.24.0-02 sudo chown -R nexus:nexus /opt/sonatype-work # 确认目录结构 ls -ld /opt/nexus-3.24.0-02 /opt/sonatype-work逻辑说明:-r表示系统用户,-s /bin/false禁止登录,降低被误用的风险。sonatype-work目录如果不在解压包里,第一次启动会自动生成,但提前建好并授权可以避免启动时因权限不足写日志失败。参数上,数据目录所在分区建议预留至少 20GB,具体看你要存多少制品。
2.3 系统层面的三个必调参数
Nexus 本身是 Java 进程,但它的文件句柄和内存映射需求比普通应用高。默认的ulimit -n如果是 1024,仓库稍微一忙就会报Too many open files。另外,vm.max_map_count在某些索引场景下也会影响稳定性。
# 查看当前限制 ulimit -n sysctl vm.max_map_count # 临时调大文件句柄(当前会话有效) ulimit -n 65536 # 永久生效:编辑 /etc/security/limits.conf,加入 # nexus soft nofile 65536 # nexus hard nofile 65536 # 调整内存映射上限 sudo sysctl -w vm.max_map_count=262144逻辑说明:ulimit -n控制单进程能打开的文件描述符数量,Nexus 在并发拉取依赖时会大量打开文件。vm.max_map_count影响内存映射区域数量,对基于 Lucene 的索引组件有实际意义。参数值 65536 和 262144 是常见起点,机器配置高可以再往上调。
3. 启动与首次配置:从命令行到 Web 界面
3.1 用最小命令把服务拉起来
解压和授权完成后,启动本身只有一条命令,但这条命令背后的脚本会做很多事:检查JAVA_HOME、拼装 classpath、设置 JVM 参数、写 PID 文件。我习惯先在前台跑一次,观察启动日志,确认没有报错后再转后台。
# 切换到 nexus 用户 sudo su - nexus # 进入程序目录 cd /opt/nexus-3.24.0-02/bin # 前台启动,观察日志(Ctrl+C 可停止) ./nexus run # 确认无误后,后台启动 ./nexus start # 查看状态 ./nexus status逻辑说明:./nexus run会把日志直接打到终端,适合首次排错;./nexus start会写 PID 文件并转入后台。如果start后立刻status显示 not running,不要反复重启,先去看sonatype-work/nexus3/log/nexus.log的最后几十行。
3.2 首次登录和 admin 密码在哪
服务起来后,默认监听 8081 端口。浏览器访问http://<内网IP>:8081,会看到登录页。很多人卡在「默认密码是什么」——这个版本不再用admin/admin123,而是把初始密码写在一个文件里。
# 初始密码文件路径 cat /opt/sonatype-work/nexus3/admin.password # 如果文件不存在,检查是否已经改过密码 ls -l /opt/sonatype-work/nexus3/admin.password逻辑说明:首次启动时,Nexus 会生成一个随机密码写入admin.password,登录后强制引导你修改。修改完成后该文件会被删除。如果文件不存在且你也没改过密码,说明数据目录可能被清理过,需要检查sonatype-work是否指向了正确路径。
3.3 仓库类型怎么选:proxy、hosted、group 的区别
登录后的第一件事是建仓库。Nexus 的仓库分三类:proxy代理远程仓库并缓存、hosted存放内部制品、group把多个仓库聚合成一个入口。新手容易把所有东西都塞进一个 hosted 仓库,结果依赖解析顺序混乱。
| 仓库类型 | 用途 | 典型场景 | 是否可写 |
|---|---|---|---|
| proxy | 代理公网仓库并缓存 | 代理 Maven Central、npm registry | 否 |
| hosted | 存放内部发布制品 | 内部快照、私有包 | 是 |
| group | 聚合多个仓库统一暴露 | 对外只给一个 URL | 否 |
常见做法是:建一个maven-central的 proxy 仓库指向公网,建一个maven-internal的 hosted 仓库放内部包,再建一个maven-all的 group 把前两者加进去。开发人员只需要配置 group 的地址,不用关心包来自哪里。
# 示例:Maven settings.xml 中配置 group 仓库 # <mirror> # <id>nexus-group</id> # <mirrorOf>*</mirrorOf> # <url>http://<内网IP>:8081/repository/maven-all/</url> # </mirror>逻辑说明:mirrorOf设为*表示所有请求都走这个 group。如果只想代理特定仓库,可以改成central或*排除某些。参数上,group 的 URL 末尾必须带斜杠,否则部分客户端会拼接出错误路径。
4. 避坑与排查:五个真实踩过的坑
4.1 启动报端口被占用
现象:./nexus start后 status 显示 not running,日志里出现Address already in use。原因:8081 端口被其他进程占用,或者上一次 Nexus 没停干净。解决:先用ss -lntp | grep 8081找到占用进程,确认不是 Nexus 残留后杀掉,或者修改etc/nexus-default.properties里的application-port换一个端口。
4.2 上传制品时报 413 或超时
现象:mvn deploy上传大包时失败,返回 413 或连接重置。原因:Nexus 前面的反向代理(如果有)限制了请求体大小,或者 Nexus 自身的nexus.properties里没有调整缓冲。解决:检查反向代理的client_max_body_size,同时在etc/nexus-default.properties中确认没有过小的限制项。如果是直连 Nexus,检查sonatype-work/nexus3/etc/nexus.properties里的相关配置。
4.3 磁盘写满导致仓库不可用
现象:某天突然所有依赖拉取失败,日志报No space left on device。原因:sonatype-work所在分区被制品和日志撑满。解决:先清理sonatype-work/nexus3/log下的旧日志,再检查是否有大量未清理的快照版本。长期方案是把数据目录迁到独立分区,并配置定期清理任务。
4.4 内存不足引发频繁 Full GC
现象:服务运行一段时间后响应变慢,日志里出现OutOfMemoryError或 GC 时间过长。原因:默认 JVM 堆内存偏小,或者机器上同时跑了其他吃内存的服务。解决:编辑bin/nexus.vmoptions,调整-Xms和-Xmx。一般建议-Xms和-Xmx设成相同值,避免堆动态伸缩带来的抖动。
# 查看当前 JVM 参数 cat /opt/nexus-3.24.0-02/bin/nexus.vmoptions # 示例调整(根据机器内存,4GB 起步) # -Xms2g # -Xmx2g # -XX:MaxDirectMemorySize=2g逻辑说明:-Xms是初始堆,-Xmx是最大堆。设成相同值可以减少堆扩容带来的停顿。MaxDirectMemorySize影响 NIO 直接内存,对文件传输场景有实际意义。
4.5 匿名访问导致内部包泄露
现象:安全扫描发现内部仓库可以被未登录用户拉取。原因:默认情况下某些仓库允许匿名读取。解决:在 Web 界面的 Security → Anonymous 中关闭匿名访问,或者按仓库粒度设置权限。如果团队有 CI 机器需要免密拉取,建议用专门的只读账号而不是开放匿名。
5. 进阶用法:把 Nexus 用成团队依赖治理的支点
5.1 用清理策略控制快照膨胀
快照版本是磁盘杀手。一个项目每天构建十次,每次产生一个新快照,一个月下来就是几百个目录。Nexus 自带清理任务,但默认不启用。我一般会建一个清理策略:保留最近 7 天的快照,超过 30 天的全部删除。
在 Web 界面进入 Repository → Cleanup Policies,新建一个策略,设置Format为 maven2,Release Type选 snapshots,Last Blob Updated设为 30 天。然后把这个策略应用到所有 hosted 快照仓库上。这一步做完,磁盘增长曲线会明显平缓。
5.2 用 API 做自动化健康检查
Nexus 提供 REST API,可以用来做监控和自动化。比如定时检查仓库状态、获取存储用量、触发清理任务。下面是一个用 curl 检查服务状态的例子。
# 检查 Nexus 是否存活(返回 200 表示正常) curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8081/service/rest/v1/status # 获取存储用量(需要认证) curl -u admin:password http://127.0.0.1:8081/service/rest/v1/repositories # 触发清理任务(需要任务 ID) curl -u admin:password -X POST http://127.0.0.1:8081/service/rest/v1/tasks/<taskId>/run逻辑说明:/service/rest/v1/status不需要认证,适合做存活探针。/service/rest/v1/repositories返回仓库列表和类型,可以配合脚本做资产盘点。参数上,认证信息建议放在环境变量或凭据文件里,不要硬编码在脚本中。
5.3 一个我坚持了多年的习惯
每次部署完 Nexus,我都会做三件事:把admin.password改掉并记录到密码管理器、把数据目录路径写进运维文档、在监控里加一条磁盘使用率告警。这三件事花不了十分钟,但能避免后面半夜被叫起来处理「仓库挂了」的紧急工单。依赖仓库这种东西,平时没人注意,一旦出问题就是整条流水线停摆。希望帮到你。
本文还有配套的精品资源,点击获取