Files
kefu/im/bchongw首页修复记录-2026-09-02.md
2026-09-03 08:38:17 +08:00

3.5 KiB
Raw Permalink Blame History

bchongw 首页故障修复记录

日期:2026-09-02
生产服务器:47.106.181.28

修复结果

https://www.bchongw.com/ 与 https://m.bchongw.com/ 已恢复正常访问。桌面站和移动站均通过服务器本机请求与外网请求验证。

故障原因

  1. 桌面站首页静态缓存文件为 0 字节,Nginx 因此返回 HTTP 200,但页面没有内容。
  2. 移动站首页缓存缺失,重新渲染时会调用站内下载数据接口。该接口通过公网域名回连本机,受到连接数限制与 WAF CC 计数影响,连接被重置后异常没有被兜底,ThinkPHP 最终返回 404。
  3. 两个站点关闭了 ThinkPHP 模板缓存,每次请求都重复编译模板,放大了 PHP 与 MySQL 压力。
  4. PHP 5.6 同时加载旧版 Zend Guard Loader,以及不适用于 Linux 的 Windows .dll 扩展配置,进程在压力下出现 SIGBUS 崩溃。
  5. 桌面站首页模板包含三处 ORDER BY RAND() 型随机查询,会导致数据库额外排序和临时表开销。
  6. 防火墙的 80/443 连接数限制没有排除环回接口,站点自己的接口调用也可能被当作外部高并发连接拒绝。

已实施的改动

  • 为桌面站和移动站启用 ThinkPHP 模板缓存,并重建首页、模板及运行时缓存。
  • 将移动站站点地址修正为 HTTPS。
  • 将桌面站首页三处随机排序改为按发布时间倒序,避免全表随机排序。
  • 重写两个站点的 ff_mysql_down() 站内调用:域名仅在本机解析到 127.0.0.1,增加连接/总超时,检查 HTTP 与 JSON 结果,并在接口异常时返回空数组,避免拖垮整个首页。
  • 禁用 PHP 5.6 中无效的 Windows .dll 配置及旧 Zend Guard Loader;保留已经编译进 PHP 的 curl、gd、mysql、mysqli、pdo_mysql 模块。
  • 扫描 7 个站点约 1.16 万个 PHP 文件,没有发现依赖 Zend Guard 或 ionCube 的加密代码。
  • 为所有共用 PHP 5.6 的相关 ThinkPHP 站点启用模板缓存,随后完成并发访问验证。
  • 在运行时 iptables 和 firewalld 永久规则中增加环回接口放行;外部 IP 的连接数限制保持不变。
  • 在宝塔免费 WAF 中仅精确放行 127.0.0.1 和服务器自身公网 IP,并清除旧的 CC 临时封锁;普通访客继续经过全部 WAF 规则。

本次首页故障没有通过盲目增加数据库索引处理,因为故障链路的直接原因是空缓存、模板重复编译、随机排序、PHP 崩溃及本机回连被限流。

最终验证

检查项 结果
桌面站首页(外网) HTTP 200,72,343 字节,约 0.22 秒
移动站首页(外网) HTTP 200,28,724 字节,约 0.19 秒
桌面站首页(服务器本机) HTTP 200,72,343 字节,约 0.02 秒
移动站首页(服务器本机) HTTP 200,28,724 字节,约 0.03 秒
桌面站站内接口 HTTP 200
移动站站内接口 HTTP 200
Nginx 配置检查及平滑重载 通过
WAF SQL 注入探针 HTTP 403,仍被拦截
PHP 5.6 FPM 正常运行;08:48:01 后未再记录 SIGBUS
环回防火墙规则 运行时规则存在,永久规则已写入

验证时服务器负载为 2.58 / 2.54 / 2.48,可用内存约 2,049 MB。

回滚备份

  • 首页与应用改造:/www/backup/bchongw-home-fix-20260902-083204
  • WAF 白名单修改:/www/backup/waf-local-whitelist-20260902-085445
  • PHP 5.6、模板缓存和防火墙改动的备份均保存在 /www/backup/,目录名前缀分别为 php56-loader-fix-、php56-template-cache-fix-、firewall-loopback-fix-。