在CentOS系统中,Apache HTTP Server(httpd)作为常用的Web服务器,有时会出现CPU占用率过高的问题,影响服务器性能和用户体验,本文将详细分析CentOS系统中httpd CPU高占用率的原因、排查步骤及解决方案,帮助管理员快速定位并解决问题。

httpd CPU高占用率的表现
当httpd进程CPU占用率过高时,服务器可能出现响应缓慢、页面加载超时甚至无法访问的情况,通过top、htop或ps命令可以观察到httpd进程持续占用较高CPU资源,有时单个进程的CPU使用率可能超过50%或更高,这种现象通常与高并发请求、配置错误或恶意攻击等因素有关。
常见原因分析
高并发请求
网站流量激增时,大量并发请求可能导致httpd进程需要处理大量连接,从而消耗大量CPU资源,特别是动态页面(如PHP、JSP等)需要服务器实时处理,更容易导致CPU高占用。
配置不当
Apache配置文件中的参数设置不当也可能引发CPU高占用,MaxClients设置过小会导致请求排队,而设置过大则可能耗尽系统资源;KeepAliveTimeout过长会增加连接占用时间;模块加载过多或功能冗余也会增加CPU负担。
脚本或程序问题
网站脚本(如PHP、Python等)存在效率低下的代码、死循环或资源泄漏问题时,会导致httpd进程调用脚本时CPU占用飙升,未优化的数据库查询、正则表达式滥用等。
恶意攻击
DDoS攻击、CC攻击或恶意爬虫会发送大量请求,使httpd进程陷入高负载状态,通过分析访问日志可以发现异常IP或高频请求模式。
文件权限或磁盘I/O问题
如果网站目录权限设置不当,导致httpd进程频繁读取文件或处理错误日志,也可能间接增加CPU负载,磁盘I/O瓶颈也会影响httpd处理效率。
排查步骤
查看当前负载
使用top -c或htop命令查看httpd进程的CPU占用情况,记录异常进程的PID,通过ps -ef | grep httpd可以进一步确认进程详情。

分析访问日志
检查Apache的访问日志(如/var/log/httpd/access_log),使用awk、grep等工具统计高频访问IP、URL或User-Agent。
awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -nr
可以排查异常请求。
检查错误日志
查看错误日志(/var/log/httpd/error_log),是否有脚本错误、模块加载失败或超时记录,这些信息有助于定位问题。
分析脚本性能
如果问题与动态页面相关,使用strace或gdb跟踪httpd进程的系统调用,或结合xdebug等工具分析脚本执行效率。
检查配置文件
使用apachectl -t检查配置文件语法是否正确,通过注释法逐步排查模块或指令的影响,例如禁用非必要模块(如mod_status、mod_info)。
解决方案
优化并发配置
根据服务器硬件资源调整httpd.conf中的MaxClients、ServerLimit和MaxRequestsPerChild参数,对于2GB内存的服务器,可设置:
ServerLimit 100 MaxClients 100 MaxRequestsPerChild 1000
避免频繁创建和销毁进程。

启用缓存模块
安装并启用mod_cache和mod_disk_cache模块,对静态资源或动态页面结果进行缓存,减少重复计算:
LoadModule cache_module modules/mod_cache.so LoadModule disk_cache_module modules/mod_disk_cache.so CacheRoot "/var/cache/apache2" CacheEnable disk / CacheDirLevels 2 CacheDirLength 1
优化脚本代码
检查并优化网站脚本,避免复杂循环、减少数据库查询次数,使用缓存机制(如Redis、Memcached)提升性能。
防御恶意攻击
通过mod_evasive模块限制并发连接频率,或结合iptables封禁异常IP:
LoadModule mod_evasive20_module modules/mod_evasive20.so DOSHashTableSize 3097 DOSPageCount 2 DOSSiteCount 50 DOSBlockingPeriod 60
负载均衡
若流量过大,可通过LVS或Nginx反向代理实现负载均衡,将请求分发到多台httpd服务器。
长期监控与维护
- 使用
nmon、zabbix等工具监控服务器资源使用情况。 - 定期更新Apache及相关组件版本,修复已知漏洞。
- 对网站进行压力测试,提前发现潜在性能瓶颈。
FAQs
Q1: 如何判断httpd CPU高占用是由恶意攻击引起的?
A1: 通过分析访问日志,若发现某个IP在短时间内发起大量请求(如每秒超过100次),或请求的URL包含异常参数(如SQL注入尝试),则可能是恶意攻击,可结合fail2ban或iptables封禁可疑IP,并启用mod_security进行WAF防护。
Q2: 调整MaxClients参数后,httpd仍占用高CPU,下一步应如何处理?
A2: 若调整并发参数无效,需进一步检查脚本或模块问题,使用strace -p [PID]跟踪httpd进程的系统调用,观察是否因频繁文件读取或网络I/O导致负载升高,检查是否启用了资源消耗大的模块(如mod_php),考虑切换为php-fpm或启用mod_proxy_fcgi以提升性能。