我有一台生产服务器,在过去 24 小时内由于冻结而硬重启了 4 次。Ping 正常,但所有其他服务都超时(Apache、SSHd 等)。我现在诊断出这是由于启动 Apache 几秒钟内突然分叉了大量子进程导致 Apache 内存不足。重启后立即停止 Apache 可使服务器再次保持稳定。
我有两个问题:
有没有办法检测哪个虚拟主机突然受到攻击,而不用逐个查看每个虚拟主机的访问日志?
有没有办法可以快速启用/禁用 vhosts,而不用在 httpd.conf 中将它们全部注释掉(#)?
一些系统细节:
Fedora 10,x86_64,PHP 5,Apache 2.2
答案1
尝试使用以下方式设置状态页面mod_status。如果您在启动服务器后可以进入,则应该会看到一个页面像这样它显示每个连接及其对应的虚拟主机和 URL。
如果您的网站被严重淹没以致您无法进入,请尝试运行netstat -nt | grep :80
或lsof -ni tcp:80
查看是否有一两个地址淹没了您的网站,并相应地应用 iptables。
答案2
1)我经常使用lsof查看 apache 在高负载时打开了哪些文件/目录。例如(在 debian/ubuntu 上),您可以运行:
lsof -u www-data
然后为了获得更有用的东西,只在正确的位置(例如/home)搜索打开的文件,然后排除应该始终打开的日志文件。
lsof -u www-data | grep /home | grep -v *.log
您可能需要运行几次才能了解经常运行的内容。
2)如果你运行的是 debian/ubuntu,你可以使用a2ensite和a2分散体从你的 apache 设置中自动添加和删除 vhosts。