Skip to content

企业内部私有化 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/"

Released under the MIT License.