3.5 KiB
3.5 KiB
bchongw 首页故障修复记录
日期:2026-09-02
生产服务器:47.106.181.28
修复结果
https://www.bchongw.com/ 与 https://m.bchongw.com/ 已恢复正常访问。桌面站和移动站均通过服务器本机请求与外网请求验证。
故障原因
- 桌面站首页静态缓存文件为 0 字节,Nginx 因此返回 HTTP 200,但页面没有内容。
- 移动站首页缓存缺失,重新渲染时会调用站内下载数据接口。该接口通过公网域名回连本机,受到连接数限制与 WAF CC 计数影响,连接被重置后异常没有被兜底,ThinkPHP 最终返回 404。
- 两个站点关闭了 ThinkPHP 模板缓存,每次请求都重复编译模板,放大了 PHP 与 MySQL 压力。
- PHP 5.6 同时加载旧版 Zend Guard Loader,以及不适用于 Linux 的 Windows
.dll扩展配置,进程在压力下出现SIGBUS崩溃。 - 桌面站首页模板包含三处
ORDER BY RAND()型随机查询,会导致数据库额外排序和临时表开销。 - 防火墙的 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-。