HQY

×

Nexus 代理缓存加速:三行配置让团队构建飞起来

hqy hqy 发表于2026-07-17 16:46:58 浏览4 评论0

抢沙发发表评论

用 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(当前最新版本)支持的协议覆盖面很广:

协议
类型
能缓存的源
Docker
proxy
Docker Hub, GCR, Quay, GHCR
Maven
proxy
Maven Central, Google, JCenter
npm
proxy
npmjs.org
PyPI
proxy
pypi.org
apt / yum
proxy
各种 Linux 发行版源
NuGet
proxy
nuget.org
Go
proxy
proxy.golang.org
Helm
proxy
artifacthub.io
Raw
hosted
任意文件(脚本安装包、二进制分发)

也就是说,一个 Nexus 实例可以同时给你的 Docker 拉取、Node 项目构建、Python 环境部署、Java 项目编译做统一加速。


三、部署要求

硬件

维度
最低配置
推荐配置(3-10 人团队)
CPU
2 核
4 核
内存
4 GB(含 JVM)
8 GB(含 JVM)
磁盘
50 GB
200 GB+ SSD
网络
能访问海外源 + 内网通
千兆内网

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 是代理配置——从哪个上游源拉,缓存策略怎么定。

关键参数:

参数
推荐值
说明
Remote Storage
上游源 URL
比如 Docker Hub 用 https://registry-1.docker.io
Maximum Component Age
-1
-1 表示永久缓存已下载的包,不自动过期
Maximum Metadata Age
1440
元数据 1 天刷新一次,能发现新版本
Negative Cache TTL
60
下载失败后多久重试,设短一点避免误杀

3️⃣ Group Repository

Group Repository 把一个或多个 Proxy 仓库打包成一个虚拟入口。客户端只需要配这一个地址,Nexus 自动从成员仓库中查找——找不到再去上游。


五、三种常用场景的完整配置

场景 1:Docker 镜像加速

这是最常用、收益最高的场景。 一个 Dockerfile 里可能用到 nginx:alpinepython:3.11node: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 = 你的IP

apt

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 标签页里可以设:

策略
说明
Cleanup policies
绑定一个策略:删除超过 30 天未访问的构件
Retention period
下载后保留多少天

经验值

一个 3-5 人后端团队 + 前端团队,日常使用:

场景
每月增量
半年后规模
Docker(仅常用镜像)
2-5 GB
15-30 GB
npm
200-500 MB
1-3 GB
Maven
1-3 GB
6-18 GB
PyPI
100-300 MB
0.5-2 GB

总磁盘 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://www.kinber.cn/post/6718.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客