温馨提示×

CentOS Apache如何优化CPU

小樊
38
2025-11-01 14:56:03
栏目: 智能运维

1. 调整MPM(多处理模块)配置
MPM是Apache处理并发请求的核心模块,CentOS默认使用prefork(进程模式,线程安全但内存占用高),高并发场景建议切换至event(事件驱动,结合多线程与进程优势,性能更优)。

  • 禁用旧MPM:编辑/etc/httpd/conf.modules.d/00-mpm.conf,注释prefork相关行(如LoadModule mpm_prefork_module modules/mod_mpm_prefork.so)。
  • 启用event MPM:取消event模块加载行(LoadModule mpm_event_module modules/mod_mpm_event.so),并配置参数:
    <IfModule mpm_event_module>
        StartServers             2       # 启动时的子进程数
        MinSpareThreads         25       # 最小空闲线程数
        MaxSpareThreads         75       # 最大空闲线程数
        ThreadLimit             64       # 每个子进程的最大线程数
        ThreadsPerChild         25       # 每个子进程创建的固定线程数
        MaxRequestWorkers      150       # 最大并发请求数(根据内存调整,如每线程占用10MB,1.5GB内存约设150MaxConnectionsPerChild   0       # 每个子进程处理的请求数(0表示无限制,避免内存泄漏可设为1000</IfModule>
    

    注:event模式解决了worker模式中keep-alive长连接占用线程的问题,更适合静态内容和高并发场景。

2. 优化KeepAlive设置
KeepAlive允许客户端通过单个TCP连接发送多个请求,减少连接建立/关闭的开销(TCP三次握手、四次挥手的CPU消耗),但需平衡连接占用时间。

  • 启用KeepAlive:在httpd.conf中设置KeepAlive On
  • 调整参数:
    • MaxKeepAliveRequests 100:单个连接允许的最大请求数(避免单个连接占用过久,影响其他请求)。
    • KeepAliveTimeout 5:等待下一个请求的超时时间(秒),超过则关闭连接(建议设为5-10秒,避免长时间空闲占用资源)。

3. 启用压缩技术(mod_deflate)
通过Gzip压缩传输的文本数据(HTML、CSS、JS、JSON等),减少数据量(通常压缩率为50%-70%),降低CPU处理传输数据的负担(CPU占用减少,响应速度提升)。

  • 加载模块:确保mod_deflate已加载(默认启用,可通过httpd -M | grep deflate验证)。
  • 配置压缩规则:在httpd.conf或虚拟主机配置中添加:
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
    </IfModule>
    

    注:避免压缩图片、视频等二进制文件(已压缩,再次压缩会增加CPU开销)。

4. 配置静态文件缓存(mod_expires/mod_cache)
静态文件(图片、CSS、JS、字体等)无需每次请求都由Apache处理,通过缓存减少服务器负载。

  • 启用expires模块:LoadModule expires_module modules/mod_expires.so(默认启用)。
  • 设置缓存时间:在httpd.conf中添加:
    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresByType image/jpeg "access plus 1 year"  # JPEG图片缓存1ExpiresByType image/png "access plus 1 year"   # PNG图片缓存1ExpiresByType text/css "access plus 30 days"   # CSS文件缓存30ExpiresByType application/javascript "access plus 30 days"  # JS文件缓存30</IfModule>
    

    注:缓存时间根据文件更新频率调整(如CSS/JS每月更新,可设为30天;图片长期不变,可设为1年)。

5. 禁用不必要的模块
Apache默认加载许多模块(如mod_cgimod_autoindexmod_ldap等),未使用的模块会占用内存和CPU资源(尤其是动态模块,加载后即常驻内存)。

  • 查看已加载模块:httpd -M(列出所有加载的模块)。
  • 禁用模块:注释/etc/httpd/conf.modules.d/目录下对应模块的加载行(如禁用mod_cgi,注释LoadModule cgi_module modules/mod_cgi.so)。
  • 重启Apache:systemctl restart httpd使更改生效。

6. 调整系统内核参数
优化操作系统的网络和文件系统参数,减少CPU在TCP连接、文件IO等方面的开销。

  • 编辑/etc/sysctl.conf,添加以下参数:
    net.ipv4.tcp_fin_timeout = 30       # TIME_WAIT状态的超时时间(秒),默认60,缩短可快速释放端口
    net.ipv4.tcp_tw_reuse = 1           # 允许重用TIME_WAIT状态的端口(减少端口耗尽)
    net.ipv4.tcp_max_syn_backlog = 8192 # SYN队列长度(高并发时避免SYN Flood攻击导致连接失败)
    net.core.somaxconn = 4096           # 监听队列的最大长度(避免连接被拒绝)
    net.ipv4.tcp_keepalive_time = 1200  # TCP keepalive探测间隔(秒),减少无效连接占用资源
    
  • 生效配置:sysctl -p

7. 监控与持续调优
通过监控工具实时了解CPU使用情况,针对性调整配置:

  • 实时监控:使用top(按1查看每个CPU核心的使用率)、htop(更直观的资源占用展示)、vmstat 1(查看CPU、内存、IO的实时状态)命令。
  • 日志分析:定期检查/var/log/httpd/access_log(访问日志,查看高频请求)和/var/log/httpd/error_log(错误日志,查看异常请求),识别性能瓶颈(如某个URL占用大量CPU,可针对性优化或缓存)。
  • 压力测试:使用ab(Apache Benchmark)或wrk工具模拟高并发请求,评估优化效果(如ab -n 10000 -c 1000 http://example.com/,表示10000次请求,并发1000)。

0