尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Wiki.js 性能优化完整复盘:我们把 2.9 秒首屏压到 0.8 秒
Wiki.js 性能优化完整复盘我们把 2.9 秒首屏压到 0.8 秒【免费下载链接】wiki-Wiki.js | A modern and powerful wiki app built on Node.js项目地址: https://gitcode.com/GitHub_Trending/wiki78/wiki-这是我们一次 Wiki.js 性能优化的完整复盘。Wiki.js 是基于 Node.js 的知识库应用团队部署给五十多号人用之后投诉开始变多首屏转圈两三秒、保存完长文档要干等、周一早高峰 CPU 拉满。第一反应我们怀疑是磁盘 I/O把整块盘换成了企业级 NVMe——换完之后首屏还是 2.9 秒分毫不差。 自查支持群里三个慢的抱怨把投诉原文整理成症状清单每条都带复现场景打开首页要等 3 秒——新人用新电脑、或者清完缓存后第一次打开内网 wiki首页要转圈两秒多保存长文档要盯转圈——编辑 5000 字的文档CtrlS 之后还要等 2~3 秒才算真正保存完早高峰服务器快冒烟——周一上午九点几十人同时刷文档单 Node 进程 CPU 能贴 90% 以上持续 5 分钟。 化验单Network 面板和日志不撒谎换盘救不了说明锅不在 I/O。接下来一周我们只做一件事取证。浏览器 Network 面板、服务端日志、SQL 日志三路并行三条症状各拿到一份证据症状 1 → 证据主 JS 包 2.4MB没开压缩且反代默认返回Cache-Control: no-cache。老用户每次刷新都要重新拉一遍re-request 耗时实测 1.8 秒。根因该缓存的没缓存、该压缩的没压缩。症状 2 → 证据每个匿名请求都在完整跑一遍 server/jobs/render-page.js 里的渲染管线renderer 串联 cheerio 解析目录单页平均 380ms再看 server/core/cache.jsnew NodeCache()没传任何参数——缓存键永不过期内存只进不出一个月后缓存常驻已经涨到 480MB。根因重复劳动 没有 TTL 的缓存。症状 3 → 证据在 server/app/data.yml 的 flags 里打开sqllog跑了一天SQL 日志显示高峰期数据库连接数打满后请求开始排队接口 p95 到 1.6 秒。根因config.sample.yml 里pool的 min/max 默认是注释掉的走的保守默认值。 处方四个位置从便宜到贵浏览器侧一行配置让/_assets/缓存一年Wiki.js 的前端产物输出到/_assets/文件名带时间戳见 dev/webpack/webpack.prod.js 的filename拼接${now}内容变 URL 必变天生适合长缓存。反代只加 6 行gzip on; gzip_types text/css application/javascript application/json image/svgxml; location /_assets/ { expires 1y; add_header Cache-Control public, immutable; }作用文本类资源压缩后走一年强缓存文件名不变就直接复用本地副本。实测静态资源传输体积降约七成老用户二次访问资源请求从 24 个掉到 1 个。成本纯 Nginx 配置不改代码、不重启、不重新打包。反向代理侧匿名 GET 加页面缓存登录态坚决不碰静态资源缓存到位后页面 HTML 每次还是走完整渲染管线。对匿名读者来说这是白算的我们在 Nginx 加一层 HTML 缓存proxy_cache_path /var/cache/wiki keys_zonewiki:10m max_size1g inactive60m; location / { proxy_cache wiki; proxy_cache_valid 200 10m; # 仅匿名 GET 生效请求带鉴权 Cookie 时不启用 proxy_cache }作用匿名页面 10 分钟内命中缓存直接吐 HTML渲染管线完全绕开。实测匿名页面 p95 从 1.1 秒降到 0.3 秒单页 380ms 的渲染开销命中时归零。红线提醒登录态页面必须排除权限不同的用户一旦串了缓存就是安全事故。成本Nginx 配置 reload。服务侧给 NodeCache 补 TTL连接池别再排队内存缓存这行改动只有一行把 server/core/cache.js 里的new NodeCache()改成return new NodeCache({ stdTTL: 600, checkperiod: 120 })作用缓存键 10 分钟自动过期NodeCache 每 2 分钟清一次过期垃圾。缓存常驻内存从 480MB 回落到 170MB 并稳住相当于给只进不出的垃圾桶装了定时清运。成本1 行代码重启生效。连接池在 config.sample.yml 的pool段取消注释pool: min: 2 max: 8作用连接池就像两车道的桥默认太窄高峰期全在桥头排队。改完重启高峰接口 p95 从 1.6 秒降到 0.5 秒。成本2 行配置。另外sqllog这个开关定位完慢查询就关掉日志太吵生产常开等于让引擎舱一直录音。构建侧vendor 独立成 chunk时区表收紧配置层的便宜占完最后动构建。dev/webpack/webpack.prod.js 里splitChunks默认参数偏保守改成显式把 node_modules 归入独立 vendoroptimization: { splitChunks: { chunks: all, cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: vendor, priority: 10 } } } }作用vendor 包几乎不动长缓存命中率极高应用代码更新时只有小块需要重下。主包从 2.4MB 瘦到 1.5MB。顺带把MomentTimezoneDataPlugin的startYear/endYear从 2017 到 2031 收紧到 2024 到 2028又省约 120KB。编辑器这类重组件本来就已做成动态 import见 client/client-app.js 里Editor的import()保持这个懒加载模式别动它就行。构建时间也从 9 分 20 秒降到 4 分 40 秒——前提是别让.webpack-cache增量缓存被清理脚本误删。成本需要重新打包发布一次。 复查报告前后对比与验证方法指标优化前优化后平均首屏2.9 秒0.8 秒老用户二次访问资源请求24 个 / 约 1.9MB1 个仅 HTML高峰接口 p951.6 秒0.5 秒匿名页面 p951.1 秒0.3 秒缓存常驻内存480MB 且持续增长稳定在 170MB主 JS 包体积2.4MB1.4MB构建耗时9 分 20 秒4 分 40 秒怎么确认优化真的生效浏览器 Performance 面板录一次完整加载看瀑布图Lighthouse 跑性能分服务端开响应耗时日志盯 p95 一条线最后用压测工具打 300 并发持续 60 秒看吞吐和错误率没劣化。四道都过才允许把sqllog关掉收工。️ 走过的弯路回滚掉的五个优化全量开 Gzip 连图片一起压二进制压不动还吃 CPU回滚只压文本类页面缓存 TTL 拉到 1 小时编辑完文档一小时里全是旧版本回滚成 10 分钟 保存时主动失效chunk 拆得过碎HTTP/1.1 下请求数爆炸首屏反而慢 0.3 秒合并回去登录态页面也缓存两个权限不同的用户互相看到对方内容当天回滚只留匿名 GET无脑加实例4 个容器共享一个库各自内存缓存各管各的卡顿依旧——多实例必须把 config.sample.yml 的ha标志打开。日常保养药之后的三件小事缓存短 TTL 是底线内容保存后主动失效兜底sqllog生产保持关闭靠 p95 和缓存命中率两条监控曲线代替人肉盯日志每次重新打包后确认/_assets/文件名时间戳变了老用户才会拿到新包。⏱️ 如果只有十分钟最值的三件事按成本从低到高排反代给/_assets/加 Gzip 和一年长缓存——6 行配置不重启十分钟见效config.sample.yml 里把pool的 min/max 打开——2 行配置重启生效server/core/cache.js 给NodeCache补上stdTTL和checkperiod——1 行代码重启生效。性能优化是小步快跑先用配置层拿回可见的正反馈再深入缓存和构建全程用数据说话、用日志定位最后守住登录态缓存这条安全线。照这个节奏Wiki.js 完全可以从能用变成好用。【免费下载链接】wiki-Wiki.js | A modern and powerful wiki app built on Node.js项目地址: https://gitcode.com/GitHub_Trending/wiki78/wiki-创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

AHP层次分析法:从多准则决策到数学建模的实战指南

AHP层次分析法:从多准则决策到数学建模的实战指南

1. 从“拍脑袋”到“算出来”:为什么我们需要AHP在项目评审、方案选择、甚至是个人职业规划这些场景里,我们常常面临一个难题:如何从一堆各有优劣的选项中,做出一个“科学”的、能说服自己也能说服他人的决策?过去&…

📅 2026/10/12 11:28:45
闭环式·可交互·强关联:运营商数据安全监测平台最佳实践指南

闭环式·可交互·强关联:运营商数据安全监测平台最佳实践指南

一、概要:数据化驱动闭环治理,落地可交互关联安全体系【提示】本段立足行业数字化全局,凝练平台核心技术特性与落地成效,明确技术适配性与行业定位。通信行业5G、物联网、算力网络规模化落地后,运营商数据呈现海量、多…

📅 2026/10/12 9:41:36
三步上手的 FanControl:Windows 风扇控制与温控曲线完整指南(免费)

三步上手的 FanControl:Windows 风扇控制与温控曲线完整指南(免费)

三步上手的 FanControl:Windows 风扇控制与温控曲线完整指南(免费) 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: http…

📅 2026/10/13 13:54:21
MORE NEWS

更多资讯

📰

PS5通用优化方案:截图、串流、存储与网络设置全指南

起这个项目标题的时候,其实没什么正式文档。当时就是一帮PS5玩家在社群里抱怨:光驱版、数字版、初版、新版,系统界面明明看着差不多,可一到具体操作,各种细节对不上。有人截图导出偏色,有人外接硬盘反复报错…

📰

基于MATLAB矩量法的电磁散射RCS计算与三维扩展

雷达目标识别、隐身外形评估、天线耦合分析,这些工程问题绕来绕去都离不开一个核心参数:目标的雷达散射截面(RCS)。而电磁散射特性计算,就是从目标的几何和材料参数出发,把不同频点、不同极化、不同姿态角下…

📰

WordPress高并发架构实战:LNMP环境与三层缓存策略解析

经常有人问我:一个游戏资讯类站点,光靠一台服务器加一个开源的建站程序,能不能撑起每天几万人的访问?我的回答是,能,但前提是你得把后端架构吃透。今天这篇不讲虚的,就从一个实际跑过的项目切入…

📰

SDD驱动的AI工程开发:用契约重构编程思维

1. 项目概述:这不是又一个“AI编程课”,而是一次工程级开发思维的现场重构“Vibe Coding”这个词最近在开发者社区里频繁出现,但它从来不是指某种具体技术,而是一种状态——当人与工具、需求与实现、思考与输出之间形成高频共振时…

📰

KUKA机器人EtherNet/IP直连工业相机:配置、坐标映射与避坑指南

简介:这份文档面向工业自动化工程师与机器人调试人员,聚焦KUKA机器人通过EtherNet/IP协议与OMRON工业相机建立通信的完整配置实例,适合已具备一定KRC4与现场总线基础、需要落地视觉引导项目的技术人员参考。资源包内共1个docx文件&#xff0c…

📰

ffdec-18.5.0深度指南:SWF反编译、AS3反混淆与Flash遗产抢救

简介:FFDec 18.5.0 是一款开源、跨平台的 Flash SWF 文件反编译与分析工具,专为开发者、逆向工程师及数字遗产维护者设计,用于解析已停止支持的 Flash 内容,解决 SWF 结构理解、ActionScript 代码还原、资源提取与历史项目迁移等核…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬