温馨提示×

如何通过Apache2提升网站并发量

小樊
39
2025-12-26 14:21:11
栏目: 云计算

提升 Apache2 并发能力的核心思路是:选对并发模型(MPM)、合理控制连接与超时、减少传输开销、释放更多系统资源,并基于监控数据持续迭代。下面给出一套可落地的优化路径与示例配置。

一、选择并切换合适的 MPM

  • 三种常见 MPM 的取舍与适用:
    • prefork:多进程、非线程,兼容性好(如某些 PHP 模块非线程安全),但内存占用高,适合低并发或对稳定性要求极高的场景。
    • worker:多进程+多线程,资源占用更省,适合线程安全应用,但在长连接下线程可能被占用。
    • event:worker 的改进版,事件驱动回收空闲连接,特别适合 长连接/高并发 API/WebSocket 场景。
  • 查看与切换(Debian/Ubuntu 示例):
    • 查看当前 MPM:apache2 -V | grep MPM
    • 切换为 event:sudo a2dismod mpm_prefork && sudo a2enmod mpm_event && sudo systemctl restart apache2
    • 切换为 worker:sudo a2dismod mpm_prefork && sudo a2enmod mpm_worker && sudo systemctl restart apache2
    • RHEL/CentOS 一般在 /etc/httpd/conf.modules.d/00-mpm.conf 中启用对应模块并重启 httpd。

二、关键并发参数配置示例

  • 通用连接与时长(建议作为全局基线):
    • Timeout 60:减少长等待占用;KeepAlive OnMaxKeepAliveRequests 100~500(并发高可适当放大);KeepAliveTimeout 2~5(静态资源多可略大,API 可略小);ListenBacklog 1024(提升突发排队能力)。
  • MPM 示例(按常见硬件与场景给出起点,再压测微调):
    • prefork(适合非线程安全,如部分 PHP 场景)
      <IfModule mpm_prefork_module>
          StartServers          5
          MinSpareServers       5
          MaxSpareServers      10
          MaxRequestWorkers    150   # 依据内存与单进程占用计算
          MaxConnectionsPerChild 1000 # 周期性回收,防内存泄漏累积
      </IfModule>
      
    • worker(线程化,资源更省)
      <IfModule mpm_worker_module>
          StartServers          2
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadsPerChild      25
          MaxRequestWorkers    150   # = 进程数 * ThreadsPerChild
          MaxConnectionsPerChild 0
      </IfModule>
      
    • event(高并发与长连接首选)
      <IfModule mpm_event_module>
          StartServers          2
          MinSpareThreads      25
          MaxSpareThreads      75
          ThreadsPerChild      25
          MaxRequestWorkers    150
          MaxConnectionsPerChild 0
          EnableSendfile On
          EnableMMAP On
      </IfModule>
      
  • 计算 MaxRequestWorkers 的起点(避免 OOM):
    • 估算每个 Apache 进程/线程平均内存(MB):ps aux | grep -v grep | awk '/httpd|apache2/{sum+=$6;n++} END{print sum/n}'
    • 粗略上限:MaxRequestWorkers ≈ 可用内存(GB) * 1024 / 单进程内存(MB);再结合压测逐步上调,确保峰值期 可用内存 > 工作集

三、减少传输与 I/O 开销

  • 启用压缩(mod_deflate):
    <IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json
        DeflateCompressionLevel 6
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    </IfModule>
    
  • 启用浏览器缓存(mod_expires):
    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresByType text/css "access plus 1 month"
        ExpiresByType application/javascript "access plus 1 month"
        ExpiresByType image/jpeg "access plus 1 year"
        ExpiresByType image/png "access plus 1 year"
        ExpiresByType image/gif "access plus 1 year"
    </IfModule>
    
  • 启用静态资源缓存(mod_cache_disk,可选):
    <IfModule mod_cache.c>
      <IfModule mod_cache_disk.c>
          CacheRoot /var/cache/apache2/mod_cache_disk
          CacheEnable disk /
          CacheDirLevels 2
          CacheDirLength 1
      </IfModule>
    </IfModule>
    
  • 启用高效传输:EnableSendfile OnEnableMMAP On(减少用户态/内核态拷贝与上下文切换)。

四、系统与内核层优化

  • 提升文件描述符限制(允许更多并发连接与文件句柄):
    • sudo sysctl -w fs.file-max=100000 并写入 /etc/sysctl.conf 持久化;同时调整进程级 limits(如 systemd 服务 LimitNOFILE)。
  • 可选的网络与内核参数(按业务与内核版本谨慎调整):
    • net.ipv4.tcp_fin_timeoutnet.ipv4.tcp_max_syn_backlog 等,配合压测逐步验证。

五、监控、验证与回滚

  • 模块与状态页:启用 mod_status,访问 http://your_server_ip/server-status 观察 Busy/Idle workers、Scoreboard 等指标;按需调整 MPM 与超时。
  • 系统监控:使用 htopapachetopnetstat -s 等观察 CPU、内存、连接队列、带宽;出现 MaxRequestWorkers 不足队列堆积 时,优先上调 MPM 或缩短 KeepAliveTimeout,其次再考虑硬件与架构扩展。
  • 变更流程:每次只调整少量参数→灰度/低峰窗口→压测(如 wrk/ab/ghz)→观察 5~15 分钟→记录基线→必要时回滚。

0