用 Nexus 搭个本地包缓存,团队构建速度提升 10 倍
一、为什么要搞本地缓存
做后端开发的人,对下面这个场景一定不陌生:
• docker pull卡在 waiting……五分钟后才拉下来• npm install跑到一半,node-sass 编译失败,原来是 GitHub 下载超时• pip install等着等着,你喝了杯咖啡回来,还在 resolving dependencies• mvn build第一次 30 分钟,第二次还是 30 分钟——Maven 啥也没缓存
这些问题的根因都一样:每次构建都在重复从海外源拉东西。
内网所有机器都走同一个海外出口,带宽就那么一点,几十个工程师一起构建时,整条链路都在排队。今天服务器在海外源上吃灰,你在工位上等。
解决方按很朴素:在本地搭一个代理缓存仓库。
所有包只从海外源拉一次,后续请求全部走内网局域网,毫秒级响应。这就是 Nexus Repository 做的事。
二、Nexus 是什么
Nexus Repository(全称 Sonatype Nexus Repository)是一个通用的软件仓库管理器。它最核心的功能是 代理缓存(Proxy Cache)。
你可以把它理解成一个「本地快递中转站」:
• 第一个 docker pull nginx来了 → 去 Docker Hub 取货 → 存到本地磁盘• 第二个 docker pull nginx来了 → 直接从本地磁盘给你 → 局域网速度,延时 < 1ms
Nexus 3(当前最新版本)支持的协议覆盖面很广:
也就是说,一个 Nexus 实例可以同时给你的 Docker 拉取、Node 项目构建、Python 环境部署、Java 项目编译做统一加速。
三、部署要求
硬件
Nexus 用 Java(JVM)运行,默认堆内存 2-4 GB。小团队前期 4 GB 内存足够用。
部署方式:Docker(推荐)
# docker-compose.yml
version:'3'
services:
nexus:
image:sonatype/nexus3:latest
container_name:nexus
restart:unless-stopped
ports:
-"8081:8081"# Web 管理端
-"8082:8082"# Docker 代理(HTTP)
-"8083:8083"# Docker 代理(HTTPS,可选)
volumes:
-/opt/nexus-data:/nexus-data
environment:
-INSTALL4J_ADD_VM_PARAMS=-Xms2g-Xmx4g
networks:
-nexus-net
networks:
nexus-net:
driver:bridge启动:
mkdir -p /opt/nexus-data && chown -R 200:200 /opt/nexus-data
docker compose up -d第一次启动需要 3-5 分钟初始化,留意日志:
docker logs -f nexus # 看到 "Started Sonatype Nexus" 就说明好了
初始化后访问 http://你的IP:8081,管理员密码自动生成在容器里:
docker exec nexus cat /nexus-data/admin.password
登录用 admin + 上面拿到的密码,首次登录强制修改密码。
四、核心配置:三种仓库类型
Nexus 的仓库分三种层级,理解它们就掌握了 90% 的配置:
Blob Store(存储桶)→ Proxy Repository(代理源)→ Group Repository(聚合入口)
1️⃣ Blob Store
Blob Store 是物理存储层。每个仓库(Repository)都绑定一个 Blob Store,数据写在哪里。
管理后台 → 齿轮 ⚙️ → Repository → Blob Stores → Create Blob Store
Name: docker-proxy-store
Type: File(默认)
Path: /nexus-data/blobs/docker-proxy-store(自动)2️⃣ Proxy Repository
Proxy Repository 是代理配置——从哪个上游源拉,缓存策略怎么定。
关键参数:
https://registry-1.docker.io-1144060
3️⃣ Group Repository
Group Repository 把一个或多个 Proxy 仓库打包成一个虚拟入口。客户端只需要配这一个地址,Nexus 自动从成员仓库中查找——找不到再去上游。
五、三种常用场景的完整配置
场景 1:Docker 镜像加速
这是最常用、收益最高的场景。 一个 Dockerfile 里可能用到 nginx:alpine、python:3.11、node:20——每个几百 MB,第一次拉完就永远存在本地。
创建 Docker Proxy:
Repository → Create Repository → docker → proxy
关键配置:
Name: docker-hub-proxy
Remote Storage: https://registry-1.docker.io
Blob Store: docker-proxy-store
Maximum Component Age: -1(永久缓存)
HTTP Port: 8082⚠️ Docker 代理和其他协议不同——它需要额外指定端口(因为 Docker 客户端走的是 Registry API 而不是 HTTP Web API)。上面配了 8082 作为代理端口。
客户端配置:
编辑 /etc/docker/daemon.json:
{
"registry-mirrors":["https://你的IP:8082"]
}重启 Docker:
systemctl daemon-reload && systemctl restart docker
然后测试:
docker pull nginx:alpine # 第一次:从 Docker Hub 拉取,会慢一点
docker pull nginx:alpine # 第二次:直接从 Nexus 返回,秒级⚠️ 如果 Nexus 没配 HTTPS,Docker Client 默认拒绝 HTTP 连接。需要在daemon.json加"insecure-registries":["你的IP:8082"]。生产环境建议给 Nexus 配 HTTPS(用 Nginx 反代最简单)。
场景 2:npm 包加速
前端兄弟们应该最痛——每次 npm install 都要等半分钟到两分钟,node_modules 又装了又删。
创建 npm Proxy:
Repository → Create Repository → npm → proxy
Name: npmjs-proxy
Remote Storage: https://registry.npmjs.org
Blob Store: (新建一个 npm 专用的)
Maximum Component Age: -1创建 Group(可选但推见):
Repository → Create Repository → npm → group
Name: npm-public
Member Repositories: npmjs-proxy客户端配置:
单次使用:
npm install --registry http://你的IP:8081/repository/npm-public/
永久配置(写在项目 .npmrc 或全局 ≈/.npmrc):
registry=http://你的IP:8081/repository/npm-public/
第一次 npm install 还是需要从 npmjs.org 拉,第二次开始全部走内网。一个 express 包从 npmjs 下载要 200-500ms,走内网是 5-10ms,快了 20 倍。
场景 3:Maven/Gradle 加速
Java 后端团队的噩梦——新同事入职构建项目,Maven Central 连接超时三次才 fallback。
创建 Maven Proxy:
Repository → Create Repository → maven2 → proxy
Name: maven-central-proxy
Remote Storage: https://repo1.maven.org/maven2
Blob Store: maven-proxy-store国内加速小技巧: 如果团队在海外的服务器少,上游源可以换成阿里云镜像 https://maven.aliyun.com/repository/central。第一次拉取速度明显更快。创建 Group:
Name: maven-public
Member Repositories: maven-central-proxy客户端配置(Maven):
编辑 ≈/.m2/settings.xml:
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://你的IP:8081/repository/maven-public/</url>
</mirror>
</mirrors>Gradle 用户则在 build.gradle 中配置 maven { url "http://你的IP:8081/repository/maven-public/" }。
所有依赖第一次从中央仓库拉取,缓存到本地后后续构建直接从 Nexus 返回。Maven 构建时间可以从 30 分钟降到 3 分钟。
六、PyPI 和 apt 加速(附赠)
PyPI
Repository → Create Repository → pypi → proxy
Name: pypi-proxy
Remote Storage: https://pypi.org
Maximum Component Age: -1客户端使用:
pip install -i http://你的IP:8081/repository/pypi-proxy/simple/ 包名
持久化到 ≈/.pip/pip.conf:
[global]
index-url = http://你的IP:8081/repository/pypi-proxy/simple/
trusted-host = 你的IPapt
Repository → Create Repository → apt → proxy
Name: apt-proxy
Remote Storage: http://deb.debian.org/debian
Distribution: bookworm
Flat Options: (关闭)客户端配置 /etc/apt/sources.list:
deb http://你的IP:8081/repository/apt-proxy/ bookworm main
apt update 第一次拉取全部元数据约 10-30 秒,之后秒级完成。
七、磁盘满了怎么办
缓存时间久了,磁盘会被撑爆。Nexus 内置了自动清理机制:
任务式清理
管理后台 → 系统 → Tasks → Create Task
Task Type: Admin - Compact blob store
Blob Store: 选则要清理的建议每周跑一次。
自动清理策略
每个 Proxy Repository 的 Storage 标签页里可以设:
经验值
一个 3-5 人后端团队 + 前端团队,日常使用:
总磁盘 50 GB 够用半年,200 GB 够用几年。
八、踩坑汇总
❌ 坑 1:Docker 报 "http: server gave HTTP response to HTTPS client"
原因: Docker Client 默认要求 Registry 走 HTTPS,而 Nexus Docker Proxy 默认只开了 HTTP。
解决: 在 /etc/docker/daemon.json 中加入:
{
"insecure-registries":["你的IP:8082"]
}❌ 坑 2:npm install 报 certificate error
原因: 和 Docker 一样,npm 默认走 HTTPS。
解决: 在 .npmrc 中加 strict-ssl=false(仅限内网环境,外网别开)。
❌ 坑 3:首次构建还是很慢
正常。 Nexus 只做缓存,第一次请求还是得去上游拉。团队第一个运行的同事会被现实毒打一次,第二个人开始就能起飞。
优化方案: 部署完成后,提前 docker pull 一遍项目要用到的镜像、npm install 一遍依赖——这叫「预热缓存」。
❌ 坑 4:磁盘暴涨
原因: Docker 每拉一个新版本的镜像就多存一份。
解决: 设清理策略,把 30 天以上未使用的镜像层删掉。或者定时跑 Compact Blob Store Task。
❌ 坑 5:Nexus 本身挂了
原因: Java OOM 或磁盘写满。
解决: 限制 JVM 堆内存(-Xmx4g)、给磁盘分区做监控(磁盘使用率 > 80% 报警)。挂掉后只是退化成直连海外源,不影响业务正常运行。
九、验证效果
部署完成后,跑两轮测试:
# 第一次(从海外拉)
time docker pull node:20-alpine
# 第二次(从缓存拉)
time docker pull node:20-alpine第二次的耗时应该只有第一次的 10%-20%。如果内网是千兆,一个 30 MB 的 npm 包可以在 0.5 秒内完成,海外源通常需要 2-5 秒。
对于 Maven 项目,全量构建时间可以从 20-30 分钟降到 2-5 分钟——提升的是 5-10 倍,标题说的「提升 10 倍」不是夸张。
十、总结
Nexus 的核心逻辑极简:第一次去上游拿,之后从本地给。
• 部署只需一个 Docker Compose 文件,30 分钟上线 • 支持 Docker / npm / Maven / PyPI / apt 等主流协议 • 内网缓存命中后请求延时从秒级降到毫秒级 • 磁盘压力可控,150 GB 够一个小团队用两年 • 实例挂了不致命,只是降级回到直连海外源
如果你的团队还在每天等海外源超时,花 30 分钟搭个 Nexus,这是 DevOps 工具箱里投入产出比最高的基础设施投资之一。
本文链接:https://kinber.cn/post/6718.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
