温馨提示×

Apache2在CentOS中的性能瓶颈如何解决

小樊
40
2026-01-04 03:26:15
栏目: 智能运维

定位瓶颈与总体思路

  • 先用系统工具确认瓶颈类型:CPU(用户态/内核态占用高)、内存(Swap 频繁)、磁盘 I/O(await/rrqm/s 高)、网络(丢包/重传/带宽打满)、连接(TIME_WAIT 多、连接队列满)。
  • 对应策略:动态内容用更高效的 MPM 与后端(如 PHP-FPM),静态资源上 缓存/CDN,开启 压缩长连接,再配合 系统内核与文件句柄 调优,必要时做 负载均衡水平扩展

Apache 配置优化

  • 启用并优化持久连接:
    • KeepAlive On
    • MaxKeepAliveRequests 100
    • KeepAliveTimeout 5
  • 选择并调优 MPM(多处理模块):
    • 若使用线程化 MPM(worker/event),需配合 PHP-FPM,避免阻塞;检查与切换 MPM 的位置在 /etc/httpd/conf.modules.d/00-mpm.conf(确保只启用一个 MPM)。
    • 示例(需结合内存与压测微调):
      • prefork(非线程安全场景,如传统 mod_php)
        <IfModule mpm_prefork_module>
            StartServers          5
            MinSpareServers       5
            MaxSpareServers      10
            ServerLimit         256
            MaxRequestWorkers   256
            MaxConnectionsPerChild 1000
        </IfModule>
        
      • event(高并发、长连接友好)
        <IfModule mpm_event_module>
            StartServers             2
            MinSpareThreads         25
            MaxSpareThreads         75
            ThreadLimit             64
            ThreadsPerChild         25
            MaxRequestWorkers      256
            MaxConnectionsPerChild 10000
        </IfModule>
        
  • 静态资源缓存与压缩:
    • mod_expires(示例)
      <IfModule mod_expires.c>
          ExpiresActive On
          ExpiresByType text/css  "access plus 30 days"
          ExpiresByType image/jpeg "access plus 1 year"
          ExpiresByType image/png  "access plus 1 year"
          ExpiresByType application/javascript "access plus 30 days"
      </IfModule>
      
    • mod_deflate
      <IfModule mod_deflate.c>
          AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
      </IfModule>
      
  • 启用 HTTP/2(多路复用,需 TLS):LoadModule http2_module modules/mod_http2.so,并在虚拟主机启用 H2。
  • 反向代理与缓存(减轻后端压力):
    <IfModule mod_proxy.c>
        ProxyRequests Off
        ProxyPass / http://127.0.0.1:9000/
        ProxyPassReverse / http://127.0.0.1:9000/
    </IfModule>
    <IfModule mod_cache.c>
        CacheEnable disk /
        CacheRoot /var/cache/apache2
        CacheDirLevels 2
        CacheDirLength 1
    </IfModule>
    
  • 日志与模块管理:
    • 降低日志开销:LogLevel warn,必要时简化 LogFormat。
    • 禁用不需要的模块,减少攻击面与内存占用。

系统与内核参数调优

  • 文件描述符限制(/etc/security/limits.conf):
    * soft nofile 65535
    * hard nofile 65535
    
    使会话生效(或重登):ulimit -n 65535
  • 内核网络与内存(/etc/sysctl.conf,执行 sysctl -p 生效):
    net.core.somaxconn = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.ip_local_port_range = 1024 65535
    vm.swappiness = 10
    
  • 说明:在高并发短连接场景,适当开启 tcp_tw_reuse 可缓解端口耗尽;在 NAT/负载均衡 等特殊网络拓扑下,谨慎评估相关参数。

内容交付与架构优化

  • 使用 CDN 分发静态资源(CSS/JS/图片/视频),减少源站请求与跨域时延。
  • 启用 HTTP/2HTTP/3(若环境支持),提升多资源并发加载效率。
  • 动态内容采用 反向代理 + 缓存(如 mod_cache/磁盘缓存或外部缓存层),降低后端计算压力。
  • 超大规模或突发流量:前置 负载均衡器(HAProxy/Nginx),后端多实例横向扩展。

验证与回滚

  • 变更流程:每次只调整少量参数 → 语法检查 httpd -t → 灰度/低峰滚动重启 systemctl restart httpd → 观察指标与错误日志。
  • 观测与压测:用 top/vmstat/iostat/ss -s/netstat -s 观察资源与连接;用 ab/wrk/siege 做基线压测,对比 RPS、P95/P99 延迟、错误率
  • 回滚预案:保留上一版配置与命令历史;异常时快速恢复到稳定版本,再分维度逐步优化。

0