记一次网站遭遇高频请求和解决办法

作者:ideafox 发布时间: 2026-10-12 阅读量:9

本来这个网站觉得基本没人用,干脆没配置WAF什么的。但前几天晚上网站突然变得很慢,接着干脆打不开了。上 CDN 控制台一看,短短 4 分钟里进来了 3.3 万次请求,而站点平时一整天才 1.5 万次左右。

看了下请求数,五分钟就请求上万次,关了一会又重启,还变本加厉了。

排查了下源站,问题很快就找到了,而且是两个叠在一起:

一是 PHP-FPM 的并发只有 10(pm.max_children = 10),而且 request_terminate_timeout = 0,慢请求不会超时释放;

二是根本没装 OPcache,每个请求都要把整个 Laravel 重新编译一遍。

当时测出的结果是这样的:

目标 QPS

p50

p95

源站 CPU

PHP CPU

20

402 ms

754 ms

44–50%

45–100%

30

901 ms

1383 ms

51–76%

124–162%

40

4245 ms

7735 ms

45–71%

166–260%

60

11429 ms

20543 ms

100%

405–475%

137.5

大量 524 / 554,站点直接打不开

而且站点的错误日志里全是 upstream prematurely closed connection while reading response header from upstream ,PHP 被打满。

先优化PHP吧

看了下我的php站,支持装OPcache。

先把 OPcache 装上,然后调几个参数:

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=60

这里 validate_timestamps 特意设成 1 加 60 秒 —— 这样以后改代码或者更新插件不用每次都重启 PHP-FPM,60 秒内会自动感知文件变更。

接着把 FPM 的池子调大一点:

pm.max_children = 16
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500
request_terminate_timeout = 30s

再顺手把 php.ini 里几个值和 Laravel 的配置缓存一起处理掉:

memory_limit = 192M
realpath_cache_size = 4096k
realpath_cache_ttl = 600

# 生成配置缓存
php artisan config:cache

优化完成后又测了一次:

OPcache 命中率稳定在 100%(缓存了 872 个脚本、占用 32.5 MB),源站本地单请求从 900 ~ 1400 ms 直接降到 32 ms。

目标 QPS

优化前 p50 / p95

优化后 p50 / p95

优化前 PHP CPU

优化后 PHP CPU

20

402 / 754 ms

148 / 221 ms

45–100%

5–19%

40

4245 / 7735 ms

147 / 231 ms

166–260%

21–36%

60

11429 / 20543 ms

150 / 402 ms

405–475%

55–72%

80

—

177 / 356 ms

—

66–180%

再优化下限速

我网站用的EO个人版,只支持单个匹配条件(Host),没法叠加路径条件,所以只能分两层来做:

1.CDN 做下速率限制:

2.源站直接用1panel做WAF

然后自己又测了下限速结果:

场景

结果

4 / 8 / 12 / 16 QPS 各跑 15 秒

0 失败,p50 129–154 ms

24 QPS

触发封禁(403 + 连接重置,约第 150 个请求)

案发速率 138 QPS

0.565 秒被拦截并封禁 10 分钟

被封对象

真实客户端 IP(不是 CDN 回源节点)

站点本身

不受影响

当然这些配置都是针对我网站的,不要照抄到你的网站 出事了我不管

总结

  • 不管什么网站都要做WAF,根据预期请求量做

  • php网站支持OPcache就装OPcache(其实之前用过OpenLiteSpeed,效果比这个还好,基本不改配置的情况下 2-2小水管挂Flarum能抗50多qps)