ListenBacklog控制Apache监听套接字的内核级“已完成连接队列”长度,三次握手完成后连接入队等待accept();队列满时内核丢弃ACK,导致客户端Connection refused或超时,而非502/504错误。
apache http server 的端口监听连接队列(即“已完成连接队列”,accept queue)是高并发场景下容易被忽略但影响显著的一环。它不决定 apache 能处理多少请求,而是决定新 tcp 连接能否顺利进入服务流程——队列满了,连接就直接被内核丢弃,用户看到的是“connection refused”或超时,而非 502/504。
理解 ListenBacklog 的实际作用
ListenBacklog 控制的是操作系统为 Apache 监听套接字维护的 accept 队列最大长度。TCP 三次握手完成后,连接进入该队列等待 Apache 主进程调用 accept() 取出;若此时队列已满,内核会丢弃客户端发来的 ACK,导致连接失败。
- 它不是 Apache 自己维护的队列,而是内核层面的缓冲区
- 默认值通常为 511(Linux),受系统参数 net.core.somaxconn 限制
- 在 Java 前置 Apache 反向代理架构中,这个值卡住了整个后端服务的入口吞吐
检查并调高系统级连接队列上限
Apache 的 ListenBacklog 无法超过系统允许的最大值,必须先放宽内核限制:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 查看当前值:sysctl net.core.somaxconn
- 临时调整:sudo sysctl -w net.core.somaxconn=65535
- 永久生效:将 net.core.somaxconn = 65535 写入 /etc/sysctl.conf 并执行 sysctl -p
在 Apache 中显式配置 ListenBacklog
仅改系统参数不够,还需在 Apache 配置中明确指定 backlog 值(注意语法):
- 修改 httpd.conf 或虚拟主机配置中的 Listen 指令
- 原写法:Listen 80 → 改为:Listen 80 65535
- 支持 IPv6 时:Listen [::]:443 65535
- 多个监听地址需分别设置,如 Listen 192.168.1.100:8080 65535
配合 MPM 模式与监控验证效果
ListenBacklog 优化需与 Apache 运行模式协同,否则调大也无意义:
- 优先使用 event 或 worker MPM,避免 prefork 因进程 fork 开销拖慢 accept 调用
- 确认启用方式:httpd -l | grep mpm,或检查 LoadModule 是否加载了 mpm_event_module
- 验证是否生效:ss -lnt | grep :80,观察 Recv-Q 是否长期接近你设的 backlog 值
- 对比 Apache access.log QPS 与 Java 应用实际接收 QPS,差值明显收窄说明队列瓶颈缓解

















