虚拟主机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 文件后,重启虚拟主机。

最终,一切回顾了平静:

相关推荐
Q_Q5110082851 小时前
python+django/flask的眼科患者随访管理系统 AI智能模型
spring boot·python·django·flask·node.js·php
JavaEdge.2 小时前
Cursor 2.0 扩展 Composer 功能,助力上下文感知式开发
php·composer
Q_Q5110082853 小时前
python+django/flask的在线学习系统的设计与实现 积分兑换礼物
spring boot·python·django·flask·node.js·php
Q_Q5110082854 小时前
python+django/flask的车辆尾气检测排放系统-可视化大屏展示
spring boot·python·django·flask·node.js·php
2501_915106325 小时前
App HTTPS 抓包 工程化排查与工具组合实战
网络协议·ios·小程序·https·uni-app·php·iphone
Q_Q19632884757 小时前
python+django/flask基于Echarts+Python的图书零售监测系统设计与实现(带大屏)
spring boot·python·django·flask·node.js·php
Q_Q51100828510 小时前
python+django/flask的莱元元电商数据分析系统_电商销量预测
spring boot·python·django·flask·node.js·php
普普通通的南瓜10 小时前
共筑网络安全,守护绿色家园
安全·web安全·php
Q_Q196328847512 小时前
python+django/flask基于协同过滤算法的理财产品推荐系统
spring boot·python·django·flask·node.js·php
BingoGo14 小时前
从零开始打造 Laravel 扩展包:开发、测试到发布完整指南
后端·php