温馨提示×

CentOS上Apache2性能如何优化

小樊
36
2025-12-07 15:19:21
栏目: 智能运维

CentOS 上 Apache2 性能优化实战指南

一 基线评估与监控

  • 明确瓶颈:用 ab/wrk/siege 做基线压测,配合 top/vmstat/iostat/sar 观察 CPU、内存、I/O、网络连接队列,定位是计算密集、I/O 等待还是连接瓶颈。
  • 监控连接状态:用 ss -snetstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ 查看 TIME_WAIT/CLOSE_WAIT/ESTABLISHED 分布,指导内核与 KeepAlive 策略。
  • 日志与采样:临时开启 mod_status ExtendedStatus,观察 BusyWorkers/IdleWorkers;必要时降低日志级别或异步写入,减少同步 I/O 压力。

二 系统层面优化

  • 文件描述符与进程数
    • 提升系统上限:在 /etc/sysctl.conf 设置 fs.file-max=6815744;在 /etc/security/limits.conf 设置用户级 nofile 65535nproc 65535,并确认 systemd 服务段包含 LimitNOFILE=65535,随后执行 sysctl -p 生效。
  • TCP/IP 栈与端口
    • 典型优化(按负载与内核版本谨慎调整):
      • net.core.somaxconn=65535
      • net.ipv4.tcp_max_syn_backlog=8192
      • net.ipv4.tcp_fin_timeout=30
      • net.ipv4.tcp_keepalive_time=1200
      • net.ipv4.ip_local_port_range=10000 65000
      • net.ipv4.tcp_max_tw_buckets=5000
      • net.ipv4.tcp_syncookies=1
    • 注意:在 NAT/负载均衡 或较新内核上,避免使用已废弃的 tcp_tw_recycle,优先使用 tcp_tw_reuse 并结合业务 RTT 调整 tcp_keepalive_time
  • 虚拟内存与 I/O
    • vm.swappiness=10(减少换页,偏向物理内存利用)
    • vm.dirty_ratio=40,vm.dirty_background_ratio=10(平滑刷脏,降低抖动)
    • 文件系统:选择 ext4/XFS,挂载使用 noatime,nodiratime 减少元数据写入。
  • SELinux 与防火墙
    • 不建议直接关闭 SELinux;使用 semanage/audit2allow 做最小权限放行。
    • 仅开放必要端口(如 80/443),用 firewalld/iptables 精准放行,减少无效连接与扫描。

三 Apache MPM 选择与关键参数

  • 选择 MPM
    • prefork:基于进程,适合 PHP-FPM/mod_php 或需线程安全的场景,稳健但内存占用高。
    • worker/event:基于线程/事件,适合高并发静态资源或反向代理,内存更省、并发更高(需模块与代码线程安全)。
  • 典型配置示例(需结合内存与压测微调)
    • prefork(示例为 4GB 内存、2 核场景的起点值)
      <IfModule mpm_prefork_module>
          StartServers        5
          MinSpareServers     5
          MaxSpareServers    10
          ServerLimit        128
          MaxRequestWorkers  128
          MaxConnectionsPerChild 1000
      </IfModule>
      
    • event(示例起点)
      <IfModule mpm_event_module>
          StartServers             3
          MinSpareThreads         75
          MaxSpareThreads        250
          ThreadsPerChild         25
          ServerLimit             16
          MaxRequestWorkers      400
          MaxConnectionsPerChild   0
      </IfModule>
      
  • 并发上限估算思路
    • 单进程/线程常驻内存 ≈ 应用栈 + 模块开销(例如 10–20MB 量级,视模块而定)。
    • 粗略上限:MaxRequestWorkers ≤ 可用内存 / 单进程内存;同时受 ulimit -nsomaxconn 约束。
  • 连接与长连接
    • 启用持久连接并控制握手成本:
      KeepAlive On
      MaxKeepAliveRequests 100
      KeepAliveTimeout 5
      
    • 静态资源为主可适当提高 MaxKeepAliveRequests;高并发短连接可适当降低 KeepAliveTimeout

四 模块与内容交付优化

  • 压缩与缓存
    • 启用压缩(减少传输体积):
      <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(需 mod_http2,通常配合 TLS):
      Protocols h2 http/1.1
      H2Direct On
      
    • 反向代理/缓存场景启用 mod_proxy、mod_cache、mod_disk_cache,对热点内容做本地缓存,减轻后端压力。
  • 静态资源与 CDN
    • 将图片、视频、归档与静态文件交由 CDN 分发,源站只提供动态接口与签名 URL,显著降低跨域与长距离传输时延。
  • 日志优化
    • 生产环境可异步写日志、降低同步级别,或按时间/大小切分并压缩归档,减少 I/O 抖动与磁盘占满风险。

五 安全加固与上线流程

  • 安全与最小化
    • 仅启用必要模块,禁用 autoindex/dav 等高风险模块;隐藏版本信息(如 ServerTokens Prod)。
    • 使用 TLS 1.2+,优先 ECDHE 套件与 HSTS,证书链完整;必要时开启 OCSP Stapling 降低握手延迟。
  • 变更与回滚
    • 任何配置变更前备份;遵循“灰度/蓝绿/金丝雀”发布;变更后在相同压测场景下复核 吞吐、P95/P99 延迟、错误率 与资源占用。
  • 持续监控与迭代
    • 建立 基线指标告警阈值(如 5xx 比例、连接队列溢出、磁盘 I/O 饱和),结合 日志分析性能剖析 持续迭代参数。

以上步骤按“系统→MPM→模块→内容→安全→上线”的顺序实施,配合压测与监控闭环调优,可在 CentOS 上显著提升 Apache2 的吞吐、降低延迟并增强稳定性。

0