“apr_socket_connect(): 由于目标计算机积极拒绝,无法连接”表明apache未监听或未启动,需先检查服务状态、端口占用及配置语法,再按需调整threadsperchild等mpm参数并重启服务。

ab命令执行失败:apr_socket_connect() 拒绝连接
直接报 apr_socket_connect(): 由于目标计算机积极拒绝,无法连接。 (730061),基本等于 Apache 根本没在监听或压根没启动。不是 ab 的问题,是服务端卡住了。
先确认 Apache 是否运行:httpd -t 检查配置语法;netstat -ano | findstr :80(Windows)或 lsof -i :80(macOS/Linux)看 80 端口是否被 httpd 或 apache2 占用。
- 若端口空闲 → 启动 XAMPP 控制面板,手动 Start Apache
- 若端口被占用 → 查 PID,用任务管理器或
taskkill /PID xxx /F杀掉冲突进程(常见是 Skype、IIS、其他 Web 服务) - 若 Apache 启动失败 → 查
xampp\apache\logs\error.log,重点看最后一行错误,常因端口冲突、httpd.conf中Listen配置错误或模块加载失败
并发数(-c)设太高,Apache 直接崩或大量失败
ab -c 2000 在默认 XAMPP 配置下几乎必挂。Windows 下 Apache 的 MPM 是 mpm_winnt_module,默认 ThreadsPerChild 150,意味着最多同时处理 150 个请求——超过就排队或拒绝。
修改前先停 Apache,再编辑 xampp\apache\conf\extra\httpd-mpm.conf:
- 找到
<ifmodule mpm_winnt_module></ifmodule>块 - 把
ThreadsPerChild改成 512(Windows 下上限是 1920,但别一上来就拉满,先试 512) - 顺手把
MaxRequestsPerChild设为 0(避免子进程频繁重启影响测试稳定性) - 保存后重启 Apache
注意:改完不重启 = 白改;改太大(比如 1500)可能触发系统资源限制(句柄数、内存),反而更不稳定。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
测试结果里 Failed requests > 0,但不是代码问题
看到 Failed requests: 42 别急着查 PHP 逻辑。ab 的失败绝大多数来自底层连接异常,典型原因有:
-
Connection reset by peer (54)→ Apache 主动断连,说明并发超限或响应超时(TimeOut默认 300 秒,但高并发下可能提前 kill) -
socket: Too many open files (24)→ 系统文件描述符耗尽(Linux/macOS 常见,Windows 较少) -
Non-2xx responses: 100→ 后端返回了 503、408 等状态码,说明 Apache 已经扛不住,开始丢请求
这时要回头调低 -c,比如从 500 降到 200,观察 Failed requests 是否归零;再逐步加压,找到当前配置下的真实瓶颈点。
Requests per second 数值飘忽,怎么才算靠谱
Requests per second: 807.97 [#/sec] (mean) 这个值受太多变量干扰:网络延迟、PHP 扩展加载、磁盘 I/O、甚至你后台开着 Chrome 下载电影。单次测试参考价值有限。
- 至少跑 3 轮相同参数(
ab -n 5000 -c 100 url),取Requests per second的中位数 - 对比优化效果时,必须固定硬件、系统负载、XAMPP 版本、PHP.ini 配置(尤其
opcache.enable和memory_limit) - 关注
Time per request(均值)和Percentage of the requests served within a certain time (ms)分布 —— 比如 95% 请求
真正容易被忽略的是:ab 测试的是「单路径、无状态、无登录态」的裸 HTTP 请求。它测不出 Session 锁、数据库连接池争抢、Redis 连接打满这些真实瓶颈。测完 ab,下一步该上 JMeter 或 wrk 模拟带 Cookie、多步骤的链路了。










