CentOS 上 Apache 处理并发连接的要点
在 CentOS 上,Apache 通过 MPM(多路处理模块) 管理与调度并发连接,核心思路是为不同工作模式配置合适的进程/线程数量、连接复用与超时策略,使并发能力匹配服务器的 CPU/内存 与业务特性。常见 MPM 有 prefork、worker、event,其中 event 更适合高并发长连接场景,prefork 兼容性好(如非线程安全模块/PHP),worker 为线程化折中方案。
关键配置与位置
- 查看与切换 MPM
- 查看当前 MPM:执行命令 httpd -V | grep -i mpm(或旧版用 httpd -l)。
- 切换 MPM:在 /etc/httpd/conf.modules.d/00-mpm.conf 中仅保留需要的模块加载行(如 LoadModule mpm_event_module …),注释其他 MPM;修改后重启 httpd。
- 核心并发参数
- prefork(每个进程单线程,进程数≈并发能力)
- 关键指令:StartServers、MinSpareServers、MaxSpareServers、MaxRequestWorkers(旧称 MaxClients)、MaxConnectionsPerChild、ServerLimit。
- 约束与计算:并发上限≈MaxRequestWorkers;当需超过 256 时,需同时设置 ServerLimit ≥ MaxRequestWorkers,且 ServerLimit 通常需写在 MaxRequestWorkers 之前。
- event/worker(多进程多线程,进程×线程≈并发能力)
- 关键指令:StartServers、MinSpareThreads、MaxSpareThreads、ThreadsPerChild、ThreadLimit、MaxRequestWorkers、MaxConnectionsPerChild、ServerLimit。
- 约束与计算:并发上限≈MaxRequestWorkers,且需满足 ServerLimit × ThreadsPerChild ≥ MaxRequestWorkers。
- 连接与超时
- 启用长连接:KeepAlive On、MaxKeepAliveRequests 100、KeepAliveTimeout 5(在静态资源多、往返多的场景收益明显)。
- 请求超时:Timeout 60(建议从较低值起步,避免长阻塞占用连接)。
- 典型配置示例(示例值,需按内存与压测结果微调)
- event MPM(示例)
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
ServerLimit 16
</IfModule>
- prefork MPM(示例)
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 1000
MaxRequestWorkers 1000
MaxConnectionsPerChild 0
</IfModule>
以上参数含义、约束与示例值可据实际负载与硬件资源迭代调整。
操作系统与网络优化
- 文件描述符限制
- 提升进程可打开的文件/连接数:在 /etc/security/limits.conf 为运行 httpd 的用户增加如 nofile 65536,并确认 systemd 服务段包含 LimitNOFILE=65536;重启后生效。
- TCP 与内核参数(示例)
- 监控与验证
- 连接与状态:ss -s、ss -tan state ESTAB | wc -l;启用 mod_status 查看 server-status 实时指标。
- 压测与观测:ab、siege 做基线压测,结合 top/htop、vmstat、sar 观察 CPU、内存、I/O 与队列情况,按结果回调参。
按场景的实用建议
- 动态内容为主且依赖非线程安全模块(如部分 PHP 环境):优先使用 prefork,以稳定性与兼容性为先,按内存与压测逐步提升 MaxRequestWorkers/ServerLimit。
- 静态资源较多或长连接高并发:优先 event MPM,合理设置 KeepAlive 与 ThreadsPerChild,并通过 MaxRequestWorkers 控制并发上限,避免内存膨胀。
- 并发需求继续上探:引入 Nginx/HAProxy 做反向代理或负载均衡,将 Apache 专注动态请求,静态资源交由 Nginx/CDN 处理,提升整体可扩展性与稳定性。