温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Apache如何处理高并发

发布时间:2025-12-10 03:28:24 来源:亿速云 阅读:138 作者:小樊 栏目:系统运维

Apache高并发处理的核心思路

Apache通过多路处理模块(MPM)管理进程与线程,结合连接复用、压缩缓存、系统资源与反向代理等手段来提升并发能力。自Apache 2.4起,官方默认使用event MPM,它在worker的多线程基础上引入事件驱动,更适合长连接与高并发场景;prefork为每请求一进程,稳定但内存开销大;worker为混合进程+线程,资源更省但需关注线程安全。

关键配置与示例

  • 选择并配置MPM(建议优先event)
    • event示例(/etc/httpd/conf/httpd.conf 或 apache2.conf 的 IfModule mpm_event_module 段):
      LoadModule mpm_event_module modules/mod_mpm_event.so
      <IfModule mpm_event_module>
          StartServers             2
          MinSpareThreads         25
          MaxSpareThreads         75
          ThreadLimit             64
          ThreadsPerChild         25
          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>
      
    • prefork示例(非线程、兼容性最好):
      <IfModule mpm_prefork_module>
          StartServers             5
          MinSpareServers          5
          MaxSpareServers         10
          MaxRequestWorkers      150
          MaxConnectionsPerChild   0
      </IfModule>
      
  • 启用长连接与压缩缓存
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5
    
    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 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>
    
  • 操作系统与网络栈
    • 提升文件描述符限制(/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 = 65535
      net.ipv4.tcp_tw_reuse = 1
      net.ipv4.tcp_fin_timeout = 30
      
  • 反向代理与负载均衡(以Nginx为例)
    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

以上配置要点与示例适用于CentOS/RHELUbuntu等常见发行版,路径与模块名可能略有差异。

容量估算与参数边界

  • 线程型MPM(worker/event)的关键关系与约束:
    • MaxRequestWorkers = ServerLimit × ThreadsPerChild
    • ThreadLimit ≥ ThreadsPerChild
    • 通常将ServerLimit ≈ MaxRequestWorkers / ThreadsPerChild
    • 官方文档指出ThreadLimit 默认 64,可调高但受内核与内存限制;部分版本支持上限至20000(以实际发行版与编译参数为准)。
  • 内存法估算进程/线程上限(避免OOM):
    • 先测算单进程/线程平均内存:例如 ps aux | grep -v grep | awk '/httpd/{sum+=$6;n++};END{print sum/n}'
    • 近似上界:MaxRequestWorkers < (可用物理内存 / 单进程内存) × 安全系数(如1.5~2)
  • 何时考虑横向扩展:单机并发、连接数、CPU/内存均达瓶颈时,引入Nginx/HAProxy做反向代理与多实例负载均衡

监控与压测

  • 资源与日志:使用top/htop观察CPU/内存,/var/log/httpd/error_logaccess_log定位错误与慢请求。
  • 压力测试:使用ab(Apache Bench)JMetersiege进行并发基线测试与回归,配合监控数据逐步调参。

常见陷阱与优化建议

  • 长连接配合event:在长连接占比较高时,event MPM能显著减少线程占用,提升并发稳定性;若使用prefork/worker,长连接可能长时间占用进程/线程,需合理设置KeepAliveTimeoutMaxRequestWorkers
  • 线程安全:使用worker/event时,确保模块与业务代码线程安全;若依赖不兼容线程的模块,可继续使用prefork
  • 逐步调参与压测:避免一次性把MaxRequestWorkers/ThreadsPerChild调到过大,按“监控→压测→微调”的闭环迭代;同时配合压缩、缓存、静态资源分离反向代理,效果更稳健。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI