本来这个网站觉得基本没人用,干脆没配置WAF什么的。但前几天晚上网站突然变得很慢,接着干脆打不开了。上 CDN 控制台一看,短短 4 分钟里进来了 3.3 万次请求,而站点平时一整天才 1.5 万次左右。
看了下请求数,五分钟就请求上万次,关了一会又重启,还变本加厉了。
排查了下源站,问题很快就找到了,而且是两个叠在一起:
一是 PHP-FPM 的并发只有 10(pm.max_children = 10),而且 request_terminate_timeout = 0,慢请求不会超时释放;
二是根本没装 OPcache,每个请求都要把整个 Laravel 重新编译一遍。
当时测出的结果是这样的:
而且站点的错误日志里全是 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。
再优化下限速
我网站用的EO个人版,只支持单个匹配条件(Host),没法叠加路径条件,所以只能分两层来做:
1.CDN 做下速率限制:
2.源站直接用1panel做WAF
然后自己又测了下限速结果:
当然这些配置都是针对我网站的,不要照抄到你的网站 出事了我不管
总结
-
不管什么网站都要做WAF,根据预期请求量做
-
php网站支持OPcache就装OPcache(其实之前用过OpenLiteSpeed,效果比这个还好,基本不改配置的情况下 2-2小水管挂Flarum能抗50多qps)