温馨提示×

Apache2 Ubuntu如何处理高并发请求

小樊
44
2026-01-09 11:49:38
栏目: 智能运维

Apache2 Ubuntu 高并发处理实践

一 核心思路

  • 选择高效的 MPM(多处理模块):在 Apache 2.4 中优先使用 mpm_event(事件驱动、基于 worker,适合长连接与高并发);若使用线程不安全的模块(如某些旧版 PHP 模块),则退而用 mpm_prefork
  • 打开并收敛 KeepAlive:减少握手开销,但将超时设短,避免占用连接。
  • 合理设置 并发上限与超时:控制 MaxRequestWorkers/MaxClientsTimeout,既扛住峰值又不耗尽内存。
  • 减轻后端压力:启用 压缩(mod_deflate)缓存(mod_cache/mod_cache_disk、mod_expires),降低 CPU 与带宽消耗。
  • 配合 系统资源与监控:提升文件描述符限制,使用 mod_status、apache2buddy、ab/siege 持续观测与迭代。

二 启用并配置 MPM

  • 查看与切换 MPM(Ubuntu 路径与工具):
    • 查看:apache2ctl -M | grep mpm
    • 切换示例(以 mpm_event 为例):sudo a2dismod mpm_prefork && sudo a2enmod mpm_event && sudo systemctl restart apache2
  • 典型配置示例(放入对应 MPM 配置段,如 /etc/apache2/mods-enabled/mpm_event.conf):
    • mpm_event(事件驱动,适合高并发与长连接)
      <IfModule mpm_event_module>
          StartServers          4
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadsPerChild      25
          MaxRequestWorkers    150
          MaxConnectionsPerChild 1000
      </IfModule>
      
    • mpm_prefork(非线程、兼容性好;每个进程单线程)
      <IfModule mpm_prefork_module>
          StartServers          5
          MinSpareServers       5
          MaxSpareServers      10
          MaxRequestWorkers    150
          MaxConnectionsPerChild 0
      </IfModule>
      
  • 若使用 PHP:从 mpm_prefork + mod_php 切换到 mpm_event 时,建议改用 PHP-FPM(如 sudo a2dismod php7.2 && sudo a2enmod mpm_event && sudo apt-get install php7.2-fpm libapache2-mod-fcgid && sudo a2enconf php7.2-fpm && sudo systemctl restart apache2),以线程安全与资源效率。

三 关键运行时参数

  • KeepAlive 与连接复用
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 2
    
  • 请求与网络超时
    Timeout 60
    
  • 说明:长连接复用可显著减少握手成本;但 KeepAliveTimeout 过大将占用更多并发槽位,高并发场景建议 1–5 秒

四 静态资源减负与内容优化

  • 启用压缩(减少传输体积)
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript
    </IfModule>
    
  • 启用缓存与过期策略(降低后端与带宽)
    sudo a2enmod cache cache_disk expires
    
    <IfModule mod_expires.c>
      ExpiresActive On
      ExpiresByType image/jpg  "access plus 1 month"
      ExpiresByType text/css  "access plus 1 week"
      ExpiresByType application/javascript "access plus 1 week"
    </IfModule>
    
    <IfModule mod_cache.c>
      <IfModule mod_cache_disk.c>
          CacheRoot "/var/cache/apache2/mod_cache_disk"
          CacheEnable disk /
          CacheDirLevels 2
          CacheDirLength 1
      </IfModule>
    </IfModule>
    
  • 其他通用优化:关闭 HostnameLookups Off,减少 DNS 反向查询开销。

五 系统层面与监控调优

  • 提升文件描述符限制(示例)
    sudo sysctl -w fs.file-max=100000
    echo "fs.file-max = 100000" | sudo tee -a /etc/sysctl.conf
    
  • 打开状态页与扩展状态(便于排查)
    • 在虚拟主机或全局配置中加入:
      SetHandler server-status
      Order Deny,Allow
      Deny from all
      Allow from localhost
      ExtendedStatus On
      
    • 访问:lynx http://localhost/server-status
  • 观测与容量评估
    • 工具:htop、netstat、ab/siege、apache2buddy
    • 快速评估:curl -L http://apache2buddy.pl/ | perl(给出 MaxRequestWorkers 等建议)
  • 变更流程与验证
    • 原则:小步调整、变更后重启 sudo systemctl restart apache2、压测对比(如 ab/siege)、观察 CPU/内存/连接数/队列,再迭代参数。

0