温馨提示×

CentOS Apache如何资源优化

小樊
44
2025-11-15 22:11:58
栏目: 智能运维

CentOS 上 Apache 资源优化实操指南

一 基线评估与监控

  • 明确硬件与负载特征:记录内存大小、CPU 核数、磁盘 IOPS、业务类型(静态资源占比、动态脚本语言、是否反向代理/负载均衡)。
  • 建立监控基线:使用 top/htop、free -m、ss -s、apachetop 观察 CPU、内存、连接状态与请求耗时;开启 mod_status 的 ExtendedStatus 做实时洞察(仅在管理网段开放)。
  • 压力与回归测试:用 ab/wrk/siege 做渐进式压测,观察吞吐、P95/P99 延迟、错误率与资源占用,形成“配置—指标—结论”的闭环。

二 MPM 选择与核心参数

  • 选择合适的 MPM(多处理模块)
    • prefork:进程模型、稳定、适配非线程安全模块(如某些 mod_php),但内存占用更高。
    • worker/event:多线程模型、高并发更优,适合 PHP-FPM、反向代理 等场景。
  • 并发与内存的“黄金公式”(以 prefork 为例):
    • 估算上限:MaxRequestWorkers ≤ 可用内存 / 单进程常驻内存
    • 经验:先设定保守值(如 150),压测后按指标逐步上调,避免 OOM 与频繁 swap。
  • 参考示例(仅示例,需压测后调优):
    • prefork
      <IfModule mpm_prefork_module>
          StartServers          5
          MinSpareServers       5
          MaxSpareServers      10
          MaxRequestWorkers    150
          MaxConnectionsPerChild 0
      </IfModule>
      
    • worker
      <IfModule mpm_worker_module>
          StartServers          2
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadLimit          64
          ThreadsPerChild      25
          MaxRequestWorkers    150
          MaxConnectionsPerChild 0
      </IfModule>
      
    • event
      <IfModule mpm_event_module>
          StartServers          2
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadLimit          64
          ThreadsPerChild      25
          MaxRequestWorkers    150
          MaxConnectionsPerChild 0
      </IfModule>
      
  • 启用长连接减少握手开销(通用):
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5
    
  • 变更生效:检查配置语法 httpd -t,再重启 systemctl restart httpd

三 静态资源与传输优化

  • 启用压缩(mod_deflate):减少传输体积,提升首包与总耗时表现。
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
    </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 image/gif "access plus 1 year"
      ExpiresByType application/javascript "access plus 30 days"
    </IfModule>
    
  • 启用页面/反向代理缓存(mod_cache/mod_cache_disk):降低后端压力、提升命中率。
    <IfModule mod_cache.c>
      <IfModule mod_cache_disk.c>
          CacheRoot "/var/cache/httpd"
          CacheEnable disk /
          CacheDirLevels 2
          CacheDirLength 1
      </IfModule>
    </IfModule>
    
  • 架构建议:静态资源交由 Nginx/CDN 处理,Apache 专注动态内容或作为反向代理。

四 系统层面与连接资源

  • 文件描述符与进程数:
    • 提升系统上限:编辑 /etc/security/limits.conf
      * soft nofile 65536
      * hard nofile 65536
      * soft nproc  65536
      * hard nproc  65536
      
    • 提升内核总上限:编辑 /etc/sysctl.conf
      fs.file-max = 6815744
      
  • TCP/IP 与内核内存(/etc/sysctl.conf,按业务与内核版本谨慎调整):
    net.core.somaxconn = 65535
    net.core.netdev_max_backlog = 30000
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_tw_reuse = 1
    # 注意:在 Nginx Ingress/负载均衡前端或 NAT 环境下,慎用 tcp_tw_recycle
    net.ipv4.tcp_tw_recycle = 0
    net.ipv4.tcp_keepalive_time = 1200
    net.ipv4.ip_local_port_range = 10000 65000
    net.ipv4.tcp_max_syn_backlog = 8192
    net.ipv4.tcp_max_tw_buckets = 5000
    net.ipv4.tcp_syncookies = 1
    vm.swappiness = 10
    vm.overcommit_memory = 1
    vm.dirty_ratio = 40
    vm.dirty_background_ratio = 10
    
    • 使配置生效:sysctl -p
  • 文件系统与挂载:优先 ext4/XFS,使用 noatime 减少元数据写入;确保日志与缓存目录位于性能更优的磁盘/分区。

五 日志、模块与高并发架构

  • 日志与轮转:
    • 使用 rotatelogscronolog 按日/大小切分,避免单日志过大影响 I/O 与分析效率。
    • 生产环境避免过于“冗长”的日志格式,减少磁盘与 CPU 开销。
  • 精简模块:
    • 禁用不必要模块(如 info、status、autoindex 等),降低内存占用与攻击面;按需启用 mod_ssl、mod_deflate、mod_expires、mod_cache
  • 高并发与扩展:
    • 在更高并发下,考虑 Nginx/HAProxy 前置 + 多实例 Apache 的负载均衡架构,分离静态与动态流量,提升整体稳定性与吞吐。

0