我们将其中一个网站移至新服务器,该服务器偶尔会完全挂起。起初这种情况很少发生,可能每月一次,但现在每天都会发生。所谓挂起,是指所有请求都超时,在 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
尽管这是一篇旧帖子,但在搜索时仍列在第一位。
通常原因是恶意机器人。您可以采取以下措施:
robots.txt
在根目录中设置一个(通常/var/www/html/
)。您可以使用在线生成器。安装并设置
fail2ban
。cat /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
安装并设置
ufw
(sudo ufw app list
,ufw allow "Apache Full"
)添加 Apache mod_status(通常已经安装,您只需配置
/etc/apache2/mods-enabled/status.conf
和调整,Require ip
然后转到主机/服务器状态)
另请检查这。