温馨提示×

Apache在CentOS上如何优化并发

小樊
43
2025-12-01 18:12:35
栏目: 智能运维

Apache 在 CentOS 上的并发优化指南

一 选择并配置合适的 MPM

  • 查看与切换 MPM(CentOS 7 常见默认是 prefork):
    • 查看:执行 httpd -V | grep -i mpm,输出如 Server MPM: prefork/worker/event
    • 切换:在 /etc/httpd/conf.modules.d/00-mpm.conf 注释/启用对应模块,例如启用 event:LoadModule mpm_event_module modules/mod_event.so,然后重启 systemctl restart httpd
  • 典型并发取向的 MPM 配置示例(数值为起点,需结合压测微调):
    • prefork(非线程、稳定,适合传统模块/阻塞型场景)
      <IfModule mpm_prefork_module>
          StartServers          5
          MinSpareServers       5
          MaxSpareServers      10
          MaxRequestWorkers    150   # 并发上限≈该值(每个进程1线程)
          MaxConnectionsPerChild 0
      </IfModule>
      
    • worker/event(多线程,适合高并发 I/O 场景)
      <IfModule mpm_worker_module>
          StartServers          2
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadLimit          64
          ThreadsPerChild      25
          MaxRequestWorkers    150   # 并发上限≈该值(总线程数)
          MaxConnectionsPerChild 0
      </IfModule>
      
      <IfModule mpm_event_module>
          StartServers          2
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadLimit          64
          ThreadsPerChild      25
          MaxRequestWorkers    150
          MaxConnectionsPerChild 0
      </IfModule>
      
    • 提示:并发上限主要由 MaxRequestWorkers 决定;内存估算可按“每进程/线程常驻内存 × MaxRequestWorkers”进行,避免 OOM。

二 连接与协议层优化

  • 启用并优化持久连接(KeepAlive):
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5
    
    • 长连接能显著减少 TCP/SSL 握手开销,但 KeepAliveTimeout 过大易占用连接槽位,需与业务 RTT 权衡。
  • 启用压缩(减少传输体积):
    LoadModule deflate_module modules/mod_deflate.so
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
    </IfModule>
    
  • 启用缓存(降低后端与磁盘压力):
    • 静态资源过期策略:
      LoadModule expires_module modules/mod_expires.so
      <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>
      
    • 磁盘缓存(可选):
      LoadModule cache_module modules/mod_cache.so
      LoadModule cache_disk_module modules/mod_cache_disk.so
      <IfModule mod_cache.c>
          <IfModule mod_cache_disk.c>
              CacheRoot "/var/cache/httpd"
              CacheEnable disk /
              CacheDirLevels 2
              CacheDirLength 1
          </IfModule>
      </IfModule>
      
  • 启用 HTTP/2(多路复用、头部压缩,需 HTTPS):
    LoadModule http2_module modules/mod_http2.so
    # 在对应虚拟主机启用:Protocols h2 http/1.1
    
    • 注意:HTTP/2 下可适当降低 KeepAlive 相关数值,避免连接占用过久。

三 操作系统与网络栈优化

  • 提升文件描述符限制(允许更多并发连接/文件):
    • 系统级:/etc/sysctl.conf 增加 fs.file-max = 6815744;生效:sysctl -p
    • 用户级:/etc/security/limits.conf 增加
      * soft nofile 65536
      * hard nofile 65536
      
  • 优化 TCP 参数(/etc/sysctl.conf,生效:sysctl -p):
    net.core.somaxconn = 65535
    net.ipv4.tcp_max_syn_backlog = 8192
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.ip_local_port_range = 10000 65000
    net.ipv4.tcp_max_tw_buckets = 5000
    net.ipv4.tcp_syncookies = 1
    
    • 说明:在部分新内核中 tcp_tw_recycle 已被移除或不建议启用,优先使用 tcp_tw_reuse

四 监控验证与扩展架构

  • 监控与日志:
    • 资源与连接:top/htopss -snetstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    • Apache 状态与日志:systemctl status httpdtail -f /var/log/httpd/error_log/var/log/httpd/access_log;必要时调整 LogLevel(如 warn)降低磁盘 I/O。
  • 扩展架构:
    • 当单机并发与资源达到瓶颈时,引入 Nginx/HAProxy 做反向代理/负载均衡,将流量分发到多台 Apache 实例,提升总体承载能力与可靠性。

五 安全与维护建议

  • 模块管理:仅启用必要模块,禁用不需要的模块,降低内存占用与攻击面。
  • 保持更新:定期更新 Apache 与模块至稳定版本,及时修复安全漏洞。
  • 变更流程:任何配置调整后先灰度/备份,再全量发布,并持续观察错误日志与监控指标。

0