# 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-`。