学完这篇,你能拿到一条可落地的扩容路线:先用数据找准瓶颈,再依次打开缓存、读写分离、任务外置、横向扩展,每一步都知道在 Clara BBS 后台点哪里、配什么参数。
第一步:先量化,不要凭感觉加机器
扩容最怕“我觉得卡了”。先装官方「容量监控」插件,它会每天生成一份容量快照(帖子数、用户数、附件、数据库大小、磁盘占用),并画出增长曲线。更关键的是两个判断依据:
- 阈值进度与外推预估:按当前增速推算还有多久需要升级架构,提前两周准备而不是半夜救火。
- MySQL 慢查询 TOP 榜:依赖 MySQL 慢日志开启,先确认
slow_query_log=ON,否则这个榜是空的。
同时跑一次后台的环境体检,它会把协议层(HTTPS / HTTP2 / TLS / 域名归一)、缓存层、安全层、运行环境(PHP 版本、扩展、目录权限)逐项诊断,未通过项会直接给出“已按当前域名填好、可复制”的 Nginx 片段。
注意:体检报告里的 Nginx 片段是照当前域名生成的,换域名后要重新生成,别复制旧文本。
第二步:单机阶段先把缓存打开
绝大多数“大流量”卡在数据库和重复计算上,而不是 PHP 本身。Clara BBS 内置 Redis / 文件双驱动缓存,后台「系统工具 → 缓存设置」可视化开启 Redis 即可,不改一行代码、不用清缓存,保存即生效。
系统内部榜单、热点数据、外部接口响应都统一走 Cache 层(Cache::remember 一行式调用)。没装 Redis 也能用文件驱动先顶着。
注意:Redis 键带表前缀命名空间,多站共用一个 Redis 实例互不干扰——所以别为了好看去改表前缀。另外 Redis 异常会自动降级文件驱动,业务零感知,但日志里会有记录,别忽略。
第三步:数据库读写分离
单机数据库撑不住读压力时,加从库。Clara BBS 的读写分离是内置的:主库写,单/多从库读,SELECT / SHOW / DESCRIBE / EXPLAIN 自动走从库。
三种场景会强制走主库保证一致性:事务内查询、行锁查询、取自增 ID。你不需要在业务代码里判断。
注意:从库连接失败会静默回退主库并记日志,业务不会报错——这意味着从库挂了你可能毫无感知,只有日志能发现。定期看一眼。
第四步:计划任务外置
流量小时靠前台访问懒触发,零配置、装完就有效。但流量上来后这套逻辑有两个问题:低峰期任务堆积、任务抢占用户请求。
此时改成系统级 crontab 每分钟调用外部入口:
* * * * * curl -s https://你的域名/cron > /dev/null 2>&1
任务用 Cron::register 统一注册,文件锁防并发重跑,运行结果落库可查。
注意:外置入口跑起来后,前台懒触发仍在,两套同时存在不冲突(有文件锁),但流量大的站建议以外置为准。
第五步:多台 Web 横向扩展
单机 CPU 打满后加机器。前置负载均衡,后面挂多台 PHP 节点。要提前解决两件事:
- 附件不要落在单机磁盘。后台「系统设置 → 云存储」接入对象存储,多机共享,扩容时不用同步上传目录。
- 布局和主题。Clara BBS 是单模板响应式,一套视图同时适配手机与桌面,多节点部署时不需要为移动端单独维护一份模板。主题在后台「主题外观」切换,全站即时生效。
注意:多节点时务必确认会话与上传目录不在单机磁盘上,否则会出现“刷新一次掉一次登录”的经典事故。
第六步:别忘爬虫流量
扩容到后面你会发现,AI 爬虫和搜索引擎爬虫吃掉的带宽不比真人少。后台「系统设置 → GEO 优化」可以开关各类爬虫的放行、追加 UA,配合 robots.txt 显式控制;「AI 爬虫访问监控仪表盘」能看到哪个爬虫、什么频率、最近抓了哪些页面。
GEO 输出只含游客可见版块内容,隐藏和权限版块不会外泄,可以放心开。
小结
- 扩容顺序:先监控量化 → 开缓存 → 读写分离 → 任务外置 → 加 Web 节点,不要跳步。
- 缓存开关在「系统工具 → 缓存设置」,读写分离靠加从库配置,都不用改代码。
- 三种场景强行走主库(事务、行锁、取自增 ID),从库失败静默回退,只看日志能发现。
- 流量上来后计划任务必须外置到系统 crontab 调
/cron。
- 加机器之前先把附件挪到云存储,否则多机会踩会话与文件的坑。
- 何时升级用容量监控的外推预估和慢查询 TOP 说话,别拍脑袋。