评估nginx+php-fpm最大并发能力需整体验证请求链路,关键在于真实负载下的稳定性、响应可控性与失败率;瓶颈依次为php-fpm的pm.max_children不足、nginx连接耗尽、系统级限制及后端服务(mysql/redis)打满。

明确压测目标和链路瓶颈点
整个请求路径是:客户端 → Nginx(接收+转发)→ PHP-FPM(执行脚本)→ 后端服务(MySQL/Redis/API)→ 返回。系统最大并发由最弱一环决定。常见瓶颈依次是:
- PHP-FPM 的 pm.max_children 不足,导致请求排队(看
pm.status中的processes in state: idle / running / starting / finishing / cleanup和queue length) - Nginx 的 worker_connections × worker_processes 耗尽,出现
accept() failed (24: Too many open files) - 操作系统级限制:文件描述符(
ulimit -n)、本地端口范围(net.ipv4.ip_local_port_range)、连接队列(net.core.somaxconn) - 后端数据库连接池打满、慢查询堆积、Redis 连接拒绝等
分阶段压测:从配置核查到阶梯加压
跳过理论估算直接压测容易误判。建议按顺序推进:
-
先查基础配置:确认
worker_processes auto、worker_connections≥ 10240、worker_rlimit_nofile与系统ulimit -n一致(建议 ≥ 65535);PHP-FPM 的pm = dynamic,pm.max_children设置合理(如 4 核机器设为 50–100) -
用 wrk 做长连接稳态压测:例如
wrk -t8 -c1000 -d60s --latency http://domain/api/test,观察 QPS 是否稳定、95% 延时是否突增、错误率是否上升。注意启用 keep-alive,更贴近真实用户行为 - 阶梯式加压定位拐点:从 200 并发开始,每 30 秒加 200,直到错误率 > 3% 或平均延时翻倍。记录此时的并发连接数、QPS、PHP-FPM 队列长度、MySQL 线程数等指标
-
对比短连接压测(ab)补全视角:运行
ab -n 50000 -c 2000 -k http://domain/api/test,重点看Failed requests和Time per request (mean)。若失败集中在 Connection refused 或 Timeout,说明是连接层或 FPM 接收能力问题
必须监控的进程级与服务级指标
光看 QPS 和延时不够,得把请求落到具体进程上归因:
- Nginx 日志中加入
$pid和$request_time,用awk '{print $1}' access.log | sort | uniq -c | sort -nr查各 worker 处理请求数是否均衡;不均衡说明 CPU 绑定或负载分发异常 - 开启
stub_status,实时看Active connections、Writing(写响应中)、Waiting(keepalive 空闲连接)比例。若Waiting持续占 80% 以上,说明连接复用充分,瓶颈大概率在后端 - PHP-FPM 开启
pm.status_path = /status,访问该接口查看start time、start since、accepted conn、listen queue len。队列长度持续 > 0 是明确的 FPM 处理不过来信号 - 用
mysqladmin proc stat或SHOW PROCESSLIST观察数据库活跃线程是否卡住;redis-cli info | grep connected_clients看 Redis 连接是否耗尽
调优后重新验证的关键动作
每次调整参数后,必须重跑相同压测场景,而非仅看单次结果:
- 调大
pm.max_children后,观察内存占用是否线性增长,避免 OOM Kill - 启用
opcache.enable=1和opcache.validate_timestamps=0后,对比相同请求的request_time缩减幅度 - 改用 Unix socket(
fastcgi_pass unix:/run/php/php8.2-fpm.sock)替代 TCP 后,检查 Nginx error log 是否还有connect() to ... failed (111: Connection refused) - 增加
fastcgi_read_timeout和fastcgi_send_timeout前,先确认是 PHP 执行超时还是网络传输慢——可通过 PHP-FPM 的slowlog定位真正慢的脚本
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











