简介:Nexus Repository Manager 3.24.0-02 的 Unix/Linux 安装包,面向 Java 与前端开发团队中负责依赖治理、私服搭建的工程师及运维人员,用于集中管理 Maven、NPM 等软件组件,解决多项目依赖分散、外网拉取缓慢与制品版本混乱的问题。压缩包为 gz 格式,整体约 149.69MB,解压后主要包含 nexus-3.24.0-02 与 sonatype-work 两部分:前者承载可执行文件、配置文件与依赖库,后者作为运行时工作目录,存放制品、索引、日志及数据库内容,便于数据持久化与版本升级。目前已有 212 人学习下载。借助该资源,读者可快速搭建本地仓库服务,将 Nexus 配置为 Maven 代理仓库与 NPM 代理注册表,缓存常用依赖、托管私有包,并通过 Web 界面或 nexus.properties 定制端口、存储与权限策略,从而提升团队内部依赖分发效率与制品安全性。
1. 从一台内网构建机说起:nexus-3.24.0-02 到底该装在哪
上周帮一个朋友处理内网构建机,Maven 拉依赖卡了四十分钟,最后报了一串Could not transfer artifact,NPM 那边npm install也一直转圈。问题不在代码,在于所有依赖都往公网仓库跑,而内网出口带宽小得可怜。这种场景下,Nexus 就是那个把 Maven、NPM 依赖统一收口到本地的东西——装一次,后面所有构建机都从它这里拿包。nexus-3.24.0-02-unix.tar.gz是 Sonatype 官方提供的 Unix 版本压缩包,解压即用,不依赖系统包管理器,适合内网离线部署。它适合谁?适合手里有 Maven 或 NPM 项目、构建频繁、又不想每次都被公网仓库拖慢的团队。装不好会怎样?端口冲突、JVM 内存不够、仓库路径写错,随便一个都能让你在构建日志里翻半天。这篇就按我实际装过的流程,从环境准备到验证跑通,一步步来。
2. 装之前先把环境对齐:JDK、内存、端口一个都不能少
2.1 版本选择:为什么是 3.24.0-02 而不是最新版
Nexus 3.x 系列对 JDK 的要求比较明确。3.24.0-02 这个版本,官方要求 JDK 8,实测 JDK 8u181 以上都能跑。我一般不会直接上最新版,原因有两个:一是新版本可能引入新的配置项,老脚本不兼容;二是 3.24.0-02 这个版本在社区里被大量使用,遇到问题搜到的解决方案多。如果你手里只有 JDK 11,也能启动,但部分插件行为会有差异,生产环境建议还是 JDK 8。
内存方面,Nexus 默认的 JVM 堆是 2703MB,这个值写在bin/nexus.vmoptions里。如果机器内存小于 4GB,启动会非常吃力,甚至 OOM。我一般会给 Nexus 单独分配 4GB 以上内存,堆内存设成 2GB 到 3GB 之间。端口默认是 8081,如果这台机器上已经有服务占了 8081,要么改 Nexus 端口,要么把那个服务挪走。检查端口用ss -tlnp | grep 8081或netstat -tlnp | grep 8081。
磁盘空间容易被忽略。Nexus 的 blob store 会随着依赖包增多不断膨胀,我见过一个中等规模团队用了半年,仓库目录到了 80GB。所以数据目录所在分区至少留 100GB 起步,并且要单独挂盘,别和系统盘混在一起。
2.2 系统参数:文件句柄和线程数先调好
Linux 默认的文件句柄数对 Nexus 来说往往不够。Nexus 在运行时会打开大量文件,尤其是仓库索引重建的时候。先看当前限制:
ulimit -n如果输出是 1024,建议调到 65536。临时生效用ulimit -n 65536,永久生效改/etc/security/limits.conf:
# 在文件末尾追加 * soft nofile 65536 * hard nofile 65536改完需要重新登录 shell 才生效。另外,vm.max_map_count在某些内核版本下也需要调整,Nexus 内部用到了内存映射文件:
sysctl -w vm.max_map_count=262144要持久化就写进/etc/sysctl.conf。这些参数不调,Nexus 跑一段时间后可能出现Too many open files或者索引写入失败,日志里不一定直接报文件句柄,而是各种奇怪的 IO 异常,排查起来很费劲。
2.3 目录规划:安装目录和数据目录分开
我习惯把 Nexus 的安装目录和数据目录分开。安装目录放解压出来的文件,数据目录放仓库数据、日志、配置。这样做的好处是升级的时候直接换安装目录,数据目录不动,迁移也方便。
# 创建安装目录和数据目录 mkdir -p /opt/nexus mkdir -p /data/nexus-data # 解压安装包到安装目录 tar -zxvf nexus-3.24.0-02-unix.tar.gz -C /opt/nexus # 解压后会有两个目录:nexus-3.24.0-02 和 sonatype-work ls /opt/nexus解压出来的nexus-3.24.0-02是程序目录,sonatype-work是默认的数据目录。我把sonatype-work移到/data/nexus-data,然后改配置指向新位置。数据目录的属主必须是启动 Nexus 的用户,否则启动时会报权限错误。
# 移动数据目录 mv /opt/nexus/sonatype-work /data/nexus-data # 修改属主,假设用 nexus 用户启动 chown -R nexus:nexus /opt/nexus/nexus-3.24.0-02 chown -R nexus:nexus /data/nexus-data3. 安装与启动:从解压到看见 8081 页面
3.1 指定运行用户和 JVM 参数
Nexus 不建议用 root 直接跑,我一般会建一个专用用户:
useradd -r -s /sbin/nologin nexus然后改bin/nexus.rc文件,指定运行用户:
# 编辑 /opt/nexus/nexus-3.24.0-02/bin/nexus.rc run_as_user="nexus"JVM 参数在bin/nexus.vmoptions里,主要关注这几个:
# 堆内存初始值和最大值,建议设成一样,避免动态调整带来的抖动 -Xms2703m -Xmx2703m # 直接内存,Nexus 内部 NIO 会用到 -XX:MaxDirectMemorySize=2703m # 数据目录,必须和实际路径一致 -Dkaraf.data=/data/nexus-data # 日志目录 -Djava.io.tmpdir=/data/nexus-data/tmp-Dkaraf.data这个参数特别关键。如果你移动了数据目录但没改这里,Nexus 启动后还是会往默认位置写,结果就是数据目录看起来是空的,而磁盘空间却被悄悄占满。我一般会把-Xms和-Xmx设成相同值,避免 JVM 在运行过程中反复调整堆大小,对稳定性有好处。
3.2 启动脚本与 systemd 托管
直接用bin/nexus start可以启动,但机器重启后不会自动拉起。生产环境我一般用 systemd 托管:
# /etc/systemd/system/nexus.service [Unit] Description=Nexus Repository Manager After=network.target [Service] Type=forking User=nexus Group=nexus ExecStart=/opt/nexus/nexus-3.24.0-02/bin/nexus start ExecStop=/opt/nexus/nexus-3.24.0-02/bin/nexus stop Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target写完后执行:
systemctl daemon-reload systemctl enable nexus systemctl start nexusType=forking是因为 Nexus 的启动脚本会 fork 到后台。LimitNOFILE=65536是给 systemd 托管的进程单独设文件句柄限制,比改limits.conf更直接。启动后看状态:
systemctl status nexus如果显示active (running),基本就起来了。首次启动会初始化数据库和仓库结构,大概需要一到两分钟。这时候可以看日志确认:
tail -f /data/nexus-data/log/nexus.log看到Started Sonatype Nexus就说明启动完成。
3.3 首次访问与管理员密码
浏览器打开http://<服务器IP>:8081,会看到 Nexus 的欢迎页。右上角有 Sign in,初始管理员用户名是admin。密码在数据目录里:
cat /data/nexus-data/admin.password这个文件在首次登录后会被删除,所以登录进去第一件事就是改密码。改完密码后,Nexus 会引导你完成一些基础配置,比如是否允许匿名访问。我一般会关掉匿名访问,因为内网仓库通常需要控制权限。
提示:如果 8081 页面打不开,先检查防火墙。
firewall-cmd --list-ports看 8081 有没有放行,没有就firewall-cmd --add-port=8081/tcp --permanent && firewall-cmd --reload。
4. 配置 Maven 和 NPM 仓库:代理、宿主、仓库组怎么摆
4.1 创建 Maven 代理仓库
Nexus 默认已经建好了几个仓库,但指向的是公网地址。内网环境需要改成自己的上游仓库地址,或者直接建代理仓库指向可访问的镜像。登录后进 Settings → Repositories → Create repository,选maven2 (proxy)。
关键参数:
| 参数 | 说明 | 我一般填的值 |
|---|---|---|
| Name | 仓库名称 | maven-central-proxy |
| Remote storage | 上游仓库地址 | 公司内网镜像地址或公共镜像 |
| Version policy | 版本策略 | Release |
| Layout policy | 布局策略 | Strict |
| Blob store | 存储位置 | default |
Remote storage 填什么取决于你的网络环境。如果内网有统一的镜像服务,就填那个地址;如果没有,填公共镜像地址,但前提是这台机器能访问。创建完后,Nexus 会在后台开始拉取索引,索引越大时间越长,Maven Central 的索引大概要几十分钟。
4.2 创建 NPM 代理仓库和仓库组
NPM 的配置类似。Create repository 选npm (proxy),Remote storage 填 NPM 上游地址。NPM 仓库不需要索引,创建完就能用。
仓库组(group)是把多个仓库聚合成一个入口。我一般会建一个maven-public组,把maven-central-proxy、maven-releases、maven-snapshots都加进去。这样开发只需要配一个地址,不用记多个仓库 URL。
<!-- Maven settings.xml 中配置 mirror --> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://<服务器IP>:8081/repository/maven-public/</url> </mirror>mirrorOf填*表示所有仓库请求都走 Nexus。如果只想代理中央仓库,可以填central。我一般用*,这样项目里声明的其他仓库也会被 Nexus 接管,统一走内网。
NPM 的配置在.npmrc里:
# 项目根目录或用户目录下的 .npmrc registry=http://<服务器IP>:8081/repository/npm-public/如果 Nexus 配了认证,还需要加_auth字段。匿名访问开启的话就不需要。
4.3 宿主仓库与上传权限
宿主仓库(hosted)用来存放自己团队发布的包。Maven 的maven-releases和maven-snapshots默认就有,NPM 需要自己建一个npm (hosted)。上传包需要权限,在 Security → Roles 里建一个角色,赋予nx-repository-view-*-*-add和nx-repository-view-*-*-edit权限,然后把角色分配给对应用户。
发布 Maven 包时,在pom.xml里配 distributionManagement:
<distributionManagement> <repository> <id>nexus-releases</id> <url>http://<服务器IP>:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <url>http://<服务器IP>:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>id要和settings.xml里 server 配置的 id 对应,认证信息写在 settings.xml 里。NPM 发布用npm publish --registry http://<服务器IP>:8081/repository/npm-hosted/。
5. 避坑与排查:装 Nexus 时最容易翻车的五个地方
5.1 启动报错Cannot allocate memory
现象:执行bin/nexus start后进程很快退出,日志里出现Cannot allocate memory或There is insufficient memory for the Java Runtime Environment。
原因:nexus.vmoptions里配的堆内存超过了机器实际可用内存,或者-Xms设得太大,JVM 启动时直接申请失败。
解决:先看机器内存free -h,把-Xms和-Xmx降到实际内存的 50% 到 60%。如果机器只有 2GB 内存,Nexus 基本跑不动,建议加内存或者换机器。另外检查有没有其他 Java 进程占着内存,ps aux | grep java看一眼。
5.2 8081 端口被占用
现象:启动日志显示Address already in use,或者启动成功但浏览器访问 8081 是别的服务。
原因:机器上已经有服务监听了 8081,可能是之前装过 Nexus 没停干净,也可能是其他应用。
解决:ss -tlnp | grep 8081找到占用进程,确认能不能停。如果必须改 Nexus 端口,编辑etc/org.sonatype.nexus.cfg里的application-port,改成其他端口,比如 8082。改完重启 Nexus。
5.3 数据目录权限不对导致启动失败
现象:日志里出现Permission denied,指向/data/nexus-data下的某个文件或目录。
原因:Nexus 以nexus用户运行,但数据目录的属主是 root,或者权限不够。
解决:chown -R nexus:nexus /data/nexus-data,然后确认目录权限至少是 755。如果数据目录在 NFS 上,还要注意 NFS 的 squashing 配置,root squash 可能导致 nexus 用户写不进去。
5.4 代理仓库拉不到包,一直超时
现象:Maven 构建时卡在下载依赖,Nexus 日志里显示Connection timed out或Unknown host。
原因:Nexus 所在机器无法访问 Remote storage 里填的上游地址,或者 DNS 解析有问题。
解决:先在 Nexus 机器上curl -I <上游地址>确认网络通不通。如果上游是公网地址而机器没有外网访问,就需要换成内网镜像地址。DNS 问题的话,检查/etc/resolv.conf,或者直接在 Remote storage 里填 IP 地址绕过 DNS。
5.5 磁盘写满导致仓库不可用
现象:Nexus 页面能打开,但拉包时报Blob store is full或写入失败,日志里出现No space left on device。
原因:数据目录所在分区满了。Nexus 的 blob store 不会自动清理,旧版本的包会一直留着。
解决:先df -h确认哪个分区满了。临时清理可以删掉sonatype-work/nexus3/blobs/default/content下的旧数据,但别直接删,最好通过 Nexus 的 Cleanup Policy 来清理。我一般会建一个清理策略,定期删除超过 90 天未使用的快照包。长期方案是给数据目录单独挂一块大盘,并且加监控告警。
6. 装完怎么验证:三个动作确认 Nexus 真的能干活
装完不是看到 8081 页面就完事了,得实际拉一个包、发一个包,才算跑通。我一般按下面三步验证。
第一步,验证 Maven 代理仓库能拉包。找一台配置了 Nexus 镜像的机器,执行:
mvn dependency:get -Dartifact=org.apache.commons:commons-lang3:3.12.0如果构建成功,说明 Nexus 从上游拉到了包并缓存到了本地。然后去 Nexus 页面 Browse → maven-central-proxy,搜commons-lang3,能看到 3.12.0 这个版本,就说明缓存生效了。第二次再执行同样的命令,速度会明显快很多,因为直接从 Nexus 本地返回。
第二步,验证 NPM 代理仓库能拉包:
npm view lodash version --registry http://<服务器IP>:8081/repository/npm-public/能返回版本号就说明 NPM 代理通了。然后npm install lodash --registry http://<服务器IP>:8081/repository/npm-public/,看node_modules里有没有装进去。
第三步,验证宿主仓库能上传。Maven 项目执行mvn deploy,看 Nexus 的maven-releases仓库里有没有出现对应的包。NPM 执行npm publish,看npm-hosted仓库里有没有。上传成功后,再从另一台机器拉这个包,确认能拉到。
注意:验证的时候别只看页面,一定要实际执行命令。页面能打开但仓库不通的情况太常见了,尤其是代理仓库的上游地址填错的时候。
我自己的习惯是,每次装完 Nexus,都会在构建机上跑一遍完整的mvn clean package和npm install,确认所有依赖都从 Nexus 走。有一次偷懒没验证,结果上线后发现 NPM 的registry配错了,构建机还是往公网跑,白白浪费了一周时间。从那以后我每次装完都强制走一遍拉包和发包的流程,确认 Nexus 真的在干活。希望帮到你。
本文还有配套的精品资源,点击获取