温馨提示×

Apache在CentOS上如何进行性能调优

小樊
46
2025-11-15 22:05:54
栏目: 智能运维

Apache 在 CentOS 上的性能调优实践

一 基线评估与模块准备

  • 明确瓶颈:用 abwrksiege 做压力测试,配合 ss -snetstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ 观察连接状态,用 top/htopsardstat 观察 CPU、内存、I/O 与网络。
  • 启用必要模块:确保加载 mod_deflate(压缩)、mod_expires(缓存)、mod_headers(头控制)、mod_status(状态页)、mod_http2(HTTP/2,若启用 TLS)。
  • 基线记录:保存优化前的 KeepAliveMPM 参数、并发数、P95/P99 延迟与错误率,便于回滚与对比。

二 Apache 核心配置优化

  • 启用持久连接 KeepAlive(减少握手开销)
    • 建议值:KeepAlive OnMaxKeepAliveRequests 100KeepAliveTimeout 5(高并发短连接可适当降低 Timeout,长连接页面可适当提高)。
  • 选择并调优 MPM(并发模型)
    • 动态内容或高并发优先:event(需线程安全代码,如 PHP-FPM 配合 proxy_fcgi)。
    • 传统/非线程安全模块(如某些 mod_php)使用:prefork
    • 示例(event,按内存与并发目标逐步调大,避免一次性拉满):
      <IfModule mpm_event_module>
          StartServers             3
          MinSpareThreads         25
          MaxSpareThreads         75
          ThreadsPerChild         25
          MaxRequestWorkers      400
          MaxConnectionsPerChild   0
          ServerLimit            16
      </IfModule>
      
    • 示例(prefork,避免过高 MaxRequestWorkers 导致内存耗尽):
      <IfModule mpm_prefork_module>
          StartServers            5
          MinSpareServers         5
          MaxSpareServers        10
          MaxRequestWorkers     150
          MaxConnectionsPerChild   0
      </IfModule>
      
  • 启用压缩与静态资源缓存
    • Gzip 压缩(减少传输体积):
      <IfModule mod_deflate.c>
          AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
      </IfModule>
      
    • 浏览器缓存(降低重复请求):
      <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 image/gif  "access plus 1 year"
          ExpiresByType application/javascript "access plus 30 days"
      </IfModule>
      
  • 启用 HTTP/2(多路复用、头部压缩,需 TLS
    • 在端口 443 的 VirtualHost 中启用 H2Direct On,并确保 mod_http2 已加载;TLS 配置遵循现代实践(ECDHE 套件、开启 HTTP/2)。
  • 日志与监控
    • 降低日志开销:LogLevel warn,必要时对访问日志做异步或采样;启用 mod_statusExtendedStatus On 做在线观测(限制内网访问)。

三 系统与内核参数优化

  • 文件句柄与进程数
    • 提升软/硬限制(/etc/security/limits.conf):nofile 65536nproc 65536;确保 systemd 服务段包含 LimitNOFILE=65536
  • TCP/IP 栈(/etc/sysctl.conf,执行 sysctl -p 生效)
    net.core.somaxconn = 4096
    net.ipv4.tcp_max_syn_backlog = 8192
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_keepalive_time = 1200
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.ip_local_port_range = 1024 65535
    net.ipv4.tcp_max_tw_buckets = 5000
    net.core.netdev_max_backlog = 5000
    
  • 可选:静态资源由 NginxCDN 承载,Apache 专注动态请求,降低后端压力与连接占用。

四 典型场景配置示例

  • 高并发动态站点(PHP-FPM + event MPM)
    • MPM 采用上文 event 示例;PHP 通过 proxy_fcgi 转发;启用 mod_http2mod_deflate;静态资源设置长期 Expires;必要时开启 mod_cache/mod_cache_disk 做反向代理缓存。
  • 静态资源为主(图片、JS、CSS)
    • 使用 Nginx/CDN 直接服务静态资源;Apache 仅处理动态与鉴权;启用 mod_expiresmod_deflate;减少 KeepAlive 占用时间以释放连接给更多客户端。

五 验证与回滚

  • 逐步变更:一次只调整一个关键参数(如 MaxRequestWorkersKeepAliveTimeout),每次变更后重启 httpd 并进行压测与监控。
  • 关键指标:关注 P95/P99 延迟吞吐(RPS/QPS)5xx 错误率Worker/线程使用率TIME_WAIT 数量与 带宽;若异常(延迟飙升、错误率上升、内存 OOM),立即回滚至上一个稳定版本。
  • 维护:定期更新 httpd 与模块版本,清理无用模块与虚拟主机,保持配置简洁与可观测性。

0