温馨提示×

CentOS Apache连接数限制

小樊
43
2025-12-17 13:11:02
栏目: 智能运维

CentOS 下 Apache 连接数限制与优化

一 核心概念与生效位置

  • Apache 的连接处理能力由 MPM(多处理模块) 决定,常见有 prefork、worker、event。不同 MPM 的可调参数不同,但都围绕“进程/线程数量、空闲进程/线程、最大客户端连接”等展开。
  • 配置路径通常为 /etc/httpd/conf/httpd.conf,MPM 参数段一般位于 /etc/httpd/conf/extra/httpd-mpm.conf(或主配置中对应的 IfModule 段)。修改后需重启 httpd 生效:systemctl restart httpd
  • 术语变化:在 Apache 2.4+ 中,prefork 的 MaxClients 更名为 MaxRequestWorkers(很多发行版仍兼容旧名),其他 MPM 也有相应命名调整,建议以实际运行的 Apache 版本为准。

二 调整最大连接数的做法

  • 步骤
    1. 确认 MPM:执行 httpd -l,输出中包含 mpm_prefork.c / mpm_worker.c / mpm_event.c 其一即为当前模块。
    2. 编辑配置:在 httpd.conf 中确保包含 MPM 配置文件(如 Include conf/extra/httpd-mpm.conf),然后在对应 IfModule 段内调整参数。
    3. 重启服务:systemctl restart httpd
    4. 验证:观察日志与监控指标,确认新连接数上限已生效且无异常报错。
  • 关键参数与示例(按 MPM)
    • prefork(进程模型,最通用)
      • 关键指令:StartServers、MinSpareServers、MaxSpareServers、MaxRequestWorkers(2.4+)/MaxClients(≤2.2)、MaxRequestsPerChild、ServerLimit
      • 示例(适度提升并发,需结合内存评估):
        <IfModule mpm_prefork_module>
            StartServers          5
            MinSpareServers       5
            MaxSpareServers      10
            ServerLimit         1000
            MaxRequestWorkers   500
            MaxRequestsPerChild 10000
        </IfModule>
        
      • 要点:增大 MaxRequestWorkers 通常需要同步增大 ServerLimit;prefork 下每个进程大致占用若干 MB 内存,设置过高会导致内存耗尽。
    • worker/event(线程/事件模型,高并发更友好)
      • 关键指令:StartServers、MinSpareThreads、MaxSpareThreads、ThreadsPerChild、ThreadLimit、MaxRequestWorkers(总并发线程数)
      • 关系与示例:最大并发 ≈ ThreadsPerChild × 子进程数;例如:
        <IfModule mpm_event_module>
            StartServers          2
            MinSpareThreads      25
            MaxSpareThreads      75
            ThreadsPerChild      50
            ThreadLimit          64
            MaxRequestWorkers   300
            MaxConnectionsPerChild 0
        </IfModule>
        
      • 要点:优先调整 ThreadsPerChild 与子进程相关参数,使 MaxRequestWorkers 与服务器 CPU/内存 匹配。

三 按 IP 或目录进行并发连接数限制

  • 使用第三方模块 mod_limitipconn 可按 IP目录/文件类型 限制并发连接数(适合下载类、爬虫等场景)。
  • 安装与启用(示例)
    1. 编译安装模块(以 mod_limitipconn-0.24 为例):
      wget http://dominia.org/djao/limit/mod_limitipconn-0.24.tar.bz2
      tar jxvf mod_limitipconn-0.24.tar.bz2
      cd mod_limitipconn-0.24
      make && make install    # 或 /usr/local/apache2/bin/apxs -c -i mod_limitipconn.c
      
    2. 在 httpd.conf 中加载模块并配置:
      LoadModule limitipconn_module modules/mod_limitipconn.so
      ExtendedStatus On
      
      <Location />
          MaxConnPerIP 6
          NoIPLimit image/*
      </Location>
      
      <Location /mp3>
          MaxConnPerIP 1
      </Location>
      
    3. 说明:MaxConnPerIP 限制每 IP 并发连接;NoIPLimit 可排除特定资源(如图片)不受限制。按虚拟主机限制时,将对应 IfModule 段放入 VirtualHost 配置中。

四 相关网络与内核参数建议

  • 合理设置 KeepAlive 可降低握手开销:
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5
    
  • 适度调整 Timeout(默认常见为 300 秒,过长会占用连接资源):
    Timeout 60
    
  • 系统层面关注 文件描述符限制(ulimit -n)、端口范围内核网络参数(如 somaxconn、tcp_tw_reuse 等),避免成为连接瓶颈。

五 监控与验证

  • 配置生效与压力测试
    • 重启后在 httpd.conf 中开启状态页(示例):
      LoadModule status_module modules/mod_status.so
      ExtendedStatus On
      <Location /server-status>
          SetHandler server-status
          Require local
      </Location>
      
      访问 http://服务器IP/server-status?auto 查看当前连接与状态。
    • 使用 ab 进行基准测试(示例):
      ab -n 10000 -c 200 http://你的站点/
      
  • 运行时观测
    • 进程/连接数:ps -ef | grep httpd | wc -lnetstat -an | grep :80 | wc -lnetstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    • 资源监控:top/htopsar -n DEV 1 等,结合业务峰值与错误日志综合评估是否需要继续调优。

0