常见问题排查:502、空白页与缓存

按“进程 → 数据库 → 反向代理 → 主题/缓存”的顺序快速定位。

排查线上问题时,先确认请求走到了哪一层,再逐层缩小范围,比反复重启服务更有效。

第一步:进程是否活着

ss -lntp | grep 23180
ps -eo pid,ppid,user,cmd | grep 'cms serve'
curl -i http://127.0.0.1:23180/health/live

本地健康检查都失败时,问题在应用或数据库;本地正常而域名 502,问题在 Nginx 或上游代理。

第二步:数据库(SQLite / MySQL)

ls -lh storage/database/djm.sqlite
ls -ld storage/database
export DJM_CONFIG=$PWD/shared/configs/app.yaml
./current/bin/cms doctor

使用 MySQL 时,改为检查连接串、数据库服务和账号权限。SQLite 模式下 doctor 会检查连接、目录权限、主题与插件状态。SQLite 模式下它仍会输出 MySQL 专用的 information_schema 迁移警告,这是检查器尚未适配 SQLite,不代表站点异常;以 /health/ready 和实际写入为准。常见原因还有数据库目录不存在、运行用户不是 www,或者同时启动了多个 CMS 进程导致 database is locked。

第三步:反向代理

nginx -t
tail -f /www/wwwlogs/站点.error.log
curl -I -H 'Host: cms.example.com' http://127.0.0.1/

确认 proxy_pass 端口、证书路径和 Host 头。开启了 CDN 时,还要检查回源地址与回源 Host。

第四步:主题与缓存

  • 页面白屏或 500:执行 cms theme validate --source shared/themes/当前主题,检查标签和资源引用。
  • 改了模板但不生效:确认改的是 shared/themes 而不是旧版本目录,并清理浏览器/CDN 缓存。
  • 发布后列表没更新:页面缓存最多 5 分钟自然过期;多实例部署会在几秒内广播失效。
  • 搜索没有结果:执行 cms search reindex 重建索引,或确认后台搜索模式。

其他常见提示

现象优先检查
invalid plugin secret keyauth.identity_hash_key 是否为 Base64 的 32 字节
unable to open database fileSQLite 目录是否存在、www 用户是否有写权限
database is locked是否重复启动进程,或使用了不支持的并发写入方式
管理员密码文件被拒绝密码文件权限必须为 0600
License Cloud 502本地无法访问 Cloud 时的环境问题,不影响社区版使用
后台入口 404确认 admin_path 与访问地址一致,并带末尾斜杠

收集信息

提交问题前,请准备:CMS 版本、部署方式、doctor 输出、相关时间段的错误日志、请求的 X-Request-Id。这些信息能显著缩短定位时间。

继续阅读

讨论