隔离网生存指南:内网 Nexus 搭建 PyPI 离线镜像全攻略
最近在一个与外网完全物理隔离的内网环境里折腾 Python 项目,第一道坎就是 pip install 根本无法联网。
折腾了一圈,最终选定 Sonatype Nexus Repository Manager 作为私有 PyPI 镜像站。它不仅免费、成熟、权限管理完善,同一套实例还能顺手管 Maven 和 npm。

今天把这套完整的内网搭建流程记录下来,特别是带 CUDA 版 PyTorch 的踩坑细节,帮你少走弯路。
🔧 前置避坑指南
在开始之前,有一个致命前提必须满足:
外网跳板机的 Python 版本,必须与内网开发机完全一致!
Python 打包时会根据版本和系统架构生成对应的 .whl 文件名(比如 cp311-win_amd64)。如果不一致,你千辛万苦拷进内网的包,根本装不上。
(本文环境均为 Windows)
🏗️ 第一步:配置 Nexus 仓库
登录 Nexus 管理后台(默认端口 8081)。进入 Repository → Repositories → Create repository。
按顺序建两个仓库:
- PyPI (hosted):建议命名为
pypi-local,专门用来接收我们手动上传的离线包。 - PyPI (group):建议命名为
pypi-group,把刚才的 local 加进去。以后内网机器只用认准这个 group 地址就行。
📦 第二步:外网跳板机下载离线包
找一台能上网的 Windows,确保 Python 版本没问题,执行:
# 进入存放 requirements.txt 的目录
cd d:\PyPI
# 下载所有项目依赖(含 PyTorch CUDA 专属包)到 offline_packages 文件夹
pip download -r requirements.txt -d ./offline_packages --extra-index-url https://download.pytorch.org/whl/cu121
# 顺带把上传工具 twine 和它的依赖也扒下来
pip download twine -d ./offline_packages
重点注意:--extra-index-url 是搞定带 CUDA 12.1 支持的 PyTorch 专属包的关键参数,不加这个你只会下到纯 CPU 版本。
🚛 第三步:人肉搬运
拿上你的 U盘,或者通过内网共享,把整个 offline_packages 文件夹完整拷进内网开发机。
🔨 第四步:内网离线安装 twine
在内网机打开命令行,进入离线包目录,执行安装:
pip install --no-index --find-links=.\offline_packages twine
--no-index 彻底掐断 pip 联网的念头,--find-links 让它老老实实从本地读包。
🚀 第五步:向 Nexus 批量推包
用刚才装好的 twine,把几百个包一次性轰进 Nexus 的 pypi-local 仓库里:
twine upload ^
--repository-url http://<Nexus_IP>:8081/repository/pypi-local/ ^
-u <Nexus用户名> ^
-p <Nexus密码> ^
.\offline_packages\*
推完稍等片刻,Nexus 会自动重建索引。此时在管理界面的包列表里就能看到了。
⚙️ 第六步:把 pip 指向内网
内网机不能上网,我们要让它默认去 Nexus 找包。
修改 Windows 的 pip 全局配置,路径在 %APPDATA%\pip\pip.ini。如果文件不存在就手动新建:
[global]
index-url = http://<Nexus_IP>:8081/repository/pypi-group/simple/
trusted-host = <Nexus_IP>
因为没配 HTTPS,trusted-host 必须加上,不然 pip 会一直报 SSL 验证失败的错。
✅ 第七步:见证奇迹
在内网开发机上敲下最终命令:
pip install -r d:\PyPI\requirements.txt
如果没有满屏红字,全部包都从内网 Nexus 极速拉取,这套环境就彻底跑通了。
🐛 高频报错排查
如果你还是翻车了,对照这里抢救一下:
- 报错
SSL: CERTIFICATE_VERIFY_FAILED:pip 把你的 HTTP 地址当成 HTTPS 处理了。检查pip.ini里的trusted-host填对了没。 - 某些包
404 Not Found:跳板机和内网机的 Python 版本或系统不一致,回外网重新下。 - 找不到
+cu121后缀的包:你外网下载时漏了那个巨长的--extra-index-url参数。 - twine 上传报
403 Forbidden:Nexus 用户权限没给够。去确认下你的账号有没有nx-repository-view-pypi-pypi-local-*的权限。 - pip 还在尝试连外网:你的
pip.ini压根没生效,敲一行pip config list看看它到底读了哪个路径的配置。
这套体系搭好,后续再加什么新依赖,只需要“外网下载 → 内网上传”两步走。一次折腾,团队所有人都能直接连这个内网镜像站。

浙公网安备 33010602011771号