Apache 分叉大量线程,并挂起

Apache 分叉大量线程,并挂起

我们将其中一个网站移至新服务器,该服务器偶尔会完全挂起。起初这种情况很少发生,可能每月一次,但现在每天都会发生。所谓挂起,是指所有请求都超时,在 shell 中尝试 apache2ctl status 或 apache2ctl graceful 会导致 apache2ctl 无限期等待。只有发出 apache2ctl restart 才能使其脱离此状态。我似乎无法在 apache 错误日志中找到任何内容,访问日志表明 apache 确实没有处理请求。

目前,该服务器主要服务于单个站点,即类似 rapidshare 的文件共享门户,提供约 1TB 的数据。它运行的是 ubuntu lucid,拥有 8GB 内存和四核英特尔至强 CPU,以及 apache-mpm-itk 和 PHP 5.2.11。

它上面运行着 munin,当 apache 挂起时,它显示线程数非常高(650+)。通常线程数约为 200,大约 1 小时后会达到 650。此时运行 ps 会发现,确实是 apache 有很多子进程在运行。CPU 负载/内存使用率似乎不是问题,目前它只使用了 1.1GB 的 RAM,负载为 0.05。

有人告诉我 Lighttpd 或 nginx 是此类网站更好的解决方案。我愿意更换,但我更愿意尝试使用此设置。(旧服务器也在运行 apache)

mpm-itk 是不是一个坏主意?我选择它主要是因为它可以让每个虚拟主机在不同的用户下运行,这样更安全。它运行在从包管理器中提取的默认配置上,我知道这很糟糕,但我不确定我应该调整哪些值。

我正在发布一些可能相关的价值观,如有需要,请询问其他信息:

Timeout 300
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule mpm_prefork_module>
    StartServers          5   
    MinSpareServers       5   
    MaxSpareServers      10  
    MaxClients          150 
    MaxRequestsPerChild   0   
</IfModule>

那么,我应该查看哪些值?我应该从日志中 grep 什么特殊内容吗?

答案1

如果你不需要 mpm-itk 提供的额外安全性,请使用 mpm-worker,因为它更轻的比其他的都多。可以想象,每个虚拟主机最终都在其自己的进程中运行,这将占用更多的内存。

答案2

尽管这是一篇旧帖子,但在搜索时仍列在第一位。

通常原因是恶意机器人。您可以采取以下措施:

  1. robots.txt在根目录中设置一个(通常/var/www/html/)。您可以使用在线生成器

  2. 安装并设置fail2bancat /etc/fail2ban/jail.local应该会有一些 apache-jails,比如

    [apache-badbots]
    enabled = true
    port     = http,https
    filter = apache-badbots
    logpath  = %(apache_access_log)s
    bantime  = 48h
    maxretry = 1
    
  3. 安装并设置ufwsudo ufw app listufw allow "Apache Full"

  4. 添加 Apache mod_status(通常已经安装,您只需配置/etc/apache2/mods-enabled/status.conf和调整,Require ip然后转到主机/服务器状态)

另请检查

相关内容