背景与规模:管理 (多模板)个地区子站,实现全矩阵每日 3.6 万+ 篇 SEO 文章的自动化生成、构建与部署。出于 IP 分散和风险隔离的考虑,同一模板的站点会被打散部署在多台物理服务器上。
在海量站点矩阵的场景下,常规的 Web 部署方案会引发严重的资源灾难。我们面临着以下极限挑战:
在确立最终方案前,我们排除了以下在常规业务中完全可行、但在海量矩阵中会导致“成本与存储灾难”的方案:
git pull 拉取最新内容。
.git 历史记录文件夹会迅速膨胀。成千上万个独立仓库的 .git 历史占用空间远超静态网页本身,纯属浪费服务器昂贵的磁盘资源。💡 破局核心思路:抛弃昂贵的“云端全量存储”与“独立代码库管理”,回归最纯粹的 Unix 哲学 —— 本地高频增量构建 + Rsync 差异化推流 + 物理硬链接去重。
系统被划分为四个核心模块,各司其职,将算力与存储成本降到最低:
作为整个系统的指挥中心,部署在内网,不参与具体的业务承载,只负责策略调度。
域名 <-> 服务器 IP <-> 所属模板 ID 的映射关系。2024-05-20 14:35:00)以实现定时发布。site: 收录数据并生成趋势大屏。利用本地机器(或高性能内网服务器)廉价的 CPU 和庞大的存储空间,充当“物理 CI 机”。
$lte: now 逻辑,只打包时间戳早于当前时间的文章。完美实现无数据库状态下的“SEO 定时平滑发布”。for 循环串行。通过 os.cpus() 读取宿主机核心数,结合 p-limit 动态分配并发任务,榨干本地算力。// 本地并发构建脚本示例
import pLimit from 'p-limit';
import os from 'os';
import { exec } from 'child_process';
const coreCount = Math.max(1, os.cpus().length - 2); // 留出 2 个核保证系统稳定
const limit = pLimit(coreCount);
const tasks = sites.map(site => limit(async () => {
await execAsync(`NUXT_SITE_ID=${site.id} npx nuxi generate`);
// 执行 Rsync 同步...
}));
await Promise.all(tasks);
抛弃全量覆盖,通过底层协议优化实现“秒传”。
rsync -az --delete 仅传输变动的数百 KB 文本文件,未变动的 JS/CSS 传输量为 0。--partial --append-verify,无惧网络波动,断网重连后精确从断开的字节继续传输大文件(如图片)。ControlMaster 参数,上千次同步共享后台复用的 SSH 通道,省去海量握手时间,传输速度提升 40% 以上。# Rsync 终极推流命令示例
rsync -az --delete --partial --append-verify \
-e "ssh -o ControlMaster=auto -o ControlPath=~/.ssh/sockets/%r@%h-%p -o ControlPersist=600" \
.output/public/ user@${serverIP}:/www/sites/${domain}/
目标服务器无需安装任何运行环境(Node/Docker),仅需 Nginx 吐出静态文件。
--link-dest):
由于同模板站点被打散在多台服务器,推送具体站点前,先向该服务器推送一份“基础模板库”。
推送站点时附加参数:--link-dest=/www/templates/tpl_A_base/。Rsync 若发现相同文件,直接在服务器硬盘创建物理硬链接。同一服务器上 500 个同模板站点,JS/CSS 物理占用永远只有 1 份!mkfs.ext4 -i 4096 /dev/vdb 提升 Inode 密度,防止“磁盘未满但无法创建新文件”。.conf 的做法。使用正则动态捕获域名并映射目录,新增站点时 Nginx 配置 0 修改,0 Reload。# Nginx 终极动态配置 server { listen 80; # 动态捕获用户访问的域名 (如访问 www.beijing.com, 捕获 beijing.com) server_name ~^(?:www\.)?(?<domain>.+)$; # 动态映射目录:请求全部分发到对应的域名文件夹 root /www/sites/$domain; index index.html; location / { try_files $uri $uri/ /index.html; } # 静态资源强缓存 (配合硬链接威力巨大) location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, max-age=31536000, immutable"; access_log off; } }
nuxi generate,只打包达到发布时间的文章,实现定时发布。结语:此架构在极端的资源与成本约束下,巧妙利用本地算力缓存、Rsync 协议特性、Linux 硬链接机制与 Nginx 泛解析,实现了一套高并发、零停机、极低成本的千万级 SEO 矩阵管控系统。
详细的实现指南、代码示例和配置方案,请参考:实现指南 (IMPLEMENTATION.md)
该文档包含:
仅需一个 Nginx + SSH 的 Docker 环境即可开始测试。请参考:快速开始指南 (QUICKSTART.md)
主要步骤:
docker-compose up -d如需宝塔面板集成版等更多测试方案,请参考:Docker 测试环境搭建指南 (DOCKER_SETUP.md)