上线前最后一小时,我靠这张便签纸救回了两条命

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 129 浏览 0 回复

上周帮朋友赶一个后台管理系统上线,本地跑得顺顺当当,传到生产环境直接翻车。不是代码报错,是菜单点不开、权限全乱、配置读的是三天前的缓存。折腾到凌晨两点,我蹲在椅子上写了张便签纸贴显示器边框,现在每次部署前都要过一遍。

一、权限节点:别信你的记忆,信数据库里的 `auth_rule`

ThinkPHP 的权限库我见过两种坑。一种是节点名手滑多打了个下划线,`auth/check` 写成 `auth__check`,菜单能显示但校验永远通不过,用户看着按钮干瞪眼。另一种是父子级缓存没清,新加的子节点在 `auth_rule` 表里有记录,但 `admin_role` 关联的还是旧快照。

我现在习惯上线前跑一条脏 SQL 核对:`SELECT name FROM auth_rule WHERE name NOT IN (SELECT DISTINCT auth_rule FROM 角色关联表)`。有漏网之鱼立刻补,比用户截图骂过来快十倍。

二、路由:hidden 和 menu 是两回事

后台框架常把路由注册和菜单注册绑在一起,容易让人误以为"写了路由就有菜单"。实际上有些页面是纯接口或者弹窗内嵌,需要 `hidden` 标记。上线前我会把路由文件和数据库菜单表做 diff,重点扫两类:一是新加了路由但菜单没注册,用户 404;二是旧菜单挂着但路由已删,点进去白屏。

有次我把一个报表页面从独立路由改成了组件内嵌,忘了删菜单项,测试同事点进去空白一片,以为是我故意做空数据。

三、菜单排序:数字不是给人看的,是给程序排序的

菜单表的 `sort` 字段我见过填 1、2、3 的,也见过填 100、200、300 的。后者是为了中间能插进去。但上线前一定要检查有没有重复的 sort 值,或者某个新模块的 sort 比首页还大,结果跑到最底下找不着。

我的土办法:上线前把菜单按 sort 拉出来看一眼,肉眼扫一遍顺序合不合理,比自动化测试快。

四、配置项:env 文件、数据库、缓存,三层可能各说各话

最阴的坑是配置看起来改了,实际读的是缓存。我现在的顺序是:改 `.env` → 写数据库配置表 → 清缓存 → 再读一遍验证。有些框架的配置页有"立即生效"按钮,背后如果没触发缓存刷新,那就是个安慰剂。

还有域名相关的配置,本地是 `localhost`,测试环境是 IP,生产是正式域名。上线前把 `site_url`、`cdn_domain`、`oss_endpoint` 这三个关键词全局搜一遍,确保没有硬编码的测试地址混进去。上次有个图片上传后返回的 URL 带的是内网 IP,外网用户根本打不开。

五、文件权限:777 是懒,755 是底线,upload 目录要单独看

宝塔一键部署有时候会把 runtime 和 upload 的权限搞得很奇怪。我上线前必查三个目录:`runtime` 要可写(缓存和日志),`public/upload` 要可写且考虑要不要开目录执行权限(有些上传的是 PHP 就危险了),`config` 要只读。

另外 `.env` 文件别留在线上,或者至少加个 `.htaccess` 拒绝访问。我见过直接能 `curl` 下载到数据库密码的站,心脏骤停。

六、最后一条:找个没登录过的浏览器,用普通用户账号走一遍

开发环境常年开着超管权限,很多细粒度控制根本测不出来。上线前我专门备了一个测试账号,权限给得和普通编辑一样,逐个点菜单、试按钮、看有没有不该出现的入口。这条救过我两次,一次是漏配了数据隔离,超管看全部,普通用户直接报错;一次是某个按钮的 `v-if` 写反了,超管看不见,普通人反而能点。

现在那张便签纸还在我显示器上,边角卷了,字也蹭花了。但每次部署前对着勾一遍,心里踏实。你们上线前有什么必查的私货?欢迎补充,我往上加。

评论0
回复 · 0
还没有回复
微信客服 微信客服