虚拟主机CPU占用100导致打不开的一次处理

背景

突然有一天,有个客户网站打不开了,发来这样一张图片

问题排查

打开阿里云虚拟主机控制面板,CPU 使用率已经达到了100%,这说明网站已经在高负荷运转。

分析访问日志发现,网站出现了大量循环路径,其 UserAgent 为某个搜索引擎, 类似这样的访问路径:

复制代码
/index.php/news/product/fuwu/fuwu/fuwu/product/about/product/about/fuwu/about/fuwu/news/product/product/product/product/news/product/product/about/product/product/news/product/news/product/news/news/public/web/js/basic.js?1699501429

这应该可以判断,因为页面中错误的路径输出,导致搜索引擎在爬取时,出现了死循环遍历,最终导致网站 CPU 占满,最终也就导致了 PHP 连接 MySQL 的连接数超限,最终导致网站打不开。

解决方案

确认了问题原因,笔者想到两个解决方案,第一当然是需要排查代码,找到输出内链的地方,一律改用绝对路径, 如 /news/product, 避免出现相对路径,否则则可能出来循环嵌套错误, 如 news/product

假设这个内链出现在首页,则链接正确,但是如果出现在子页,则很容易出现路径循环嵌套,假设某个子页面为 news/detail, 那么使用的相对路径后,这个页面中的内链在搜索引擎看来,就成了 news/detail/news/product, 显然,这不对。

另外一个临时解决方案是,修改配置文件,禁用搜索引擎访问层级过多的页面,一旦访问,服务器返回 404

修改 .htaccess 文件,添加如下内容:

htaccess 复制代码
# 防止路径嵌套过深,如 /search/news/about/news/...(超过4段路径则判定非法)
RewriteCond %{REQUEST_URI} ^/(.+/){4,} [NC]
RewriteRule .* - [R=404,L]

同时,因为网站已经配置了伪静态,所以应该禁止访问 index.php/* 这样的文件

htaccess 复制代码
# 禁止通过 index.php/xxx 的路径访问(返回 404)
RewriteCond %{THE_REQUEST} \s/+index\.php/ [NC]
RewriteRule ^index\.php/ - [R=404,L]

修改完 .htaccess 文件后,重启虚拟主机。

最终,一切回顾了平静:

相关推荐
钟智强1 天前
我警告了 329 天
git·php·wordpress·webshell
从零开始的代码生活_1 天前
Linux 五种 IO 模型详解
linux·服务器·数据库·c++·后端·php
AC赳赳老秦2 天前
防火墙规则批量配置实战:OpenClaw 自动生成模板、批量下发与合规性校验全解析
java·开发语言·人工智能·python·github·php·openclaw
2502_921286072 天前
【企业网络管理】DHCP 与 SAMBA:从协议原理到企业级实战配置全解析
开发语言·php
运维管理2 天前
H3C SecPath W2000-G[AK]系列Web应用防火墙 典型配置举例(E6711 E6712 E6713)-6W108-H3C 官方配置
服务器·网络·php
techdashen2 天前
kTLS 进入 rustls 组织:把 TLS 的数据面交给内核
开发语言·php
Web极客码2 天前
在WordPress Multisite中添加超级管理员用户
服务器·php·网站
漂亮的摩托2 天前
深感一无所长,准备试着从零开始写个富文本编辑器
开发语言·php
火星校尉2 天前
一场数据基建与消费场景的跨界实验
java·前端·数据库·python·php