温馨提示×

怎样调整Apache配置减少延迟

小樊
39
2025-12-12 20:14:25
栏目: 编程语言

Apache配置优化以减少延迟的实用清单

一 核心原则与快速判断

  • 优先减少往返次数(RTT):启用持久连接 KeepAlive、启用HTTP/2 多路复用、合并/减少请求、使用CDN浏览器缓存
  • 降低传输体积:开启Gzip/Brotli 压缩,对图片采用合适格式与压缩,避免重复压缩已压缩内容。
  • 提升并发处理能力:选择并调优合适的MPM(在高并发/长连接场景优先 event),合理设置MaxRequestWorkers/ThreadsPerChild,避免排队与连接耗尽。
  • 降低后端等待:为动态内容启用页面/对象缓存(如 mod_cache/反向代理缓存),优化数据库查询PHP/应用层性能。
  • 减少阻塞与开销:关闭HostnameLookups,精简日志,禁用不必要模块,优化SSL/TLS握手(启用HTTP/2会话复用)。

二 关键配置示例

  • 启用 KeepAlive(降低握手与慢启动成本)
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
  • 启用压缩(减少传输体积,注意只对文本类资源压缩)
<IfModule mod_deflate.c>
  DeflateCompressionLevel 6
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json application/xml application/xhtml+xml
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|pdf|zip|rar)$ no-gzip dont-vary
  Header append Vary Accept-Encoding
</IfModule>
  • 浏览器缓存(减少重复请求)
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 1 hour"
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png  "access plus 1 year"
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType text/css  "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
</IfModule>
<IfModule mod_headers.c>
  <FilesMatch "\.(ico|jpe?g|png|webp|css|js)$">
    Header set Cache-Control "public, max-age=31536000, immutable"
  </FilesMatch>
</IfModule>
  • 启用 HTTP/2(多路复用、头部压缩,显著降低排队)
# Debian/Ubuntu
a2enmod http2
# 在虚拟主机或端口监听处增加
Protocols h2 http/1.1
  • 启用页面/反向代理缓存(降低后端延迟)
<IfModule mod_cache.c>
  CacheEnable disk /
  CacheRoot "/var/cache/apache"
  CacheDefaultExpire 3600
</IfModule>
  • 关闭 DNS 反向查询(避免每条日志/请求做 DNS)
HostnameLookups Off
  • 精简日志(降低 I/O 与锁竞争)
CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/access_%Y%m%d.log 86400" combined
ErrorLog  "|/usr/bin/rotatelogs -l /var/log/apache2/error_%Y%m%d.log  86400"

以上配置需结合站点实际与模块可用性启用与调整。

三 MPM选择与调优要点

  • 选择 MPM
    • prefork:进程隔离、兼容性好(如某些 PHP 模块),但内存占用高,适合低并发或需进程隔离的场景。
    • worker/event:基于线程,更省内存、并发更高;在长连接/高并发下优先 event
  • 调参思路
    • 估算并发连接与内存:并发 ≈ MaxRequestWorkers/ThreadsPerChild;内存 ≈ 并发 × 每进程/线程内存
    • 监控与迭代:观察 CPU、内存、连接排队、请求耗时,逐步微调。
  • 示例(event,按内存与并发目标调优)
<IfModule mpm_event_module>
  StartServers        3
  MinSpareThreads     25
  MaxSpareThreads     75
  ThreadsPerChild     25
  MaxRequestWorkers   400
</IfModule>
  • 示例(prefork,兼容性与稳定性优先)
<IfModule mpm_prefork_module>
  StartServers        5
  MinSpareServers     5
  MaxSpareServers     10
  MaxRequestWorkers   150
  MaxConnectionsPerChild 10000
</IfModule>
  • 何时考虑关闭 KeepAlive
    • 纯动态、单请求为主、内存紧张或连接数受限时,可关闭或缩短超时;公式参考:HttpdProcessNumber = KeepAliveTimeout × 每秒请求数 / 平均KeepAlive请求。内存紧张或平均 KeepAlive 请求数较小(≤ Timeout)时,关闭更划算。

四 验证与上线步骤

  • 配置语法与模块检查
httpd -t                  # 语法检查
apachectl -M | grep -E 'deflate|expires|headers|cache|http2|mpm_'
  • 重启与灰度
    • 先灰度一台/一个虚拟主机,观察错误日志与监控指标,再全量发布。
  • 性能与延迟验证
    • 基准测试:ab -n 10000 -c 100 https://yourdomain/
    • 实时监控:watch -n 1 "pgrep httpd | wc -l"netstat -ant | grep :80 | wc -l
    • 浏览器与网络:检查响应头 Content-Encoding: gzipCache-ControlAge,以及 TTFB/PLT(使用 DevTools 或 Lighthouse)。
  • 持续观察
    • 关注 CPU、内存、连接数、队列、5xx 错误、带宽;结合 mod_statusPrometheus/Grafana 建立长期面板。

五 常见陷阱与修正

  • KeepAlive 超时过大或请求数过小:会占用过多工作进程/线程,导致排队与内存压力;按流量与页面资源数调小 KeepAliveTimeout(如 2–5 秒)、适度提高 MaxKeepAliveRequests(如 100–200)
  • 压缩配置不当:对图片/PDF/音视频重复压缩浪费 CPU;应排除已压缩类型并设置 Vary: Accept-Encoding 以便 CDN/浏览器正确缓存多版本。
  • 日志与 DNS 开销:开启 HostnameLookups 或同步写大日志会显著增加延迟;关闭 DNS 反向解析、采用管道日志轮替更稳更快。
  • 静态资源无缓存或缓存策略不当:未设置 Cache-Control/Expires 会导致频繁 200/304;对带哈希的资源设置 immutable,对长期不变的资源设置长 max-age
  • 未启用 HTTP/2:在支持 TLS 的场景下未启用 HTTP/2 会失去多路复用与头部压缩优势;启用后优先使用 h2

0