企业内部私有化 CDN 部署方案
方案一:Nginx 静态文件服务器(最简单)
nginx
# /etc/nginx/conf.d/cdn.conf
server {
listen 80;
server_name cdn.company.com;
# 静态资源根目录
root /data/cdn;
# 版本化路径支持
# https://cdn.company.com/scp-sdk/1.0.0/scp.skill.js
location ~ ^/([^/]+)/([^/]+)/(.+)$ {
alias /data/cdn/$1/$2/$3;
# 强缓存设置(1年)
expires 1y;
add_header Cache-Control "public, immutable";
# CORS 跨域支持
add_header Access-Control-Allow-Origin *;
}
# latest 软链接支持
# /data/cdn/scp-sdk/latest -> /data/cdn/scp-sdk/1.0.0
}目录结构:
/data/cdn/
├── scp-sdk/
│ ├── 1.0.0/
│ │ ├── scp.skill.js
│ │ └── scp.client.js
│ ├── 1.0.1/
│ │ ├── scp.skill.js
│ │ └── scp.client.js
│ └── latest -> 1.0.1/ # 软链接方案二:Verdaccio(私有 NPM 仓库 + CDN)
这是大厂常用方案,既支持 npm 包管理,又支持 CDN 访问。
bash
# Docker 部署
docker run -d \
--name verdaccio \
-p 4873:4873 \
-v /data/verdaccio/storage:/verdaccio/storage \
-v /data/verdaccio/conf:/verdaccio/conf \
verdaccio/verdaccio配置文件 /data/verdaccio/conf/config.yaml:
yaml
storage: /verdaccio/storage
auth:
htpasswd:
file: /verdaccio/conf/htpasswd
uplinks:
npmjs:
url: https://registry.npmmirror.com/
packages:
'@company/*':
access: $authenticated
publish: $authenticated
'**':
access: $all
proxy: npmjs
web:
enable: true
title: Company NPM Registry方案三:MinIO + Nginx(对象存储方案)
适合大规模文件存储,类似 AWS S3。
yaml
# docker-compose.yml
version: '3'
services:
minio:
image: minio/minio
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
volumes:
- /data/minio:/data
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: admin123456
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf方案四:Nexus Repository(企业级方案)
支持 NPM、Maven、Docker 等多种仓库类型。
bash
docker run -d \
--name nexus \
-p 8081:8081 \
-v /data/nexus:/nexus-data \
sonatype/nexus3推荐方案对比
| 方案 | 复杂度 | 功能 | 适用场景 |
|---|---|---|---|
| Nginx | ⭐ | 静态文件服务 | 小团队、简单需求 |
| Verdaccio | ⭐⭐ | NPM 私服 + Web UI | 中小团队、前端为主 |
| MinIO | ⭐⭐⭐ | 对象存储、S3 兼容 | 大文件、多媒体资源 |
| Nexus | ⭐⭐⭐⭐ | 全功能仓库管理 | 大型企业、多语言项目 |
自动化发布脚本示例
bash
#!/bin/bash
# publish-cdn.sh - 发布静态资源到 CDN 服务器
PACKAGE_NAME=$1
VERSION=$2
CDN_SERVER="cdn.company.com"
CDN_ROOT="/data/cdn"
if [ -z "$PACKAGE_NAME" ] || [ -z "$VERSION" ]; then
echo "用法: ./publish-cdn.sh <包名> <版本号>"
echo "示例: ./publish-cdn.sh scp-sdk 1.0.1"
exit 1
fi
TARGET_DIR="$CDN_ROOT/$PACKAGE_NAME/$VERSION"
echo "📦 发布 $PACKAGE_NAME@$VERSION 到 CDN..."
# 创建版本目录
ssh root@$CDN_SERVER "mkdir -p $TARGET_DIR"
# 上传文件
scp -r dist/* root@$CDN_SERVER:$TARGET_DIR/
# 更新 latest 软链接
ssh root@$CDN_SERVER "cd $CDN_ROOT/$PACKAGE_NAME && rm -f latest && ln -s $VERSION latest"
echo "✅ 发布完成!"
echo "访问地址: https://$CDN_SERVER/$PACKAGE_NAME/$VERSION/"
echo "Latest: https://$CDN_SERVER/$PACKAGE_NAME/latest/"