CASE STUDY

Judo Battle 门户高负载基础设施

Next.js SSR + Strapi 支撑 15,000 并发连接:三节点架构、Varnish 缓存、PM2 集群与自动 CI/CD。

项目概述

体育门户,前端较重:Next.js SSR、24 个 JS chunk、动态内容与 Strapi CMS。目标是在赛事高峰承受 15,000 并发连接且用户无感知降级。我们将单体拆分为隔离节点,构建智能缓存,并通过压测验证 KPI。

从单体到隔离架构

之前

Nginx、前端、后端和数据库在同一台服务器。Next.js SSR 处理每个请求——15,000 连接时 CPU 100%,Strapi 单线程,管理员会话中断,SSH 暴露于暴力破解。

之后

私有网络 172.16.0.0/28 上三个独立节点:Proxy(Nginx + Varnish,12 GB 缓存)、Frontend(PM2 集群,8 个 Next.js 实例)、Backend(4 个 Strapi 实例)。外部仅见 443 端口。部署、SSL 与日志轮转全自动。

解决方案架构

HighLoad stress test results
Proxy 服务器

Nginx + Varnish 自定义 VCL。静态资源缓存 1 年,SEO 页面 10 分钟(含语言 cookie)。RSC、prefetch 和 API 绕过缓存。Grace mode 在后端故障时最多 1 小时提供陈旧页面。


Nginx
Varnish
Custom VCL
Let's Encrypt
12 GB RAM cache
Frontend (Next.js)

PM2 集群模式占满所有 CPU 核心(8 实例)。Cron CI/CD:备份、git pull、build、通过 pm2safe 安全重启。max_memory_restart: 1G,日志 5 MB 轮转。


Next.js SSR
PM2 Cluster
Bash CI/CD
ACL pm2safe
Auto log rotation
Backend (Strapi)

4 实例集群,端口 1337–1340(STRAPI_WEB_CONCURRENCY: 2)。管理面板固定 1337 以保持会话,公共 API 负载均衡。systemd 在重启后自动恢复。


Strapi
PostgreSQL
PM2 × 4
Nginx LB
systemd

关键方案

  • 智能 Varnish 缓存

    24 个 JS chunk 与静态资源 immutable 缓存 1 年。SEO 内容(新闻、选手、俱乐部)10 分钟。Next.js 动态与后台绕过缓存,保持交互与认证。

  • 自主 CI/CD

    脚本每 5 分钟轮询 GitHub。新提交 → tar.gz 备份 → npm install → build → 安全 PM2 重启。用户无感知更新。

  • PM2 集群

    8 个 Next.js + 4 个 Strapi 实例,内存泄漏自动重启(1G / 2G)。单节点故障不影响服务。

  • 封闭网络

    所有服务器默认关闭 SSH(22)。仅通过服务商控制台或临时脚本访问。内网隔离——外部仅见 Proxy。

  • SSL 自动续期

    Proxy 上 Certbot systemd 定时器(每周日)。Backend 上 bash 脚本 standalone 模式更新。RandomizedDelaySec 避免 Let's Encrypt 峰值。

  • Grace mode 与自愈

    后端故障或延迟时 Varnish 再提供缓存页面 1 小时——用户不见 502/504。PM2 与 systemd 自动恢复进程。

  • 压测结果

    Apache Bench:15,000 并发连接,100,000 请求,重型 SSR 站点。项目 KPI 达成且有余量。

    15,000+

    并发连接无故障

    100,000

    单次运行请求数

    ≤ 25%

    峰值 Proxy CPU

    1–3%

    Frontend/Backend CPU(缓存生效)

    ≤ 6 GB

    稳态每台机器 RAM

    0

    用户侧 502/504(grace mode)


    瓶颈: 限制来自物理带宽(约 1 Gbps),而非软件。信道饱和后出现 TLS 错误与超时——CPU 与 RAM 仍有大量余量。

    [ Cases.Related.services_title ]

    [ Cases.Related.cases_title ]

    希望您的企业获得同样的结果吗?

    让我们讨论您的项目并确定关键增长点。
    讨论我的项目