首先通过工具定位高CPU消耗的具体原因,避免盲目优化:
top或htop命令,按CPU%排序,确认Apache进程(httpd或apache2)是否为CPU占用最高的进程。/var/log/apache2/error.log)是否有大量错误(如脚本超时、模块冲突);查看访问日志(/var/log/apache2/access.log)识别高频请求(如恶意爬虫、异常URL)。vmstat 1(查看CPU、内存、I/O)、netstat -tuln(查看端口占用)等命令,辅助判断瓶颈类型(如CPU密集型、I/O密集型)。Apache的MPM决定了进程/线程的处理方式,选择合适的MPM并调整参数是降低CPU占用的核心:
event或worker MPM(基于线程,资源利用率更高);prefork MPM(基于进程,但资源消耗更大)。event MPM为例,Debian默认使用):<IfModule mpm_event_module>
StartServers 3 # 初始启动的进程数(根据CPU核心数调整,如4核可设为4)
MinSpareThreads 25 # 最小空闲线程数(维持一定空闲线程,避免频繁创建)
MaxSpareThreads 75 # 最大空闲线程数(避免空闲线程占用过多内存)
ThreadLimit 64 # 单个进程的最大线程数(默认64,无需修改)
ThreadsPerChild 25 # 每个子进程创建的线程数(需与MaxRequestWorkers匹配)
MaxRequestWorkers 150 # 最大并发请求数(关键参数,避免过多请求导致CPU过载)
ServerLimit 10 # 服务器进程的最大数量(StartServers×ServerLimit≥MaxRequestWorkers)
MaxConnectionsPerChild 1000 # 每个子进程处理的最大请求数(防止内存泄漏,建议1000-5000)
</IfModule>
注:参数需根据服务器硬件(CPU核心数、内存)调整,可通过
ab(Apache Benchmark)工具压测验证效果。
KeepAlive可减少TCP连接建立/关闭的开销,但设置不当会增加CPU负担:
KeepAlive On # 开启KeepAlive
MaxKeepAliveRequests 100 # 单个连接最大请求数(避免单个连接占用过久)
KeepAliveTimeout 5 # 连接保持时间(秒,建议5-10秒,过长会导致线程闲置)
注:若网站静态内容多,可适当增大
MaxKeepAliveRequests;若动态内容多,缩短KeepAliveTimeout以释放资源。
mod_deflate模块压缩HTML、CSS、JS等文本文件,减少传输数据量,降低CPU负载:<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
</IfModule>
mod_cache和mod_cache_disk模块缓存静态资源(如图片、CSS),减少重复请求对CPU的消耗:<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheEnable disk /static # 缓存/static目录下的静态资源
CacheRoot "/var/cache/apache2/mod_cache_disk"
CacheDirLevels 2 # 缓存目录层级(避免单个目录文件过多)
CacheDirLength 1 # 目录名长度(1-2位,优化IO性能)
</IfModule>
</IfModule>
Apache默认加载的模块较多,禁用未使用的模块可减少CPU和内存占用:
apache2ctl -M(Debian)或httpd -M(CentOS)。a2dismod 模块名(如a2dismod status禁用状态模块),然后重启Apache:systemctl restart apache2。注:常见可禁用模块:
status、autoindex(若不需要目录列表)、cgi(若不用CGI脚本)。
若网站使用PHP,mod_php(Apache模块)会占用大量CPU,建议改用PHP-FPM(FastCGI进程管理器):
sudo apt install php-fpm。mod_php,启用proxy_fcgi和setenvif模块,添加以下配置:<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
注:
php8.2-fpm.sock需替换为实际安装的PHP版本(如php7.4-fpm.sock)。
优化内核参数可提升Apache的网络性能,减少CPU开销:
/etc/sysctl.conf文件,添加以下参数:net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME_WAIT状态的连接(减少TCP连接建立开销)
net.core.somaxconn = 4096 # 监听队列的最大长度(避免连接被拒绝)
net.ipv4.tcp_max_syn_backlog = 4096 # SYN队列的最大长度(应对高并发连接)
sudo sysctl -p。top、htop、vmstat等工具持续监控CPU、内存、I/O使用情况,及时发现异常。GoAccess工具),识别高频请求、慢请求或攻击行为。通过以上步骤,可有效降低Debian Apache的CPU占用率,提升服务器性能。需根据实际业务场景(如流量大小、内容类型)调整参数,避免过度优化。