资讯动态

Nexus 3.24.0-02 内网离线部署实战:从安装到 Maven/NPM 仓库配置

发布时间:2026/10/18 3:15:26 来源:尧图企业网站定制
简介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 artifactNPM 那边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_count262144要持久化就写进/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_usernexusJVM 参数在bin/nexus.vmoptions里主要关注这几个# 堆内存初始值和最大值建议设成一样避免动态调整带来的抖动 -Xms2703m -Xmx2703m # 直接内存Nexus 内部 NIO 会用到 -XX:MaxDirectMemorySize2703m # 数据目录必须和实际路径一致 -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] DescriptionNexus Repository Manager Afternetwork.target [Service] Typeforking Usernexus Groupnexus ExecStart/opt/nexus/nexus-3.24.0-02/bin/nexus start ExecStop/opt/nexus/nexus-3.24.0-02/bin/nexus stop Restarton-failure LimitNOFILE65536 [Install] WantedBymulti-user.target写完后执行systemctl daemon-reload systemctl enable nexus systemctl start nexusTypeforking是因为 Nexus 的启动脚本会 fork 到后台。LimitNOFILE65536是给 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-port8081/tcp --permanent firewall-cmd --reload。4. 配置 Maven 和 NPM 仓库代理、宿主、仓库组怎么摆4.1 创建 Maven 代理仓库Nexus 默认已经建好了几个仓库但指向的是公网地址。内网环境需要改成自己的上游仓库地址或者直接建代理仓库指向可访问的镜像。登录后进 Settings → Repositories → Create repository选maven2 (proxy)。关键参数参数说明我一般填的值Name仓库名称maven-central-proxyRemote storage上游仓库地址公司内网镜像地址或公共镜像Version policy版本策略ReleaseLayout policy布局策略StrictBlob store存储位置defaultRemote 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 idnexus/id mirrorOf*/mirrorOf urlhttp://服务器IP:8081/repository/maven-public//url /mirrormirrorOf填*表示所有仓库请求都走 Nexus。如果只想代理中央仓库可以填central。我一般用*这样项目里声明的其他仓库也会被 Nexus 接管统一走内网。NPM 的配置在.npmrc里# 项目根目录或用户目录下的 .npmrc registryhttp://服务器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里配 distributionManagementdistributionManagement repository idnexus-releases/id urlhttp://服务器IP:8081/repository/maven-releases//url /repository snapshotRepository idnexus-snapshots/id urlhttp://服务器IP:8081/repository/maven-snapshots//url /snapshotRepository /distributionManagementid要和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 -Dartifactorg.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 真的在干活。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑