56 lines
3.5 KiB
Markdown
56 lines
3.5 KiB
Markdown
# 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-`。
|
||
|