温馨提示×

CentOS Apache如何优化配置提升性能

小樊
43
2025-11-15 22:01:57
栏目: 智能运维

CentOS 上 Apache 性能优化实操指南

一 基线评估与模块准备

  • 确认 MPM 模式 与编译参数:执行 httpd -V,查看输出中的 Server MPM(如 event/prefork/worker)与是否线程化;如需切换 MPM,需确保已安装对应模块并在配置中启用。
  • 启用关键模块(按需):mod_http2(HTTP/2)、mod_deflate(压缩)、mod_expires(缓存策略)、mod_cache/mod_cache_disk(反向代理缓存/页面缓存)、mod_status(运行状态)、mod_log_config(日志轮转)。
  • 基线压测与监控:用 ab/wrk/siege 做基线压测;用 ss -s/ss -tan state all 观察连接状态;开启 mod_statusExtendedStatus On 查看 BusyWorkers/IdleWorkers;检查 /var/log/messagesjournalctl -u httpd 的错误日志。
  • 系统与安全:放行 HTTP/HTTPS 防火墙;静态资源量大时考虑由 Nginx/CDN 承载,Apache 专注动态内容。

二 MPM 选择与关键参数

  • 模式选择建议
    • prefork:多进程、非线程,最兼容(如传统 mod_php),但内存占用高、并发能力弱。
    • worker:多进程+多线程,内存更省、并发更好,需保证模块线程安全。
    • event:在 worker 基础上优化 KeepAlive 长连接占用,适合高并发与长连接场景(现代 Apache 已稳定支持 SSL/TLS)。
  • 参数调优要点(示例为常见安全起步值,需结合内存与压测微调)
维度 prefork 关键参数 worker/event 关键参数
并发能力 MaxRequestWorkers(并发进程数) MaxRequestWorkers = ServerLimit × ThreadsPerChild
进程/线程 StartServers 5MinSpareServers 5MaxSpareServers 10 StartServers 3MinSpareThreads 75MaxSpareThreads 250ThreadsPerChild 25
生命周期 MaxConnectionsPerChild(非零可防内存泄漏) MaxConnectionsPerChild(同上)
连接复用 KeepAlive OnKeepAliveTimeout 5MaxKeepAliveRequests 100 同左
  • 计算示例
    • worker/event:若 ThreadsPerChild=25、目标 MaxRequestWorkers=400,则 ServerLimit=ceil(400/25)=16
  • 修改后执行 systemctl restart httpd 并观察 BusyWorkers/IdleWorkers 与压测结果,逐步微调。

三 传输层与内容优化

  • 启用 HTTP/2:加载 mod_http2 并在虚拟主机启用 Protocols h2 http/1.1;适合多资源并行加载与移动端体验提升。
  • 启用 Gzip 压缩(mod_deflate):对文本类资源压缩传输,降低带宽与时延。
  • 设置 静态资源缓存(mod_expires):为 CSS/JS/图片 设置长期 Cache-Control/Expires,减少重复请求。
  • 启用 页面/反向代理缓存(mod_cache/mod_cache_disk):对可缓存内容或反向代理后端响应做磁盘缓存,显著降低后端压力。
  • 日志与信息泄露治理:使用 rotatelogslogrotate 做日志轮转;设置 LogLevel warn 降低磁盘 I/O;隐藏版本信息 ServerTokens ProdServerSignature Off

四 系统与内核优化

  • 文件句柄与进程数:提升 ulimit -n(如 65536)并在 /etc/security/limits.confapache 用户设置 nofile;确保 httpd 服务单元继承更高限制。
  • TCP 与端口复用(/etc/sysctl.conf,执行 sysctl -p 生效):
    • 加快回收:net.ipv4.tcp_fin_timeout = 30
    • 启用 TIME_WAIT 复用:net.ipv4.tcp_tw_reuse = 1
    • 缩短端口占用周期:net.ipv4.tcp_tw_recycle = 1(在 NAT/负载均衡 环境慎用)
    • 扩大本地端口范围:net.ipv4.ip_local_port_range = 1024 65000
    • 提升半连接队列:net.ipv4.tcp_max_syn_backlog = 8192
    • 控制 TIME_WAIT 数量:net.ipv4.tcp_max_tw_buckets = 5000
  • 存储与挂载:对日志与缓存目录使用 noatime 挂载选项,减少元数据写入。

五 快速检查清单与常见瓶颈

  • 快速检查清单
    • 已启用 HTTP/2 且证书正确;静态资源命中 长 CacheGzip 生效;访问日志轮转正常。
    • KeepAlive 合理(如 5s/100);MPM 参数与内存匹配(压测观察 BusyWorkers 不过载)。
    • 系统层面:文件句柄足够、内核网络参数已调、无频繁 TIME_WAIT 堆积。
  • 常见瓶颈与处理
    • 日志 I/O 过高:改为异步或降低级别,启用 rotatelogs/logrotate
    • 静态资源拖慢:由 Nginx/CDN 承载或开启 mod_cache_disk
    • 并发上不去或报错 MaxRequestWorkers:按内存与压测逐步提升 MaxRequestWorkers(worker/event 同步调整 ServerLimit/ThreadsPerChild),并观察 IdleWorkers 是否充足。
    • 长连接占用线程:优先使用 event MPM,并合理设置 KeepAliveTimeout

0